Jack for Android 6.0–8.1でのコンパイル

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

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

ジャックについて

ジャックは、図 1 に示すように機能します。

ジャックの概要
図 1.ジャックの概要

ジャックのライブラリ形式

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

Jack ライブラリ ファイルの内容
図 2. Jack ライブラリ ファイルの内容

ジル

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

Jill を使用した .jar ライブラリのインポート
図 3.既存の.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を編集し、 SERVERfalseに変更して、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/.jackSERVER=falseを設定して、Jack サーバーを無効にすることもできます。
  • 現在のvm-tests-tf統合により、CTS コンパイルが遅くなります。
  • バイトコード操作ツール (JaCoCo など) はサポートされていません。

ジャックの使用

Jack は Java プログラミング言語 1.7 をサポートし、以下に説明する追加機能を統合します。

プレデキシング

Jack ライブラリ ファイルを生成すると、ライブラリの.dexが生成され、pre-dex として.jackライブラリ ファイル内に格納されます。コンパイル時に、Jack は各ライブラリの pre-dex を再利用します。すべてのライブラリは事前にデキシングされています。

プレデックス付きのJackライブラリ
図 4. pre-dex を含む Jack ライブラリ

コンパイルで圧縮、難読化、または再パッケージ化が使用されている場合、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を有効にする を参照してください。