Jack — это стандартный набор инструментов для сборки Android 6.0–8.1.
Jack — это набор инструментов для Android, который компилирует исходный код Java в байт-код Android DEX. Для использования Jack не требуется никаких дополнительных действий — просто используйте стандартные команды makefile для компиляции дерева или вашего проекта. Android 8.1 — последний релиз, использующий Jack.
О Джеке
Джек работает, как показано на рисунке 1.

Рисунок 1. Общий вид домкрата.
Формат библиотеки Джека
Jack имеет собственный формат файла .jack , который содержит предварительно скомпилированный код dex для библиотеки, что позволяет ускорить компиляцию (pre-dex).

Рисунок 2. Содержимое файла библиотеки Джека.
Джилл
Как показано на следующем рисунке, инструмент Jill переводит существующие библиотеки .jar в новый формат библиотеки.

Рисунок 3. Рабочий процесс импорта существующей библиотеки .jar .
Сервер компиляции Джека
При первом использовании Jack на вашем компьютере запускается локальный сервер компиляции Jack. Этот сервер:
- Обеспечивает внутреннее ускорение, поскольку исключает запуск новой хостовой JRE JVM, загрузку кода Jack, инициализацию Jack и разогрев JIT при каждой компиляции. Кроме того, обеспечивается очень хорошее время компиляции при небольших объемах (например, в инкрементальном режиме).
- Это краткосрочное решение для контроля количества параллельных компиляций Jack. Сервер предотвращает перегрузку компьютера (проблемы с памятью или диском), ограничивая количество параллельных компиляций.
Сервер Jack автоматически завершает работу после простоя без компиляции. Он использует два TCP-порта на интерфейсе localhost и недоступен извне. Все параметры (количество параллельных компиляций, тайм-аут, количество портов и т. д.) можно изменить, отредактировав файл $HOME/.jack .
Файл $HOME/.jack
Файл $HOME/.jack содержит следующие настройки для переменных сервера Jack в полном синтаксисе bash:
-
SERVER=trueвключает серверную функцию Джека. -
SERVER_PORT_SERVICE=8072задает номер порта TCP сервера для целей компиляции. -
SERVER_PORT_ADMIN=8073задает номер TCP-порта сервера для целей администрирования. -
SERVER_COUNT=1не используется. -
SERVER_NB_COMPILE=4задаёт максимальное количество разрешённых параллельных компиляций.SERVER_TIMEOUT=60задаёт количество секунд простоя, в течение которых сервер не будет выполнять компиляцию, прежде чем завершить работу.SERVER_LOG=${SERVER_LOG:=$SERVER_DIR/jack-$SERVER_PORT_SERVICE.log}задаёт файл, в который записываются журналы сервера. По умолчанию эта переменная может быть переопределена переменной окружения. -
JACK_VM_COMMAND=${JACK_VM_COMMAND:=java}задаёт команду по умолчанию для запуска JVM на хосте. По умолчанию эта переменная может быть перегружена переменной окружения.
Устранение неполадок при компиляции Джека
| Проблема | Действие |
|---|---|
| Ваш компьютер перестает отвечать во время компиляции или вы сталкиваетесь с ошибкой компиляции Jack из-за нехватки памяти. | Уменьшите количество одновременных компиляций Jack, отредактировав $HOME/.jack и изменив SERVER_NB_COMPILE на меньшее значение. |
| Компиляции завершаются с ошибкой «Невозможно запустить фоновый сервер» | Наиболее вероятная причина — TCP-порты уже используются на вашем компьютере. Измените порты, отредактировав файл $HOME/.jack (переменные SERVER_PORT_SERVICE и SERVER_PORT_ADMIN ). Чтобы разблокировать ситуацию, отключите сервер компиляции Jack, отредактировав файл $HOME/.jack и изменив SERVER на false . К сожалению, это значительно замедляет компиляцию и может потребовать запуска make -j с управлением загрузкой (опция -l команды make ). |
| Компиляция зависает без какого-либо прогресса | Чтобы разблокировать ситуацию, остановите фоновый сервер Jack с помощью jack-admin kill-server ), а затем удалите временные каталоги, содержащиеся в jack-$USER вашего временного каталога ( /tmp или $TMPDIR ). |
Найдите бревно Джека
Если вы выполнили команду make с целью dist, журнал Jack находится по адресу $ANDROID_BUILD_TOP/out/dist/logs/jack-server.log . В противном случае вы можете найти журнал, выполнив команду jack-admin server-log . В случае воспроизводимых сбоев Jack вы можете получить более подробный журнал, установив следующую переменную:
export ANDROID_JACK_EXTRA_ARGS="--verbose debug --sanity-checks on -D sched.runner=single-threaded"
Используйте стандартные команды makefile для компиляции дерева (или вашего проекта) и добавления стандартного вывода и сообщений об ошибках. Чтобы просмотреть подробные журналы сборки, выполните:
unset ANDROID_JACK_EXTRA_ARGS
Ограничения Джека
По умолчанию сервер Jack может использоваться только одним пользователем на компьютере. Для поддержки дополнительных пользователей выберите разные номера портов для каждого пользователя и соответствующим образом настройте SERVER_NB_COMPILE . Вы также можете отключить сервер Jack, установив SERVER=false в $HOME/.jack . Компиляция CTS выполняется медленно из-за текущей интеграции vm-tests-tf . Инструменты для работы с байт-кодом (например, JaCoCo) не поддерживаются.
Использовать Джека
Джек поддерживает язык программирования Java 1.7 и интегрирует дополнительные функции, описанные ниже.
Pre-dex
При создании файла библиотеки Jack генерируется .dex библиотеки, который сохраняется в файле библиотеки .jack в качестве предекса. При компиляции Jack повторно использует предекс из каждой библиотеки. Все библиотеки имеют предекс.

Рисунок 4. Библиотеки Jack с pre-dex.
Джек не использует повторно предекс библиотеки, если при компиляции применяется сжатие, обфускация или переупаковка.
Инкрементная компиляция
Инкрементальная компиляция означает, что перекомпилируются только компоненты, затронутые с момента последней компиляции (и их зависимости). Инкрементальная компиляция может быть значительно быстрее полной, если изменения касаются только набора компонентов.
Инкрементальная компиляция отключена по умолчанию (и автоматически отключается при включении сжатия, обфускации, переупаковки или использования multi-dex legacy). Чтобы включить инкрементальную сборку, добавьте следующую строку в файл Android.mk проекта, который вы хотите собрать инкрементально:
LOCAL_JACK_ENABLED := incremental
Сжатие и запутывание
Джек использует файлы конфигурации ProGuard для обеспечения сжатия и обфускации.
Распространенные варианты включают следующее:
-
@ -
-include -
-basedirectory -
-injars -
-outjars(поддерживается только 1 выходной jar-файл) -
-libraryjars -
-keep -
-keepclassmembers -
-keepclasseswithmembers -
-keepnames -
-keepclassmembernames -
-keepclasseswithmembernames -
-printseeds
Возможны следующие варианты сжатия:
-
-dontshrink
Варианты запутывания включают в себя следующее:
-
-dontobfuscate -
-printmapping -
-applymapping -
-obfuscationdictionary -
-classobfuscationdictionary -
-packageobfuscationdictionary -
-useuniqueclassmembernames -
-dontusemixedcaseclassnames -
-keeppackagenames -
-flattenpackagehierarchy -
-repackageclasses -
-keepattributes -
-adaptclassstrings
К игнорируемым вариантам относятся следующие:
-
-dontoptimize(Джек не оптимизирует) -
-dontpreverify(Джек не выполняет предварительную проверку) -
-skipnonpubliclibraryclasses -
-dontskipnonpubliclibraryclasses -
-dontskipnonpubliclibraryclassmembers -
-keepdirectories -
-target -
-forceprocessing -
-printusage -
-whyareyoukeeping -
-optimizations -
-optimizationpasses -
-assumenosideeffects -
-allowaccessmodification -
-mergeinterfacesaggressively -
-overloadaggressively -
-microedition -
-verbose -
-dontnote -
-dontwarn -
-ignorewarnings -
-printconfiguration -
-dump
Переупаковка
Jack использует файлы конфигурации jarjar для переупаковки. Хотя Jack совместим с правилами типа «rule», он несовместим с правилами типа «zap» и «keep».
Поддержка мультидекса
Jack предлагает встроенную и устаревшую поддержку multidex. Поскольку файлы dex ограничены 65 000 методами, приложения с более чем 65 000 методами должны быть разделены на несколько файлов dex. Подробнее см. в разделе «Включение multidex для приложений с более чем 64 000 методами».