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

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

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

Рисунок 3. Схема процесса импорта существующей библиотеки в .jar .
сервер компиляции Jack
При первом использовании Jack на вашем компьютере запускается локальный сервер компиляции Jack. Этот сервер:
- Обеспечивает существенное ускорение, поскольку позволяет избежать запуска новой JVM хост-системы JRE, загрузки кода Jack, инициализации Jack и предварительной настройки JIT-компилятора при каждой компиляции. Также обеспечивает очень хорошее время компиляции при небольших объемах данных (например, в инкрементальном режиме).
- Это краткосрочное решение для контроля количества параллельных компиляций Jack. Сервер предотвращает перегрузку вашего компьютера (проблемы с памятью или диском), поскольку ограничивает количество параллельных компиляций.
Сервер Jack завершает свою работу после периода простоя без какой-либо компиляции. Он использует два TCP-порта на интерфейсе localhost и недоступен извне. Все параметры (количество параллельных компиляций, таймаут, количество портов и т. д.) можно изменить, отредактировав файл $HOME/.jack .
$HOME/.jack файл
Файл $HOME/.jack содержит следующие настройки переменных сервера Jack в полном синтаксисе bash:
-
SERVER=trueвключает серверную функцию Jack. -
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 завершается с ошибкой "Недостаточно памяти". | Чтобы уменьшить количество одновременных компиляций 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) не поддерживаются.
Используйте Джека
Jack поддерживает язык программирования Java версии 1.7 и интегрирует дополнительные функции, описанные ниже.
Предекс
При создании файла библиотеки Jack, файл .dex библиотеки генерируется и сохраняется внутри файла библиотеки .jack в виде файла predex. При компиляции Jack повторно использует файл predex из каждой библиотеки. Все библиотеки имеют файл predex.

Рисунок 4. Библиотеки Jack с предексом.
Jack не использует повторно пре-декс библиотеки, если при компиляции применяются уменьшение размера, обфускация или переупаковка.
Пошаговая компиляция
Инкрементальная компиляция означает, что перекомпилируются только те компоненты, которые были изменены с момента последней компиляции (и их зависимости). Инкрементальная компиляция может быть значительно быстрее полной компиляции, если изменения ограничены определенным набором компонентов.
Инкрементальная компиляция отключена по умолчанию (и автоматически деактивируется при включении сжатия, обфускации, переупаковки или поддержки устаревших файлов multi-dex). Чтобы включить инкрементальную сборку, добавьте следующую строку в файл 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".
Поддержка Multidex
Jack предлагает встроенную и устаревшую поддержку multidex. Поскольку dex-файлы ограничены 65 000 методами, приложения с более чем 65 000 методами должны быть разделены на несколько dex-файлов. Для получения более подробной информации см. раздел « Включение multidex для приложений с более чем 64 000 методами».