Google is committed to advancing racial equity for Black communities. See how.
Эта страница была переведа с помощью Cloud Translation API.
Switch to English

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

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

О Джеке

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

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

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

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

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

Джилл

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

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

Сервер компиляции Jack

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

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

Сервер Джека выключается после простоя без какой-либо компиляции. Он использует два порта TCP на интерфейсе localhost и недоступен извне. Все параметры (количество параллельных компиляций, время ожидания, количество портов и т. Д.) Можно изменить, отредактировав файл $HOME/.jack .

$ HOME / .jack файл

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

В поисках журнала Джека

Если вы $ANDROID_BUILD_TOP/out/dist/logs/jack-server.log команду make с целью dist, журнал Джека находится в $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 . Вы также можете отключить сервер Джека, установив SERVER=false в $HOME/.jack .
  • Компиляция CTS выполняется медленно из-за текущей интеграции vm-tests-tf .
  • Инструменты для работы с байт-кодом (такие как JaCoCo) не поддерживаются.

Использование Джека

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

Pre-dexing

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

Библиотеки Джека с pre-dex
Рисунок 4. Библиотеки Джека с pre-dex

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

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

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

По умолчанию инкрементная компиляция отключена (и автоматически отключается при включении сжатия, обфускации, переупаковки или устаревших версий multi-dex). Чтобы включить инкрементные сборки, добавьте следующую строку в файл Android.mk проекта, который вы хотите построить инкрементально:

LOCAL_JACK_ENABLED := incremental

Сжатие и обфускация

Джек использует файлы конфигурации ProGuard, чтобы включить сжатие и обфускацию.

Общие параметры включают следующее:

  • @
  • -include
  • -basedirectory
  • -injars
  • -outjars (поддерживается только 1 выходная банка)
  • -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 для переупаковки. Хотя Джек совместим с типами правил «правила», он несовместим с типами правил «zap» или «keep».

Поддержка Multidex

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