Нещодавно я робив збірку apk в одному додатку, так що хочу розповісти, які є для цього рішення.
Процес складання Android-додатки
Для початку про сам процес збирання apk.
Коли ви запускаєте збірку, насамперед читається AndroidManifest.xml, в ньому є важливі параметри, такі як package (наприклад, com.example.app) і targetSdkVersion.
Потім викликається програма aapt (Android Asset Packaging Tool), якій передається AndroidManifest.xml, папка з ресурсами res /. assets /. шлях до android.jar потрібної target-версії. aapt перевіряє ресурси і компілює їх, створюючи при цьому клас R.java в якому містяться ідентифікатори ресурсів і файл resources.arsc в якому міститься інформація про xml-ресурсах і їх атрибутах.
Далі підхоплюються всі бібліотеки, які використовуються в проекті і запускається Java-компілятор javac. Отримані class-файли передаються в програму dx. яка переводить їх в Dalvik dex-формат. Причому для оптимізації, готові бібліотеки сується окремо, а класи проекту окремо (оптимізація в тому, що дексірованние бібліотеки можна закеширувати). Якщо зібралося кілька dex-файлів, то вони всі об'єднуються за допомогою Dex Merger Tool. В кінцевому підсумку ми отримуємо єдину файл classes.dex (або декілька, якщо використовується multidex).
Тепер у нас є всі компоненти і можна збирати apk. По суті це просто упаковка всіх файлів в zip-архів, але використовується спеціальна програма apkbuilder. Після її виконання отримуємо непідписаний apk-файл, тобто без папки META-INF всередині.
Останній етап - підпис apk. Береться заздалегідь згенерований ключ і передається в jarsigner разом з підписаним apk-файлом. На виході маємо готове додаток, яке можна встановлювати.
Збірка з Android-додатки
На щастя, Android досить потужна платформа, так що всі перераховані вище програми також перенести для неї.
Компілятор Java присутня в ECJ.
Останню версію dx можна зібрати з початкових кодів в офіційному репозиторії.
Apkbuilder йде як частина sdklib. але замість нього можна скористатися будь-бібліотекою для створення zip-архіву.
Нарешті, бібліотека для підпису apk - zip-signer.
Слід зауважити, що для повноцінного складання, нам знадобляться не тільки ці бібліотеки, але ще і android.jar останньої версії. У підсумку ми маємо 20 Мб залежностей, що в іншому, не так вже й багато. А той же android.jar і aapt можна скачати при першому запуску, що значно заощадить місце і трафік користувачам.
1. Запуск aapt в залежності від архітектури
Найбільше проблем з aapt, так як це не бібліотека, а виконується програма. Потрібно запускати сумісну версію, попередньо виставивши права на запуск.
private String getAaptBinaryName # 40; # 41; # 123;
final String architecture = Build. CPU_ABI. substring # 40; 0. 3 # 41 ;. toLowerCase # 40; Locale. US # 41; ;
final boolean usePie = Build. VERSION. SDK_INT> = Build. VERSION_CODES. JELLY_BEAN;
final String pieSuffix = usePie. "-pie". "";
switch # 40; architecture # 41; # 123;
case "mip". return "aapt-mips";
case "x86". return "aapt-x86" + pieSuffix;