Компилировать с помощью Jack (AOSP 6.0–8.1), Компилировать с помощью Jack (AOSP 6.0–8.1)

Jack — набор инструментов для сборки Android по умолчанию для Android 6.0–8.1.

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

О Джеке

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

Обзор Джека.

Рисунок 1. Обзор разъема.

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

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

Содержимое файла библиотеки Джека.

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

Джилл

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

Рабочий процесс импорта существующей библиотеки jar.

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

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

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

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

Сервер 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 . В случае воспроизводимых сбоев Джека вы можете получить более подробный журнал, установив следующую переменную:

export ANDROID_JACK_EXTRA_ARGS="--verbose debug --sanity-checks on -D sched.runner=single-threaded"

Используйте стандартные команды make-файла для компиляции дерева (или вашего проекта) и присоединения стандартного вывода и ошибок. Чтобы удалить подробные журналы сборки, запустите:

unset ANDROID_JACK_EXTRA_ARGS

Ограничения Джека

По умолчанию сервер Jack может использовать только один пользователь на компьютере. Для поддержки дополнительных пользователей выберите разные номера портов для каждого пользователя и соответствующим образом настройте SERVER_NB_COMPILE . Вы также можете отключить сервер Jack, установив SERVER=false в $HOME/.jack . Компиляция CTS происходит медленно из-за текущей интеграции vm-tests-tf . Инструменты манипулирования байт-кодом (например, JaCoCo) не поддерживаются.

Используйте Джека

Джек поддерживает язык программирования Java 1.7 и объединяет дополнительные функции, описанные ниже.

Предекс

При создании файла библиотеки Jack создается .dex библиотеки и сохраняется внутри файла библиотеки .jack в качестве предекса. При компиляции Джек повторно использует предекс из каждой библиотеки. Все библиотеки предварительно индексированы.

Джек библиотеки с предексом.

Рисунок 4. Разъем библиотеки с предексом.

Джек не использует повторно предекс библиотеки, если при компиляции используется сжатие, обфускация или переупаковка.

Инкрементная компиляция

Инкрементная компиляция означает, что перекомпилируются только те компоненты, которые были затронуты с момента последней компиляции (и их зависимости). Инкрементальная компиляция может быть значительно быстрее полной компиляции, когда изменения ограничиваются набором компонентов.

Инкрементная компиляция отключена по умолчанию (и автоматически деактивируется при включении сжатия, обфускации, переупаковки или наследования нескольких индексов). Чтобы включить инкрементальные сборки, добавьте следующую строку в файл 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 для переупаковки. Хотя Jack совместим с типами правил «правила», он несовместим с типами правил «зап» или «сохранение».

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

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