android analyze

分析指定位置的文件(AAB、APK、JAR、AAR),并报告所有可用详细信息。

用法

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

选项

  • --analysis=PARAM - 用于过滤输出的分析类别(基本、优化)。支持逗号分隔值(默认值:all)。
  • -f,--format=PARAM - 输出格式:json、textproto。如果省略,输出将采用人类可读的格式。
  • -h,--help - 显示指定命令的帮助消息。

android 个选项:

  • --sdk=PARAM - Android SDK 的路径。
  • -v,--verbose - 启用详细输出以进行问题排查。
  • -V,--version - 输出版本信息并退出。

位置参数

  • <path> - 要分析的目标文件(AAB、APK、JAR、AAR)的路径。

说明

android analyze 会检查一个或多个 Android 工件(例如应用软件包 [.aab、.apk] 或库归档 [.aar、.jar]),并报告详细的 build、结构和性能元数据。

支持的文件类型

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

分析 Android Archive (AAR) 库,过滤 optimization 类别,并以 JSON 格式输出:

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"
    }
  ]
}