AAPT2

AAPT2(Android Asset Packaging Tool)は、Android Studio と Android Gradle プラグインがアプリのリソースのコンパイルとパッケージ化に使用するビルドツールです。AAPT2 は、リソースを解析し、インデックスを付けて、Android プラットフォーム向けに最適化されたバイナリ形式にコンパイルします。

Android Gradle プラグイン 3.0.0 以上では、AAPT2 はデフォルトで有効になります。通常は、デベロッパー自身が aapt2 を呼び出す必要はありません。ただし、Android Studio ではなくターミナルと独自のビルドシステムを使用する場合は、コマンドラインから AAPT2 を使用できます。AAPT2 に関連するビルドエラーをコマンドラインからデバッグすることもできます。その場合は、Android SDK Build Tools 26.0.2 以上でスタンドアロン ツールとしての AAPT2 を探します。

コマンドラインから Android SDK Build Tools をダウンロードするには、sdkmanager を使用して次のコマンドを実行します。

sdkmanager "build-tools;build-tools-version"

SDK Build Tools をダウンロードしたら、android_sdk/build-tools/version/ で AAPT2 を探します。

Android SDK Build Tools のリビジョンはそれほど頻繁にリリースされないため、使用している SDK Build Tools に含まれる AAPT2 のバージョンは最新でない可能性があります。AAPT2 の最新バージョンを入手するには、Google Maven から AAPT2 をダウンロードするをご覧ください。

Linux または Mac でコマンドラインから AAPT2 を使用するには、aapt2 コマンドを実行します。Windows の場合は、aapt2.exe コマンドを実行します。

AAPT2 は、増分コンパイルを可能にすることで、リソースのより高速なコンパイルをサポートしています。増分コンパイルを実現するため、リソース処理は 2 つのステップに分割されています。

  • コンパイル: リソース ファイルをバイナリ形式にコンパイルします。
  • リンク: コンパイルされたすべてのファイルをマージして、単一のパッケージにパッケージ化します。

この分割により、増分ビルドのパフォーマンスが向上します。たとえば、単一のファイルを変更した場合は、そのファイルだけを再コンパイルすれば済みます。

Google Maven から AAPT2 をダウンロードする

Build Tools にバンドルされていない AAPT2 の最新バージョンを入手するには、次のようにして Google の Maven リポジトリから AAPT2 をダウンロードします。

  1. リポジトリ インデックスで、com.android.tools.build > aapt2 に移動します。
  2. AAPT2 の最新バージョンの名前をコピーします。
  3. コピーしたバージョン名を次の URL に挿入し、ターゲットとなるオペレーティング システムを指定します。https://dl.google.com/dl/android/maven2/com/android/tools/build/aapt2/aapt2-version/aapt2-aapt2-version- [windows | linux | osx].jar

    たとえば、Windows 用のバージョン 3.2.0-alpha18-4804415 をダウンロードする場合は、次の URL を使用します。https://dl.google.com/dl/android/maven2/com/android/tools/build/aapt2/3.2.0-alpha18-4804415/aapt2-3.2.0-alpha18-4804415-windows.jar

  4. ブラウザで URL に移動します。まもなく AAPT2 のダウンロードが開始されます。

  5. ダウンロードした JAR ファイルを解凍します。

    JAR ファイルには、aapt2 実行可能ファイルと、この実行可能ファイルが依存するいくつかのライブラリが含まれています。

コンパイル

AAPT2 は、すべての Android リソースタイプ(ドローアブルや XML ファイルなど)のコンパイルをサポートしています。コンパイルのために AAPT2 を呼び出す際は、呼び出しごとに単一のリソース ファイルを入力として渡します。AAPT2 は、そのファイルを解析して、.flat 拡張子が付いた中間バイナリ ファイルを生成します。

ディレクトリ全体を渡すと、リソースが 1 つしか変更されていない場合でも、AAPT2 はディレクトリ内のすべてのファイルを再コンパイルします。--dir フラグを使用して、複数のリソース ファイルを含むリソース ディレクトリを AAPT2 に渡すことはできますが、この方法ではリソースの増分コンパイルによるメリットは得られません。

次の表に示すように、コンパイルのために指定した入力によって、出力ファイル形式が異なります。

表 1. コンパイルの入力と出力ファイル形式

入力 出力
XML リソース ファイル(res/values/ ディレクトリにある文字列スタイルなど) *.arsc.flat 拡張子が付いたリソース テーブル。
他のすべてのリソース ファイル

res/values/ ディレクトリ以外にあるファイルはすべて、*.flat 拡張子が付いたバイナリ XML ファイルに変換されます。

さらに、PNG ファイルはすべてデフォルトでクランチされ、*.png.flat 拡張子が付けられます。PNG を圧縮しない場合は、コンパイル時に --no-crunch オプションを使用できます。

AAPT2 が出力するファイルは実行可能ファイルではありません。これらのバイナリ ファイルを後でリンクフェーズで入力として組み込んで APK を生成する必要があります。ただし、生成された APK ファイルは、DEX ファイルは含まれておらず、署名もされていないため、すぐに Android デバイスにデプロイできる実行ファイルではありません。

コンパイルの構文

compile を使用する一般的な構文は次のとおりです。

aapt2 compile path-to-input-files [options] -o output-directory/

次の例では、AAPT2 は values.xml および myImage.png という名前のリソース ファイルを個別にコンパイルします。

aapt2 compile project_root/module_root/src/main/res/values-en/strings.xml -o compiled/
aapt2 compile project_root/module_root/src/main/res/drawable/myImage.png -o compiled/

表 1 に示すように、出力ファイルの名前は、入力ファイル名とその親ディレクトリの名前に依存します。

上記の例では、入力として strings.xml ファイルを使用しているため、aapt2 は自動的に出力ファイルの名前を values-en_strings.arsc.flat とします。ただし、ドローアブル ディレクトリに格納されるコンパイル済みドローアブル ファイルの名前は drawable_img.png.flat になります。

コンパイル オプション

表 2 に示すように、compile コマンドで使用できるオプションがいくつかあります。

表 2. compile コマンドのオプション

オプション 説明
-o path

コンパイルされたリソースの出力パスを指定します。

AAPT2 がコンパイルしたリソースを出力して格納するディレクトリのパスを指定する必要があるため、このフラグは必須です。

--dir directory

リソースをスキャンするディレクトリを指定します。

このフラグを使用すると、1 つのコマンドで複数のリソース ファイルをコンパイルできますが、増分コンパイルのメリットは得られなくなります。 したがって、大規模なプロジェクトではこのフラグを使用しないでください。

--pseudo-localize デフォルト文字列の疑似ローカライズ バージョンを生成します(例: en-XAen-XB)。
--no-crunch PNG 処理を無効にします。

このオプションは、PNG ファイルをすでに処理した場合や、ファイルサイズを削減する必要がないデバッグ用ビルドを作成する場合に使用します。このオプションを有効にすると、実行速度は上がりますが、出力ファイルサイズは大きくなります。

--legacy AAPT の以前のバージョンでは許容されるエラーを警告として扱います。

このフラグは、予期しないコンパイル時エラーを防止する場合に使用します。AAPT2 の使用時に発生する可能性がある既知の動作変更の問題を解決するには、AAPT2 を使用する際の動作の変更点をご覧ください。

-zip file file は、リソースをスキャンする res ディレクトリを含む ZIP ファイルです。
-output-text-symbols file 指定された file 内のリソース シンボルを含むテキスト ファイルを生成します。
-preserve-visibility-of-styleables このオプションを指定すると、他のすべてのリソースで使用される styleable に対して同じ公開設定ルールが適用されます。指定しなかった場合、styleable はすべてパブリックになります。
-visibility [public|private|default|] コンパイルされたリソースの公開設定を、指定されたレベルに設定します。
-trace-folder folder 指定された foldersystrace JSON トレース フラグメントを生成します。
-source-path path コンパイルされたリソース ファイルのソースファイル パスを path に設定します。
-h ツールのヘルプを表示します。
-v 詳細ログを有効にします。

リンクフェーズでは、AAPT2 は、コンパイル フェーズで生成されたすべての中間ファイル(リソース テーブル、バイナリ XML ファイル、処理済みの PNG ファイルなど)をマージして、それらのファイルを単一の APK にパッケージ化します。さらに、このフェーズでは、その他の補助ファイル(R.java や ProGuard ルールファイルなど)も生成できます。ただし、生成された APK には DEX バイトコードは含まれておらず、署名もされていません。この APK をデバイスにデプロイすることはできません。

Android Gradle プラグインを使用してコマンドラインからアプリをビルドしない場合は、d8 などの他のコマンドライン ツールを使用して Java バイトコードを DEX バイトコードにコンパイルし、apksigner を使用して APK に署名することができます。

link を使用する一般的な構文は次のとおりです。

aapt2 link path-to-input-files [options] -o
outputdirectory/outputfilename.apk --manifest AndroidManifest.xml

次の例では、AAPT2 は 2 つの中間ファイル(drawable_Image.flatおよび values_values.arsc.flat)と AndroidManifest.xml ファイルをマージします。そして、その結果を android.jar ファイルにリンクします。このファイルは、android パッケージで定義されたリソースを保持しています。

 aapt2 link -o output.apk
 -I android_sdk/platforms/android_version/android.jar
    compiled/res/values_values.arsc.flat
    compiled/res/drawable_Image.flat --manifest /path/to/AndroidManifest.xml -v

link コマンドでは次のオプションを使用できます。

表 3: link コマンドのオプション

オプション 説明
-o path

リンクされたリソース APK の出力パスを指定します。

リンクされたリソースを保持できる出力 APK のパスを指定する必要があるため、このフラグは必須です。

--manifest file

ビルドする Android マニフェスト ファイルのパスを指定します。

マニフェスト ファイルにはアプリに関する重要な情報(パッケージ名やアプリ ID など)が含まれているため、このフラグは必須です。

-I

プラットフォームの android.jar または他の APK(framework-res.apk など)のパスを指定します。これらのファイルは機能をビルドする際に役に立つことがあります。

android 名前空間を指定した属性をリソース ファイルで使用する場合、このフラグは必須です。
-A directory APK に含めるアセット ディレクトリを指定します。

このディレクトリは、処理する前の元のファイルを格納するために使用できます。詳しくは、元のファイルにアクセスするをご覧ください。

-R file <add-resource> タグを使用せず、overlay セマンティクスを使用して、個々の .flat ファイルを link に渡します。

既存のファイルをオーバーレイするリソース ファイルを指定すると、競合するリソースのうち最後に指定されたものが使用されます。

--package-id package-id アプリに使用するパッケージ ID を指定します。

パッケージ ID は、--allow-reserved-package-id と組み合わせて指定する場合を除いて、0x7f 以上を指定する必要があります。

--allow-reserved-package-id

予約済みのパッケージ ID の使用を許可します。

予約済みのパッケージ ID とは、共有ライブラリに通常割り当てられる 0x02~0x7e の範囲の ID です。--allow-reserved-package-id を使用すると、予約済みのパッケージ ID の範囲内にある ID を割り当てることができます。

このオプションは、min-sdk バージョンが 26 以下のパッケージでのみ使用してください。

--java directory R.java を生成するディレクトリを指定します。
--proguard proguard_options ProGuard ルールの出力ファイルを生成します。
--proguard-conditional-keep-rules メイン DEX 用の ProGuard ルールの出力ファイルを生成します。
--no-auto-version スタイルとレイアウトの SDK の自動バージョン管理を無効にします。
--no-version-vectors ベクター型ドローアブルの自動バージョン管理を無効にします。このフラグは、Vector Drawable ライブラリを使用して APK をビルドする場合にのみ使用します。
--no-version-transitions 遷移リソースの自動バージョン管理を無効にします。このフラグは、Transition サポート ライブラリを使用して APK をビルドする場合にのみ使用します。
--no-resource-deduping 互換性のある構成間で同一の値を持つリソースの自動重複除去を無効にします。
--enable-sparse-encoding バイナリ検索ツリーを使用してスパース エントリのエンコードを有効にします。これは APK サイズの最適化に役立ちますが、それと引き換えにリソース取得のパフォーマンスが低下します。
-z 「suggested」とマークされた文字列のローカライズを必須にします。
-c config 構成のカンマ区切りリストを指定します。

たとえば、複数の言語の翻訳を含むサポート ライブラリへの依存関係がある場合、指定した言語構成(英語やスペイン語など)のみでリソースをフィルタできます。

言語構成は 2 文字の ISO 639-1 言語コードで定義する必要があります。言語コードの後に、小文字の「r」と 2 文字の ISO 3166-1-alpha-2 地域コードを追加することもできます。(例: en-rUS)。

--preferred-density density AAPT2 が最も近い密度を選択して、その他はすべてストリップできるようにします。

アプリで使用できるピクセル密度修飾子には、ldpi、hdpi、xhdpi などがあります。優先密度を指定すると、AAPT2 は最も近い密度を選択してリソース テーブルに格納し、それ以外はすべて取り除きます。

--output-to-dir -o で指定されたディレクトリに APK の内容を出力します。

このフラグを使用してエラーが発生した場合は、Android SDK Build Tools 28.0.0 以上にアップグレードすることでエラーを解決できます。

--min-sdk-version min-sdk-version AndroidManifest.xml に使用するデフォルトの最小 SDK バージョンを設定します。
--target-sdk-version target-sdk-version AndroidManifest.xml に使用するデフォルトのターゲット SDK バージョンを設定します。
--version-code version-code バージョン コードが存在しない場合に AndroidManifest.xml に挿入するバージョン コードを指定します。
--version-name version-name バージョン名が存在しない場合に AndroidManifest.xml に挿入するバージョン名を指定します。
--revision-code revision-code リビジョン コードが存在しない場合に AndroidManifest.xml ファイルに挿入するリビジョン コードを指定します。
--replace-version --version-code--version-name、または --revision-code が指定された場合、それらの値でマニフェスト内にすでにある値をすべて置き換えます。デフォルトでは、マニフェストでこれらの属性がすでに定義されている場合は、何も変更しません。
--compile-sdk-version-nacodeme compile-sdk-version-name バージョン コードが存在しない場合に AndroidManifest.xml ファイルに挿入するバージョン コードを指定します。
--compile-sdk-version-name compile-sdk-version-name バージョン名が存在しない場合に AndroidManifest.xml ファイルに挿入するバージョン名を指定します。
--proto-format コンパイルされたリソースを Protobuf 形式で生成します。

この形式は、Android App Bundle を生成するための bundletool の入力に適しています。

--non-final-ids 非 final リソース ID を持つ R.java を生成します。アプリのコードから ID への参照は、kotlinc または javac のコンパイル時にインライン化されません。
--emit-ids path リソースタイプの名前とそれらの ID マッピングのリストを、指定されたパスのファイルに出力します。このオプションは、--stable-ids とともに使用するのに適しています。
--stable-ids outputfilename.ext --emit-ids で生成されたファイル(リソースタイプの名前とそれらに割り当てられた ID のリストを含む)を使用します。

このオプションを使用すると、リンクの際にリソースを削除するか新しいリソースを追加した場合でも、割り当てられた ID を固定しておくことができます。

--custom-package package_name R.java の生成先であるカスタム Java パッケージを指定します。
--extra-packages package_name 同じ R.java ファイルを生成しますが、パッケージ名は異なります。
--add-javadoc-annotation annotation 生成されたすべての Java クラスに JavaDoc アノテーションを追加します。
--output-text-symbols path 指定されたファイル内に、R クラスのリソース シンボルを含むテキスト ファイルを生成します。

出力ファイルのパスを指定する必要があります。

--auto-add-overlay <add-resource> タグを使用せずに、オーバーレイ内に新しいリソースを追加することを許可します。
--rename-manifest-package manifest-package AndroidManifest.xml ファイル内のパッケージの名前を変更します。
--rename-instrumentation-target-package instrumentation- target-package instrumentation のターゲット パッケージの名前を変更します。

このオプションは、--rename-manifest-package と組み合わせて使用します。

-0 extension

圧縮したくないファイルの拡張子を指定します。

--split path:config[,config[..]] 構成のセットに基づいてリソースを分割し、APK の別バージョンを生成します。

出力 APK のパスとともに構成のセットを指定する必要があります。

--proguard-main-dex file メイン DEX 用に生成された ProGuard ルールの出力ファイル。
--proguard-minimal-keep-rules ProGuard Keep ルールの最小限のセットを生成します。
--no-resource-removal デフォルトのないリソースの自動削除を無効にします。このオプションは、ランタイム リソース オーバーレイ パッケージをビルドする場合にのみ使用します。
-x パッケージ ID 0x01 の使用を指定するレガシーフラグ。
--product products-list 保持するプロダクト名のカンマ区切りリストを指定します。
--no-xml-namespaces AndroidManifest.xml ファイルと res/* 内の XML バイナリから、XML 名前空間プレフィックスと URI 情報を削除します。
--shared-lib 共有 Android ランタイム ライブラリを生成します。
--static-lib 静的 Android ライブラリを生成します。
--no-static-lib-packages アプリのパッケージの下にあるすべてのライブラリ リソースをマージします。
--no-proguard-location-reference ProGuard ルールファイルがソースファイルへの参照を含まないようにします。
--private-symbols package-name package-name には、プライベート シンボルの R.java を生成する際に使用するパッケージ名を指定します。指定しなかった場合は、パブリック シンボルとプライベート シンボルでアプリのパッケージ名が使用されます。
--override-styles-instead-of-overlaying このオプションを指定すると、-R リソースに定義されているスタイルが以前の定義にマージされるのではなく、それらによって以前の定義が置き換えられます。
--rename-resources-package package-name リソース テーブル内のパッケージの名前を package-name に変更します。
--no-compress リソースの圧縮を行いません。
--keep-raw-values XML ファイル内の未加工の属性値を保持します。
--no-compress-regex regular-expression regular-expression と一致する拡張機能の圧縮を行いません。 行の終わりを表すには $ 記号を使用します。大文字と小文字を区別する ECMAScript 正規表現文法を使用します。
--warn-manifest-validation マニフェスト検証エラーを警告として扱います。
--exclude-configs qualifier[,qualifier[..]] 指定された修飾子が構成に含まれるリソースの値を除外します。
--debug-mode マニフェストのアプリノードに android:debuggable="true" を挿入し、製品版デバイスでもアプリをデバッグ可能にします。
--strict-visibility 公開設定レベルが異なるオーバーレイを許可しません。
--exclude-sources Protobuf 形式でリソースを生成する際に、ソースファイル情報をシリアル化しません。
--trace-folder folder 指定された foldersystrace JSON トレース フラグメントを生成します。
--merge-only リソースの参照を検証せず、リソースのマージのみを行います。このフラグは、常に --static-lib フラグとともに使用する必要があります。
-h ヘルプメニューを表示します。
-v 詳細度の高い出力を有効にします。

ダンプ

dump は、link コマンドで生成した APK に関する情報を出力するために使用します。

ダンプの構文

dump を使用する一般的な構文は次のとおりです。

aapt2 dump sub-command filename.apk [options]

次の例では、指定された APK のリソース テーブルの内容を出力します。

aapt2 dump resources output.apk

ダンプのサブコマンド

dump コマンドでは、次のサブコマンドのいずれかを指定します。

表 4. dump のサブコマンド

サブコマンド説明
apc コンパイル時に生成された AAPT2 Container(APC)の内容を出力します。
badging APK のマニフェストから抽出された情報を出力します。
configurations APK 内のリソースによって使用されるすべての構成を出力します。
overlayable APK のオーバーレイ可能なリソースを出力します。
packagename APK のパッケージ名を出力します。
permissions APK のマニフェストから抽出された権限を出力します。
strings APK のリソース テーブル文字列プールの内容を出力します。
styleparents APK 内で使用されているスタイルの親を出力します。
resources APK のリソース テーブルの内容を出力します。
xmlstrings APK のコンパイル済み XML の文字列を出力します。
xmltree APK のコンパイル済み XML のツリーを出力します。

ダンプ オプション

dump では次のオプションを使用します。

表 5. dump のオプション

オプション説明
--no-values リソースを表示するときに値の出力を抑制します。
--file file APK からダンプするファイルを引数として指定します。
-v 出力の詳細度を高くします。

差分

diff を使用すると、2 つの APK を比較して差分を確認できます。

差分の構文

diff を使用する一般的な構文は次のとおりです。

aapt2 diff first.apk second.apk

diff コマンドにオプションはありません。

最適化

optimize は、マージされたリソースと resources.arsc が APK にパッケージ化される前に、それらに対して最適化を実行するために使用します。この最適化により、使用されるリソースのサイズと数に応じて、APK サイズをおよそ 1~3% 削減できます。

最適化の構文

optimize を使用する一般的な構文は次のとおりです。

aapt2 optimize options file[,file[..]]

次の例では、input.apk のリソースを最適化し、最適化された新しい APK を output.apk に作成します。一般的なフラット テーブル表現がよりコンパクトなバイナリ検索ツリーに置き換えられ、取得パフォーマンスの低下と引き換えに APK が小さくなります。

aapt2 optimize -o output.apk --enable-sparse-encoding input.apk

最適化オプション

optimize では、次のオプションを使用できます。

表 6. optimize のオプション

オプション説明
-o path リンクされたリソース APK の出力パスを指定します。

リンクされたリソースを保持できる出力 APK のパスを指定する必要があるため、このフラグは必須です。

-d directory 分割用の出力ディレクトリのパスを指定します。
-x path XML 構成ファイルのパスを指定します。
-p マルチ APK アーティファクトを出力して終了します。
--target-densities density[,density[..]] APK を最適化する画面密度のカンマ区切りリストを指定します。指定された密度のデバイスで使用されないであろうすべてのリソースが APK から削除されます。
--resources-config-path path

リソースと各リソースへのディレクティブのリストを含む resources.cfg ファイルのパスを指定します。

形式: type/resource_name#[directive][,directive]

-c config[,config[..]] 出力に含める構成のカンマ区切りリストを指定します。デフォルトはすべての構成です。
--split path:config[,config[..]] 構成のセットに基づいてリソースを分割し、APK の別バージョンを生成します。

出力 APK のパスとともに構成のセットを指定する必要があります。

--keep-artifacts artifact[,artifact[..]] 保持するアーティファクトのカンマ区切りリストを指定します。指定しなかった場合は、すべてのアーティファクトが保持されます。
--enable-sparse-encoding バイナリ検索ツリーを使用してスパース エントリのエンコードを有効にします。このオプションは APK サイズの最適化に役立ちますが、それと引き換えにリソース取得のパフォーマンスが低下します。
--collapse-resource-names リソース名をキー文字列プール内の単一の値に収めます。 リソースを除外するには、--resources-config-path で指定されたファイルの no_collapse ディレクティブを使用します。
--shorten-resource-paths APK 内のリソースのパスを短縮します。
--resource-path-shortening-map path 古いリソースパスのマップを短縮されたパスに出力するパスを指定します。
-v 出力の詳細度を高くします。
-h ツールのヘルプを表示します。

変換

デフォルトでは、AAPT の compile コマンドは、リソースを APK に適したバイナリ形式にコンパイルします。--proto-format を指定して、AAB に適した protobuf 形式を指定することもできます。convert コマンドは、2 つの形式の間で APK を変換します。

変換の構文

convert の一般的な構文は次のとおりです。

aapt2 convert -o output-file options file[,file[..]]

次の例では、input.apk のリソースを変換し、protobuf 形式のリソースを含む新しい APK を output.apk に作成します。一般的なフラット テーブル表現がよりコンパクトなバイナリ検索ツリーに置き換えられ、取得パフォーマンスの低下と引き換えに APK が小さくなります。

aapt2 convert -o output.apk --output-format proto --enable-sparse-encoding input.apk

変換オプション

convert では次のオプションを使用します。

表 7. convert のオプション

オプション説明
-o path

リンクされたリソース APK の出力パスを指定します。

リンクされたリソースを保持できる出力 APK のパスを指定する必要があるため、このフラグは必須です。

--output-format [proto|binary] 出力の形式。指定できる値は protobinary です。指定しなかった場合のデフォルトは binary です。
--enable-sparse-encoding バイナリ検索ツリーを使用してスパース エントリのエンコードを有効にします。このオプションは APK サイズの最適化に役立ちますが、それと引き換えにリソース取得のパフォーマンスが低下します。
--keep-raw-values XML ファイル内の未加工の属性値を保持します。
-v 出力の詳細度を高くします。
-h ツールのヘルプを表示します。

デーモンモード

AAPT バージョン 2.19 では、コマンド発行用のデーモンモードが導入されました。デーモンモードでは、単一の AAPT セッションで複数のコマンドを入力できます。

デーモンの構文

デーモンモードを開始するには、次のコマンドを使用します。

aapt2 daemon

デーモンモードが実行されたら、複数のコマンドを入力できます。コマンドの各引数を個別の行に配置し、コマンドの終わりに空白行を挿入する必要があります。デーモンモードを終了するには、Ctrl+D キーを押します。

次の個別の compile コマンドをご覧ください。

aapt2 compile project_root/module_root/src/main/res/values-en/strings.xml -o compiled/
aapt2 compile project_root/module_root/src/main/res/drawable/myImage.png -o compiled/

これらのコマンドは、デーモンモードでは次のように入力できます。

aapt2 daemon
Ready
compile
project_root/module_root/src/main/res/values-en/strings.xml
-o
compiled/

Done
compile
project_root/module_root/src/main/res/drawable/myImage.png
-o
compiled/

Done
^D
Exiting daemon

デーモンモードのオプション

デーモンモードのオプションは --trace-folder folder のみです。このオプションは、指定された foldersystrace JSON トレース フラグメントを生成します。

バージョン

使用している AAPT2 のバージョンを確認するには、version コマンドを使用します。

aapt2 version
Android Asset Packaging Tool (aapt) 2.19-8678579

AAPT2 を使用する際の動作の変更点

AAPT2 が登場する前は、AAPT が Android Asset Packaging Tool のデフォルト バージョンでしたが、現在は非推奨になっています。AAPT2 は以前のプロジェクトでも動作するはずですが、このセクションでは、いくつかの注意が必要な動作の変更点について説明します。

Android マニフェストの要素の階層

AAPT の以前のバージョンでは、AndroidManifest.xml ファイルで正しくないノードにネストされた要素は、無視されるか警告が表示されていました。たとえば、次の例をご覧ください。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.myname.myapplication">
   <application
       ...
       <activity android:name=".MainActivity">
           <intent-filter>
               <action android:name="android.intent.action.MAIN" />
               <category android:name="android.intent.category.LAUNCHER" />
           </intent-filter>
           <action android:name="android.intent.action.CUSTOM" />
       </activity>
   </application>
</manifest>

AAPT の以前のバージョンでは、誤って配置された <action> タグは単に無視されます。

AAPT2 では次のエラーが表示されます。

AndroidManifest.xml:15: error: unknown element <action> found.

この問題を解決するには、マニフェスト要素を正しくネストします。詳しくは、アプリ マニフェストの概要をご覧ください。

リソースの宣言

name 属性で、リソースのタイプを指定できなくなりました。次の例では、attr リソース アイテムの宣言が誤っています。

<style name="childStyle" parent="parentStyle">
    <item name="attr/my_attr">@color/pink</item>
</style>

リソースタイプをこのように宣言すると、次のビルドエラーが発生します。

Error: style attribute 'attr/attr/my_attr (aka my.package:attr/attr/my_attr)'
not found.

このエラーを解決するには、type="attr" を使用して明示的にタイプを宣言します。

<style name="childStyle" parent="parentStyle">
  <item type="attr" name="my_attr">@color/pink</item>
</style>

さらに、<style> 要素を宣言する場合は、その親のリソースタイプもスタイルである必要があります。そうでない場合、次のようなエラーが発生します。

Error: (...) invalid resource type 'attr' for parent of style

@ リソース参照シンボルの誤った使用

リソース参照シンボル(@)を省略するか誤って配置すると、AAPT2 はビルドエラーをスローします。たとえば、style 属性を指定する際に、このシンボルを次のように省略したとします。

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
  ...
  <!-- Note the missing '@' symbol when specifying the resource type. -->
  <item name="colorPrimary">color/colorPrimary</item>
</style>

このモジュールをビルドすると、AAPT2 は次のビルドエラーをスローします。

ERROR: expected color but got (raw string) color/colorPrimary

また、android 名前空間からリソースにアクセスする際に、このシンボルを次のように誤って指定したとします。

...
<!-- When referencing resources from the 'android' namespace, omit the '@' symbol. -->
<item name="@android:windowEnterAnimation"/>

このモジュールをビルドすると、AAPT2 は次のビルドエラーをスローします。

Error: style attribute '@android:attr/windowEnterAnimation' not found

ライブラリの誤った設定

Android SDK Build Tools の古いバージョンを使用してビルドされたサードパーティ ライブラリへの依存関係を含むアプリは、実行時にエラーまたは警告を表示せずにクラッシュすることがあります。このようなクラッシュが発生する原因は、ライブラリの作成時に R.java フィールドが final として宣言されていることです。その結果、すべてのリソース ID がライブラリのクラス内でインライン化されます。

AAPT2 の動作は、アプリのビルド時に ID をライブラリ リソースに再割り当てできることに依存しています。ライブラリが ID を final であると仮定してライブラリ DEX 内でインライン化すると、実行時に不一致が発生します。

このエラーを解決するには、ライブラリの作成者と連絡を取り、Android SDK Build Tools の最新バージョンを使用して再ビルドしたライブラリを公開し直すように依頼してください。