Параграф 2: Що таке дерево і скільки їх має бути
Повторимо визначення зі введення.
Дерево пристрою - набір конфігураційних файлів (конфігів) різних форматів. У дереві прописуються різні шляхи, конфіги збірки, конфіги, що часто змінюються і копіюються в прошивку, вихідні тексти.
Зазвичай дерево лежить за шляхом device/vendor/devicecodename
, де vendor
- виробник, а devicecodename
- кодове ім'я пристрою. Наведемо приклад для Xiaomi Redmi Note 4X - device/xiaomi/mido
.
Але буває таке, що пристрої дико схожі за складовою дерева, і однакову частину просто переносять в окреме загальне дерево - common. Для прикладу розглянемо Asus ZenFone 2 Laser ZE500KL/KG і Asus ZenFone Max (Z010D).
Структура виходить така - у папці device/asus
лежать три дерева:
- Загальне: msm8916-common
- Специфічне: Z00xD (об'єднане дерево для Asus ZenFone 2 Laser ZE500KL і Asus ZenFone 2 Laser ZE500KG)
- Специфічне: Z010D
За підсумком, вся база лежить в msm8916-common, а специфіка лежить в специфічних деревах.
Посилання на проєкт з вихідними кодами, бранч lineage-16.0.
Але найсмішніше, що загальних дерев може бути ще більше!
Наведу приклад для Sony Xperia Z3 Compact:
device/sony/z3c
device/sony/shinano-common
device/sony/msm8974-common
device/sony/common
4 дерева, які одне за одним підключаються. Важливо не пропустити цю інформацію, інакше буде потім незрозуміло чому на етапі ініціалізації збірки сталася помилка.
Виникає все ж резонне запитання: чи не простіше все-таки все в одне дерево "запхати" і не паритися?
І я скажу Вам ні. На те є дві причини:
- Якщо інший пристрій, на який збирають прошивку, використовує загальні дерева, то скорочується кількість дій, які потрібно зробити для збірки (працює в тому разі, якщо збирають прошивку не з нуля);
- Багато часу і сил займає додавання одного комміта в цілу низку пристроїв, простіше один комміт в одне дерево, в результаті зміна буде у всіх пристроях, які використовують загальне дерево.
У підсумку, виходить тільки вигода. Схожу ситуацію ми побачимо в вендорі.