[Перевод] Знакомьтесь: Jack и Jill на платформе x86

Jack (Java Android Compiler Kit) — это компилятор, преобразующий исходный код на Java в DEX-файлы Android. Jack — это набор инструментов, среди его возможностей — переупаковка, сжатие, обфускация и поддержка множественных DEX-файлов.

В Jack используются промежуточные библиотеки в формате .jack. Преобразованием существующих .aar/.jar файлов в этот формат занимается Jill (Jack Intermediate Library Linker).

b4e2a35db9e5274ea5471f26fd5afa11.jpg

Если для сборки используется Jack, то сначала Jill конвертирует внешние библиотеки, используемые в проекте, в .jack-файлы. Это подготавливает библиотеки к быстрому слиянию с другими .jack-файлами на следующем этапе, когда Jack и плагин Android Gradle, используя подготовленные ранее.jack-файлы и исходный Java-код, компилируют DEX-файл (или файлы). В ходе этого процесса Jack может выполнить минификацию кода (сжатие, обфускацию, или и то и другое вместе). На выходе получается APK-файл Android-приложения.

878d26e6b062f20aa9a9a98b80c4dfd7.gif


Процесс сборки приложения с использованием Jack и Jill

Jack и Jill доступны в Build Tools для Android Studio начиная с версии 21.1.1. Плагин Android Gradle поддерживает эти инструменты, начиная с версии 1.0.0. Для того чтобы задействовать возможности Jack, достаточно добавить в файл build.gradle команду useJack=true.

70679f882b8c1a4cd73991acf7f9ec0c.png


Android SDK Manager

Использование командной строки


Узнать подробности о работе с Jack и Jill можно с помощью команд, приведённых ниже. Здесь мы пользуемся стандартным интерфейсом командной строки Windows, библиотеками Jack и Jill, включёнными в состав Android Build Tools версии 23.0.2.
Некоторые возможности этих инструментов могут быть доступны из командной строки раньше, чем их поддержка будет включена в плагин Android Gradle.

Итак, вот команда для получения справки по Jack:

java –jar /build-tools/< Build Tools version>/jack.jar ––help


Её выполнение даёт нам следующее:

194b2e1de7c2b6a10bb23a236b96a410.png


Справка по Jack

А вот так можно поближе познакомиться с Jill:

java –jar /build-tools/< Build Tools version>/jill.jar ––help
7f85f2d02f3785880ce1b6f0c7df1198.png


Справка по 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.

06e900c65f42d40829be555226ed5454.png


Проект Hello JNI для импорта

В следующем окне имя приложения (поле Application name) и путь к новому проекту (Project location) менять не будем, и, для завершения импорта, нажмём на кнопку Finish.

Если в ходе импорта появится сообщение о том, что системе не удаётся найти NDK (Android NDK Location is not specified), исправьте это, щёлкнув по ссылке Select NDK и указав в открывшемся окне путь к NDK. Этот путь будет записан в файл local.properties в виде ndk.dir=.

После успешного импорта проекта найдём в режиме просмотра 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).

dbd5b52f11f835f96c6b959b10ed10a5.jpg


Тестовое приложение на x86-устройстве

Итоги


Каждый, кто занимался разработкой приложений, знает, что в этом деле на счету каждая секунда. Одна из важных особенностей Jack — это сокращение времени компиляции, а значит — повышение производительности труда. Кроме того, Jack по умолчанию используется в Android M. Пожалуй, только этих двух фактов достаточно для того, чтобы сделать Jack и Jill желанными гостями в доме любого программиста.

© Habrahabr.ru