Компиляция с помощью Jack (AOSP 6.0 - 8.1)

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 в новый формат библиотеки.

Рабочий процесс импорта существующей библиотеки `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 как pre-dex. При компиляции Jack повторно использует pre-dex из каждой библиотеки. Все библиотеки имеют pre-dex.

Библиотеки Jack с пре-дексом.

Рисунок 4. Библиотеки Jack с пре-дексом.

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

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

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

Инкрементальная компиляция отключена по умолчанию (и автоматически деактивируется при включении сжатия, обфускации, переупаковки или 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 ограничены 65K методами, приложения с более чем 65K методами должны быть разделены на несколько файлов dex. Для получения более подробной информации см. Включить multidex для приложений с более чем 64K методами