Jack (Java Android Compiler Kit) – это компилятор, преобразующий исходный код на Java в DEX-файлы Android. Jack – это набор инструментов, среди его возможностей – переупаковка, сжатие, обфускация и поддержка множественных DEX-файлов.
В Jack используются промежуточные библиотеки в формате .jack. Преобразованием существующих .aar/.jar файлов в этот формат занимается Jill (Jack Intermediate Library Linker).
Если для сборки используется Jack, то сначала Jill конвертирует внешние библиотеки, используемые в проекте, в .jack-файлы. Это подготавливает библиотеки к быстрому слиянию с другими .jack-файлами на следующем этапе, когда Jack и плагин Android Gradle, используя подготовленные ранее.jack-файлы и исходный Java-код, компилируют DEX-файл (или файлы). В ходе этого процесса Jack может выполнить минификацию кода (сжатие, обфускацию, или и то и другое вместе). На выходе получается APK-файл Android-приложения.
Процесс сборки приложения с использованием Jack и Jill
Jack и Jill доступны в Build Tools для Android Studio начиная с версии 21.1.1. Плагин Android Gradle поддерживает эти инструменты, начиная с версии 1.0.0. Для того чтобы задействовать возможности Jack, достаточно добавить в файл build.gradle команду useJack=true.
Android SDK Manager
Использование командной строки
Узнать подробности о работе с Jack и Jill можно с помощью команд, приведённых ниже. Здесь мы пользуемся стандартным интерфейсом командной строки Windows, библиотеками Jack и Jill, включёнными в состав Android Build Tools версии 23.0.2.
Некоторые возможности этих инструментов могут быть доступны из командной строки раньше, чем их поддержка будет включена в плагин Android Gradle.
Итак, вот команда для получения справки по Jack:
java –jar <Android SDK>/build-tools/< Build Tools version>/jack.jar ––help
Её выполнение даёт нам следующее:
Справка по Jack
А вот так можно поближе познакомиться с Jill:
java –jar <Android SDK>/build-tools/< Build Tools version>/jill.jar ––help
Справка по Jill
Некоторые особенности Jack
Прежде чем приступать к работе с Jack, стоит учесть, что он поддерживает язык программирования Java 1.7. и не поддерживает обработку аннотаций.
При использовании Jack, ему можно передавать конфигурационные файлы Proguard с помощью параметра командной строки ––config-proguard. Если говорить о переупаковке, то Jack совместим с правилами типа «rule», но не с правилами типа «zap» или «keep». Файлы правил можно указывать в командной строке с использованием параметра –– config-jarjar.
Поддержка Jack плагином Android Gradle всё ещё в процессе разработки, поэтому стоит учесть следующие особенности и ограничения:
- Директива обфускации –applymapping ещё не поддерживается.
- Возможность переупаковки (вроде инструмента jarjar) пока не интегрирована.
- Средство Jacoco не поддерживается.
- Манипуляции с байт-кодом не поддерживаются.
- В некоторых случаях, при сборке очень больших приложений, можно столкнуться с исключением Out Of Memory. Справиться с проблемой можно, если настроить систему сборки на использование, как минимум, 2 Гб оперативной памяти:
dexOptions { javaMaxHeapSize "2048M" }
Попробуем Jack в деле.
Работа с Jack
Для начала нам понадобится какой-нибудь проект приложения для экспериментов. Например, импортируем из каталога примеров проект Hello JNI. Для этого выполним в Android Studio команду File > New > Import Sample. В появившемся окне найдём проект Hello JNI, и, выделив его название, нажмём на кнопку Next.
Проект Hello JNI для импорта
В следующем окне имя приложения (поле Application name) и путь к новому проекту (Project location) менять не будем, и, для завершения импорта, нажмём на кнопку Finish.
Если в ходе импорта появится сообщение о том, что системе не удаётся найти NDK (Android NDK Location is not specified), исправьте это, щёлкнув по ссылке Select NDK и указав в открывшемся окне путь к NDK. Этот путь будет записан в файл local.properties в виде ndk.dir=<path_to_ndk>.
После успешного импорта проекта найдём в режиме просмотра Project, в папке app, файл build.gradle и добавим в defaultConfig.with команду включения jack (useJack = true):
android {
compileSdkVersion = 23
buildToolsVersion = "23.0.2"
defaultConfig.with {
applicationId = "com.example.hellojni"
minSdkVersion.apiLevel = 4
targetSdkVersion.apiLevel = 23
useJack = true
}
}
Теперь испытаем работу системы на планшете Asus Fonepad 8 (CPU Intel Atom Z3530, Android 5.0).
Тестовое приложение на x86-устройстве
Итоги
Каждый, кто занимался разработкой приложений, знает, что в этом деле на счету каждая секунда. Одна из важных особенностей Jack – это сокращение времени компиляции, а значит – повышение производительности труда. Кроме того, Jack по умолчанию используется в Android M. Пожалуй, только этих двух фактов достаточно для того, чтобы сделать Jack и Jill желанными гостями в доме любого программиста.
Автор: Intel