#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 способна "добить"
любого