Компиляция с помощью Jack для Android 6.0–8.1

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

О Джеке

Домкрат работает, как показано на рисунке 1.

Обзор Джека
Рис. 1. Обзор домкрата

Формат библиотеки Джека

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

Содержимое файла библиотеки Jack
Рисунок 2. Содержимое файла библиотеки Jack

Джилл

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

Импорт библиотек .jar с помощью Jill
Рисунок 3. Рабочий процесс для импорта существующей библиотеки .jar

Сервер компиляции Джека

При первом использовании Jack на вашем компьютере запускается локальный сервер компиляции Jack. Этот сервер:

  • Обеспечивает внутреннее ускорение, поскольку позволяет избежать запуска новой хостовой JRE JVM, загрузки кода Jack, инициализации Jack и прогрева JIT при каждой компиляции. Он также обеспечивает очень хорошее время компиляции при небольших компиляциях (например, в инкрементальном режиме).
  • Это краткосрочное решение для контроля количества параллельных компиляций Джека. Сервер избегает перегрузки вашего компьютера (проблемы с памятью или диском), поскольку он ограничивает количество параллельных компиляций.

Сервер Jack выключается после простоя без какой-либо компиляции. Он использует два TCP-порта на локальном интерфейсе и недоступен извне. Все параметры (количество параллельных компиляций, время ожидания, количество портов и т.д.) можно изменить, отредактировав файл $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, отредактировав $HOME/.jack и заменив SERVER_NB_COMPILE на более низкое значение.
Сбои компиляции при невозможности запуска фонового сервера Наиболее вероятная причина — TCP-порты уже используются на вашем компьютере. Измените порты, отредактировав $HOME/.jack (переменные SERVER_PORT_SERVICE и SERVER_PORT_ADMIN ). Чтобы разблокировать ситуацию, отключите сервер компиляции Jack, отредактировав $HOME/.jack и изменив SERVER на false . К сожалению, это значительно замедляет вашу компиляцию и может вынудить вас запускать make -j с контролем загрузки (опция -l make ).
Компиляция зависает без прогресса Чтобы разблокировать ситуацию, уничтожьте фоновый сервер Джека с помощью jack-admin kill-server затем удалите временные каталоги, содержащиеся в jack-$USER вашего временного каталога ( /tmp или $TMPDIR ).

Поиск журнала Джека

Если вы запустили команду make с целью dist, журнал Jack находится в $ANDROID_BUILD_TOP/out/dist/logs/jack-server.log . В противном случае вы можете найти журнал, запустив jack-admin server-log . В случае воспроизводимых отказов домкрата вы можете получить более подробный журнал, установив следующую переменную:

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 в качестве предекса. При компиляции Джек повторно использует предекс из каждой библиотеки. Все библиотеки предварительно проиндексированы.

Библиотеки Джека с предексом
Рисунок 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

Переупаковка

Джек использует файлы конфигурации jarjar для переупаковки. Хотя Джек совместим с типами правил «rule», он не совместим с типами правил «zap» или «keep».

Поддержка мультидекса

Джек предлагает встроенную и устаревшую поддержку multidex. Поскольку файлы dex ограничены методами 65K, приложения с более чем 65K методами должны быть разделены на несколько файлов dex. Дополнительные сведения см. в разделе Включение мультидекса для приложений с методами более 64 000 .