Google致力於提高黑人社區的種族平等。 怎麼看。
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

使用Jack for Android 6.0–8.1進行編譯

Jack是一個Android工具鏈,可將Java源代碼編譯為Android dex字節碼。使用Jack無需做任何其他事情-只需使用標準的makefile命令來編譯樹或項目。 Android 8.1是最後使用Jack的版本。

關於傑克

Jack的工作如圖1所示。

傑克概述
圖1. Jack概述

傑克圖書館格式

Jack具有自己的.jack文件格式,其中包含該庫的預編譯dex代碼,從而可以更快地進行編譯(pre-dex)。

Jack庫文件內容
圖2. Jack庫文件內容

吉爾

Jill工具將現有的.jar庫轉換為新的庫格式,如下所示。

使用Jill導入.jar庫
圖3.導入現有.jar庫的工作流程

傑克編譯服務器

首次使用Jack時,它將在您的計算機上啟動本地Jack編譯服務器。該服務器:

  • 帶來內在的加速,因為它避免了在每次編譯時啟動新的主機JRE JVM,避免加載Jack代碼,初始化Jack並預熱JIT。在小編譯(例如,增量模式)下,它還提供了很好的編譯時間。
  • 是控制並行Jack編譯數量的短期解決方案。服務器避免了計算機過載(內存或磁盤問題),因為它限制了並行編譯的數量。

在沒有任何編譯的空閒時間後,傑克服務器將自行關閉。它在localhost接口上使用兩個TCP端口,並且外部不可用。所有參數(並行編譯數,超時,端口號等)都可以通過編輯$HOME/.jack文件進行修改。

$ HOME / .jack文件

$HOME/.jack文件以完整的bash語法包含Jack服務器變量的以下設置:

  • 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更改為較低的值,可以減少Jack編譯的同時進行的次數。
無法啟動後台服務器上的編譯失敗最可能的原因是您的計算機上已經使用了TCP端口。通過編輯$HOME/.jackSERVER_PORT_SERVICESERVER_PORT_ADMIN變量)來更改端口。要消除這種情況,請通過編輯$HOME/.jack並將SERVER更改為false來禁用Jack編譯服務器。不幸的是,這大大降低了編譯速度,並可能迫使您使用負載控制( make選項-l )啟動make -j
編譯陷入困境,沒有任何進展要消除這種情況,請使用jack-admin kill-server殺死Jack後台服務器,然後刪除臨時目錄的jack-$USER包含的臨時目錄( /tmp$TMPDIR )。

查找傑克日誌

如果您對dist目標運行了make命令,則Jack日誌位於$ANDROID_BUILD_TOP/out/dist/logs/jack-server.log 。否則,您可以通過運行jack-admin 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

傑克的局限性

  • 默認情況下,傑克服務器只能由一台計算機上的一個用戶使用。要支持其他用戶,請為每個用戶選擇不同的端口號,並相應地調整SERVER_NB_COMPILE 。您還可以通過在$HOME/.jack中將SERVER=false設置為禁用Jack服務器。
  • 由於當前的vm-tests-tf集成,CTS編譯速度很慢。
  • 不支持字節碼操作工具(例如JaCoCo)。

使用傑克

Jack支持Java編程語言1.7,並集成了以下描述的其他功能。

預除糊

生成Jack庫文件時,將生成庫的.dex並將其作為pre-dex存儲在.jack庫文件中。編譯時,Jack重用每個庫中的pre-dex。所有庫都已預先刪除。

帶有pre-dex的Jack庫
圖4.具有pre-dex的Jack庫

如果在編譯中使用縮小,混淆或重新打包,Jack不會重用庫pre-dex。

增量編譯

增量編譯意味著僅重新編譯自上次編譯以來的所有組件(及其依賴項)。當更改僅限於一組組件時,增量編譯可以比完全編譯快得多。

默認情況下,增量編譯是禁用的(啟用收縮,混淆,重新打包或使用多dex傳統時,它會自動停用)。要啟用增量構建,請將以下行添加到要增量構建的項目的Android.mk文件中:

LOCAL_JACK_ENABLED := incremental

收縮和混淆

Jack使用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與“規則”規則類型兼容,但與“ zap”或“保留”規則類型不兼容。

Multidex支持

Jack提供了本機和傳統的多dex支持。由於dex文件僅限於65K方法,因此必須將具有65K以上方法的應用拆分為多個dex文件。有關更多詳細信息,請參閱為使用64K以上方法的應用程序啟用multidex