Jack は、Java ソースを Android dex バイトコードにコンパイルした Android ツールチェーンです。 Jack を使用するために特別なことをする必要はありません。標準の makefile コマンドを使用して、ツリーまたはプロジェクトをコンパイルするだけです。 Android 8.1 は、Jack を使用する最後のリリースです。
ジャックについて
ジャックは、図 1 に示すように機能します。

ジャックのライブラリ形式
Jack には、ライブラリ用にコンパイル済みの dex コードを含む独自の.jack
ファイル形式があり、より高速なコンパイル (pre-dex) が可能です。

ジル
以下に示すように、Jill ツールは既存の.jar
ライブラリを新しいライブラリ形式に変換します。

.jar
ライブラリをインポートするワークフロージャックコンパイルサーバー
Jack を初めて使用すると、コンピューター上でローカルの Jack コンパイル サーバーが起動します。このサーバー:
- 新しいホスト JRE JVM の起動、Jack コードのロード、Jack の初期化、および各コンパイルでの JIT のウォームアップが回避されるため、本質的なスピードアップがもたらされます。また、小規模なコンパイル (インクリメンタル モードなど) では、コンパイル時間が非常に短縮されます。
- 並列 Jack コンパイルの数を制御するための短期的な解決策です。サーバーは並列コンパイルの数を制限するため、コンピューターの過負荷 (メモリまたはディスクの問題) を回避します。
Jack サーバーは、アイドル時間が経過すると、コンパイルが行われずにシャットダウンします。 localhost インターフェイスで 2 つの 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 をより低い値に変更して、Jack の同時コンパイルの数を減らします。 |
バックグラウンドサーバーを起動できませんでコンパイルが失敗します | 最も可能性の高い原因は、コンピューターで TCP ポートが既に使用されていることです。 $HOME/.jack ( SERVER_PORT_SERVICE およびSERVER_PORT_ADMIN 変数) を編集してポートを変更します。状況のブロックを解除するには、 $HOME/.jack を編集し、 SERVER をfalse に変更して、Jack コンパイル サーバーを無効にします。残念ながら、これによりコンパイルが大幅に遅くなり、負荷制御 ( make のオプション-l ) を使用しmake -j を起動する必要が生じる場合があります。 |
コンパイルが進行せずにスタックする | 状況のブロックを解除するには、 jack-admin kill-server を使用して Jack バックグラウンド サーバーを強制終了し、一時ディレクトリ ( /tmp または$TMPDIR ) のjack-$USER に含まれる一時ディレクトリを削除します。 |
ジャックの丸太を見つける
dist ターゲットでmake
コマンドを実行した場合、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 サーバーは 1 台のコンピューターで 1 人のユーザーのみが使用できます。追加のユーザーをサポートするには、ユーザーごとに異なるポート番号を選択し、それに応じて
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 を再利用します。すべてのライブラリは事前にデキシングされています。

コンパイルで圧縮、難読化、または再パッケージ化が使用されている場合、Jack はライブラリの pre-dex を再利用しません。
増分コンパイル
インクリメンタル コンパイルとは、前回のコンパイル以降に変更されたコンポーネント (およびその依存関係) のみが再コンパイルされることを意味します。インクリメンタル コンパイルは、変更が一連のコンポーネントに限定されている場合、フル コンパイルよりも大幅に高速になる可能性があります。
インクリメンタル コンパイルはデフォルトで無効になっています (縮小、難読化、再パッケージ化、または multi-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
(Jack は preverify しません) -
-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 ファイルに分割する必要があります。詳細については、 64,000 以上のメソッドを持つアプリで multidexを有効にする を参照してください。