Страницы

Поиск по вопросам

суббота, 4 января 2020 г.

Как собрать произвольное приложение под Android без использовани gradle/ant/Android Studio

#java #gradle #javac #android


Я хочу собрать какое-то произвольное приложение, к примеру, найденное на Гитхабе:
https://github.com/heruoxin/Clip-Stack (само приложение у меня уже есть, потому не
надо мне слать ссылки на бинарные сборки)

Зачастую, в комплекте с приложением есть обертка для Gradle, иногда свойства проекта
от Eclipse, иногда ничего нет. Сам процесс, не смотря на кажущуюся простоту, достаточно
сложен: надо выкачать SDK/NDK (теперь прямых ссылок на них не дают, но об этом позже),
настроить переменные окружения и запустить ./gradlew, а после выкачивания 200-300 мегабайт
зависимостей, очень часто вылезает какая-то ошибка (к примеру о том, что нужна проприетарная
Java 8). И даже если ошибки нет, сборка может сожрать 2-3 гигабайта памяти, весь своп
и затем упасть, ссылаясь на недостаток памяти (ведь нынче все богатые и девелопят исключительно
на макбуках последнего поколения, причем все торопятся - потому все это собирается
в 10 потоков, отжирая в 10 раз больше памяти). Кроме того, такой подход не дает возможности
скомпилировать приложение на изолированной от сети машине: Android Studio Gradle без
подключения к интернет

Вопрос: как собрать приложение без использования толстых сборщиков?

Пожалуй основная проблема происходит из-за сложности разруливания зависимостей. Например,
для сборки приложения выше, мне понадобились: 

support-fragment-25.2.0.aar
support-compat-25.2.0.aar
support-annotations-25.2.0.jar
support-core-utils-25.2.0.aar
support-core-ui-25.2.0.aar
appcompat-v7-22.2.1.aar
recyclerview-v7-25.2.0.aar
cardview-v7-25.2.0.aar


Но быстро выяснилось, что в 25-й версии что-то было изменено и она не подходит, скомпилированное
приложение просто падает. Я выкачал множество версий aar-пакетов и самодельными скриптами
проиндексировал их, создавая самодельную базу символов, но столкнулся с проблемой,
что в какой-то версии нет нужной фичи, а через пару версий этой фичи (или другой) уже
нет. Кроме того, не очень понятно, где и как брать официальные бинарники, без проприетарного
SDK Manager. В общем, я сдался.

Анализ поведения Gradle показал, что javac+dx не используются вообще, а aapt используется
только для обработки картинок.

Если кто-то имеет возможность/хочет написать легковестную IDE или хотя бы скрипт
для сборки приложений, то с радостью присоединюсь к проекту.

Ссылки:


https://developer.android.com/studio/build/building-cmdline.html - официальная инструкция
ведет меня к ненавистному мной Gradle
https://stackoverflow.com/questions/41132753/ - здесь кратко описывается процесс
сборки через javac+dx+aapt, дополнительный блеск  от jarsigner+zipalign. Это работает
(проверял лично), однако, тут не описано как именно это сделать (впрочем, если почитать
мануалы, то становится понятно), равно как не описано, как разруливать зависимости,
что делать с ресурсами и т.д., а кроме того, как установить пакеты из SDK. 
https://metacpan.org/pod/Android::Build - ссылка уже не рабочая, но в архивах можно
найти замечательный скрипт, который мог собрать простенькие приложения под Android


В вопрос призывается Lex Hobbit из Как создать модульное android приложение
    


Ответы

Ответ 1



Как уже написали в комментарии к вопросу - сборка и "жизнь" без Android Studio - очень непроста. Но раз условия диктуют необходимость жить без нее, то будем адаптироваться. Предварительная подготовка среды сборки Java JDK Android SDK (в самом низу страницы в разделе "Get just the command line tools") Настройка переменных среды JAVA_BIN путь до bin папки Java JDK ANDROID_SDK путь до папки с Android SDK Приватный ключ для подписи APK файла (назовем его release_key.keystore) keytool -genkey -v -keystore release_key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000 Написать код приложения и проверить правильность структуры приложения Пошаговый алгоритм сборки Пошаговый алгоритм сборки Android приложения без использования gradle / ant / Android Studio (предполагается, что весь исходный код, включая AndroidManifest.xml, ресурсы, необходимые библиотеки у нас уже есть): Создаем R.java, PK файл из ассетов, ресурсов и AndroidManifest.xml и получаем MyApplication.apk.unaligned используя используя aapt package Компилируем java исходники в *.class исполльзуя для этого javac Создаем исполняемый файл classes.dex из *.class используя dx Добавляем в MyApplication.apk.unaligned файл classes.dex используя aapt add Подписываем MyApplication.apk.unaligned с дебажным или релизным ключем Выравниваем наш APK используя zipalign и вуаля! Создание .aar библиотеки Алгоритм создания библиотеки .aar схож с алгоритмом создания APK файла. в п.1 вместо R.java создаем R.txt используя aapt с опцией --output-text-symbols и название архива с расширением *.aar в п.3 вместо classes.dex создаем classes.jar используя jar cvf classes.jar *.class в п.4 добавляем classes.jar в архива с расширением *.aar и на этом все, наша отдельная AAR библиотека создана P/S чуть позже поправлю и можно написать скриптик для сборки. И кажется, как бы все было проще, если бы всеже перешли к Jack&Jill, но как сообщают разработчики - они осознали, во что это им обойдется. Ниже приведен процесс сборки APK с использованием тулчейна Jack.

Ответ 2



Можно собрать под Intellij IDEA без Gradle. Еще пару лет назад я практиковал такое... Врукопашную собираешь все jar/aar вручную прокидываешь зависимости и вперед. Есть фанаты сборки Android под maven, ах ну да - это же толстый сборщик :) Был опыт сборки под Ant - не знаю насколько он толст для ТС... В любом случае, полностью присоединяюсь к @pavlofff: всем сердцем полюбить Gradle в кратчайшие сроки, либо купить много валерьянки с глицином, потому что современная сборка APK без помощи Android Studio способна "добить" любого

Комментариев нет:

Отправить комментарий