Android Dev Summit, October 23-24: two days of technical content, directly from the Android team. Sign-up for livestream updates.

apkanalyzer

APK Analyzer のコマンドライン版では、ビルドプロセスの完了後に APK の構成をすぐに分析することができます。また、2 つの APK に違いがあるかを比較することができます。APK Analyzer を使うと、アプリ内の DEX ファイルとリソースについての問題のデバッグにかかる時間を短縮し、APK のサイズも削減することができます。

apkanalyzerAndroid SDK ツール パッケージに含まれており、android_sdk/tools/bin/apkanalyzer にあります。または Android Studio 内で APK Analyzer ツールにアクセスすることもできます。詳しくは APK Analyzer を使ったビルドの分析についての記事をご覧ください。

構文

    apkanalyzer [global-options] subject verb [options] apk-file [apk-file2]
    

subject は分析する対象であり、APK の全体または一部を対象にすることができます。指定するのは以下のいずれかです。

  • apk: アプリ ID、バージョン コード、バージョン名などの APK ファイルの属性を分析します。
  • files: APK ファイル内のファイルを分析します。
  • manifest: APK ファイル内のマニフェストの内容を分析します。
  • dex: APK ファイル内の DEX ファイルを分析します。
  • resources: テキスト、画像、文字列の各リソースを表示します。

verb は、分析対象について知りたいことを指定します。subject、verb およびそれらのオプションについては、コマンドのセクションで説明します。

コマンドには必ず APK ファイルを指定する必要があります。2 つ目の APK を指定する必要があるのは、apk compare コマンドのみです。曖昧にならない限り、どのオプションも短くすることができます。たとえば、--human-readable グローバル オプションは -h のように短縮できます。次の例では、apk(subject)を分析して file-size(verb)を取得し、そのファイルサイズを人間が読み取れる形式(-h オプション)で出力します。

apkanalyzer -h apk file-size myapk.apk

グローバル オプション

オプション 説明
--human-readable 人間が読み取れる形式でサイズを出力します。

コマンド

以下のコマンドの説明では subject 別に整理し、各 subject で指定できる verb とオプションの組み合わせを列挙しています。

APK ファイルの属性の表示 説明
apk summary apk-file アプリ ID、バージョン コード、バージョン名を出力します。

出力例:


com.myapp 5 1.1-beta
apk file-size apk-file APK の合計ファイルサイズを出力します。
apk download-size apk-file APK のダウンロード サイズの見積もりを出力します。
apk features [--not-required] apk-file APK が使用する機能のうち Play ストアでのフィルタリングをトリガーする機能を出力します。--not-required オプションを追加すると、必須ではないとマークされた機能が出力に含まれます。

出力例:


android.hardware.type.watch
    android.hardware.microphone implied: requested android.permission.RECORD_AUDIO permission
apk compare [options] apk-file apk-file2 apk-fileapk-file2 のサイズを比較します。以下のオプションを指定できます。
  • --different-only: 違いがあるディレクトリとファイルを出力します。
  • --files-only: ディレクトリ エントリを出力から除外します。
  • --patch-size: 生の比較ではなく、ファイルごとに想定されるパッチを表示します。

出力例(古いサイズ / 新しいサイズ / サイズの差 / パッチ)


39086736 48855615 9768879 /
    10678448 11039232 360784 /classes.dex
    18968956 18968956 0 /lib/
    110576 110100 -476 /AndroidManifest.xml
    ...
APK ファイル システムの表示 説明
files list apk-file APK 内のすべてのファイルのリストを表示します。

出力例:


/
    /classes2.dex
    /classes.dex
    /assets/
    /assets/asset.data
    /AndroidManifest.xml
    /resources.arsc
    /res/
    ...
files cat --file path apk-file ファイルの内容を出力します。--file path オプションを使って --file /AndroidManifest.xml のように APK 内へのパスを指定する必要があります。
マニフェストの情報の表示 説明
manifest print apk-file APK のマニフェストを XML 形式で出力します。
manifest application-id apk-file アプリ ID の値を出力します。
manifest version-name apk-file バージョン名の値を出力します。
manifest version-code apk-file バージョン コードの値を出力します。
manifest min-sdk apk-file SDK の最小バージョンを出力します。
manifest target-sdk apk-file SDK のターゲット バージョンを出力します。
manifest permissions apk-file 権限のリストを出力します。
manifest debuggable apk-file アプリがデバッグ可能かどうかを出力します。
DEX ファイルの情報へのアクセス 説明
dex list apk-file APK 内の DEX ファイルのリストを出力します。
dex references [--files path] [--files path2] apk-file 指定した DEX ファイルのメソッドの参照数を出力します。デフォルトではすべての DEX ファイルが対象です。一部のファイルを対象にするには、--files オプションでそれらのファイルを指定します。

出力例:


classes.dex 59598
    classes2.dex 8042
dex packages [option1 option2 ...] apk-file DEX からクラスツリーを出力します。出力内の PCMF はそれぞれ、パッケージ、クラス、メソッド、フィールドを表します。xkrd はそれぞれ削除、保存、参照、定義されたノードを表します。

出力を絞り込むには、以下のオプションを追加します。

  • --defined-only: APK 内で定義されたクラスのみ出力します。
  • --files: 出力する DEX ファイルの名前を指定します。デフォルトは、すべての DEX ファイルです。
  • --proguard-folder file: マッピングを検索する Proguard 出力フォルダを指定します。
  • --proguard-mappings file: Proguard マッピング ファイルを指定します。
  • --proguard-seeds file: Proguard シードファイルを指定します。
  • --proguard-usages file: Proguard 使用状況ファイルを指定します。
  • --show-removed: Proguard によって削除されたクラスとメンバーを表示します。

出力例(タイプ / 状態 / 定義されたメソッド数 / 参照されたメソッド数 / バイトサイズ / 名前):


P d 1 1 85 g
    P d 1 1 85 g.a
    C d 1 1 85 g.a.a
    M d 1 1 45 g.a.a java.lang.Object get()
    C r 0 1 40 byte[]
    M r 0 1 40 byte[] java.lang.Object clone()
dex code --class class [--method method] クラスまたはメソッドのバイトコードを smali 形式で出力します。クラス名は必須です。逆コンパイルのために完全修飾クラス名が出力されます。逆コンパイルするメソッドを指定するには、--method オプションを追加します。メソッドの逆コンパイルの形式は、name(params)returnType です。たとえば、someMethod(Ljava/lang/String;I)V となります。
res/ と resources.arsc に保存されているリソースの表示 説明
resources packages リソース テーブルで定義されているパッケージのリストを出力します。
resources configs --type type [--package package] apk-file 指定した type の設定のリストを出力します。typestring などのリソースタイプです。リソース テーブルのパッケージ名を指定する場合、--package オプションを含めます。指定しない場合、最初に定義されているパッケージが使用されます。
resources value --config config --name name --type type [--package package] apk-file confignametype で指定したリソースの値を出力します。type オプションには string などのリソースタイプを指定します。リソース テーブルのパッケージ名を指定する場合、--package オプションを含めます。指定しない場合、最初に定義されているパッケージが使用されます。
resources names --config config --type type [--package package] apk-file 設定とタイプに対応するリソース名のリストが出力されます。type オプションには string などのリソースタイプを指定します。リソース テーブルのパッケージ名を指定する場合、--package オプションを含めます。指定しない場合、最初に定義されているパッケージが使用されます。
resources xml --file path apk-file バイナリ XML ファイルを人間が読み取れる形式で出力します。file オプションを含めて、ファイルへのディレクトリを指定します。