Android 分析

指定された場所にあるファイル(AAB、APK、JAR、AAR)を分析し、利用可能なすべての詳細を報告します。

使用方法

android analyze [-h] [--analysis=PARAM] [--format=PARAM] <path>

オプション

  • --analysis=PARAM - 出力をフィルタする分析カテゴリ(basic、optimization)。カンマ区切り値をサポートします(デフォルト: すべて)。
  • -f,--format=PARAM - 出力形式: json、textproto。省略すると、出力は人が読める形式になります。
  • -h,--help - 指定したコマンドのヘルプ メッセージを表示します。

android のオプション:

  • --sdk=PARAM - Android SDK へのパス。
  • -v,--verbose - トラブルシューティング用の詳細出力を有効にします。
  • -V,--version - バージョン情報を出力して終了します。

位置引数

  • <path> - 分析対象のファイル(AAB、APK、JAR、AAR)のパス。

説明

android analyze は、1 つ以上の Android アーティファクト(アプリケーション パッケージ(.aab、.apk)やライブラリ アーカイブ(.aar、.jar)など)を検査し、ビルド、構造、パフォーマンスに関する詳細なメタデータをレポートします。

サポートされているファイル形式

android analyze は、アプリケーション パッケージとライブラリ アーカイブの両方をサポートしています。

  • Android App Bundle(.aab)と APK(.apk): アプリケーション レベルのメタデータ、コンパイル構成、DEX 特性、最適化出力を評価します。
  • Android アーカイブ(.aar)と Java アーカイブ(.jar): ライブラリレベルのメタデータ、DEX コンパイル指標、キープルールの影響、バンドルされたネイティブ コンポーネントを評価します。

分析カテゴリ(--analysis)

デフォルトでは、利用可能なすべての分析カテゴリが実行されます。--analysis=<category> を使用して、出力を特定のカテゴリ(カンマ区切り)にフィルタします。

  • basic: アプリのパッケージ名やバージョンなどの基本的なメタデータ。アプリの識別情報(アプリのパッケージ名、バージョン名、バージョン コードなど)を報告します。

  • optimization: コンパイラの最適化、DEX サイズ、コード圧縮のメタデータ:

    • アプリケーション(.aab、.apk)の場合: Android Gradle プラグイン(AGP)のバージョン、非圧縮 DEX サイズ、R8 の圧縮と最適化の設定と割合、R8 のリソース最適化ステータス、DEX マーカー メタデータを報告します。
    • ライブラリ(.aar、.jar)の場合: D8 と R8 の DEX サイズ、保持率、アイテム コレクションの概要(保持されたクラス、メソッド、フィールドと合計クラス、メソッド、フィールド)、使用済みおよび未使用のパッケージ全体の保持ルールと影響範囲、ブロックされたコンシューマー保持ルール、パッケージ化されたネイティブ ライブラリ(.so ファイル)、検出された最適化アンチパターンの警告を報告します。

出力形式(-f, --format)

  • デフォルトでは、出力は人が読める形式のサマリー形式で出力されます。
  • -f json, --format=json: 機械で読み取り可能な JSON を出力します。これは、スクリプトや CI パイプラインによるプログラムによる解析に適しています。
  • -f textproto, --format=textproto: Protobuf テキスト形式(textproto)を出力します。

例

すべてのデフォルト カテゴリで APK を分析します。

android analyze app-release.apk

複数のアーティファクトをまとめて分析する。

android analyze app-release.apk library.aar

AAB を分析し、結果を JSON 形式で出力します。

android analyze --format=json app-release.aab

JSON 出力の例:

{
  "results": [
    {
      "optimization": {
        "bundleAnalysisResult": {
          "agpVersion": "9.3.2",
          "r8Json": {
            "version": "9.3.16",
            "options": {
              "isRepackageClassesEnabled": true,
              "isProguardCompatibilityModeEnabled": false
            },
            "stats": {
              "shrinkingRatio": 0.9606,
              "optimizationRatio": 0.9551,
              "obfuscationRatio": 0.9622
            },
            "resourceOptimizationStatus": "R8_RESOURCE_OPTIMIZATION_STATUS_DISABLED",
            "r8DexChecksumStatus": "EXACT_MATCH"
          },
          "r8DexMarkerMetadata": {
            "r8Enabled": true,
            "d8Enabled": false,
            "fullModeEnabled": true
          },
          "mappingObfuscationRatio": 0.97108626,
          "dexHeuristicObfuscationRatio": 0.97108626,
          "uncompressedDexSizeBytes": "6198152"
        }
      },
      "artifactPath": "app-release.aab",
      "basic": {
        "appInfo": {
          "packageName": "com.google.samples.apps.nowinandroid",
          "versionName": "1.0",
          "versionCode": "1"
        }
      }
    }
  ]
}

すべてのデフォルト カテゴリを使用して Java アーカイブ(JAR)ライブラリを分析します。

android analyze library.jar

optimization カテゴリをフィルタリングして JSON として出力する Android アーカイブ(AAR)ライブラリを分析します。

android analyze --analysis=optimization -f json library.aar

JSON 出力の例:

{
  "results": [
    {
      "optimization": {
        "libraryAnalysisResult": {
          "dex": {
            "d8CompileResult": {
              "dexSizeBytes": 2117400
            },
            "r8CompileResult": {
              "dexSizeBytes": 1100,
              "configuration": {
                "keepRules": [
                  {
                    "source": "-keep class com.example.ExampleClass_* {\n  static *** builder();\n}",
                    "keptItemCount": 2
                  },
                  {
                    "source": "-keep class com.example.SomeClass {\n  public static *** SDK_ROOT_CLASS_NAME;\n}",
                    "keptItemCount": 2
                  }
                ]
              },
              "classes": {
                "itemCount": 3437,
                "keptItemCount": 2,
                "noObfuscationCount": 2,
                "noOptimizationCount": 2,
                "noShrinkingCount": 2
              },
              "fields": {
                "itemCount": 9835,
                "keptItemCount": 1,
                "noObfuscationCount": 1,
                "noOptimizationCount": 1,
                "noShrinkingCount": 1
              },
              "methods": {
                "itemCount": 16333,
                "keptItemCount": 1,
                "noObfuscationCount": 1,
                "noOptimizationCount": 1,
                "noShrinkingCount": 1
              }
            },
            "validateConsumerKeepRulesResult": {}
          },
          "r8Version": "9.5.17-dev",
          "version": "kg=1_r8=9.5.17-dev"
        }
      },
      "artifactPath": "library.aar"
    }
  ]
}