android analyze

Analyzes the file(s) (AAB, APK, JAR, AAR) at the given location(s) and reports back all available details.

Usage

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

Options

  • --analysis=PARAM - Analysis category to filter output (basic, optimization). Supports comma-separated values (default: all).
  • -f,--format=PARAM - Output format: json, textproto. If omitted, output is formatted for human readability.
  • -h,--help - Shows the help message for the specified command.

android options:

  • --sdk=PARAM - Path to the Android SDK.
  • -v,--verbose - Enable verbose output for troubleshooting.
  • -V,--version - Print version information and exit.

Positional arguments

  • <path> - Path to the target file(s) to analyze (AAB, APK, JAR, AAR).

Description

android analyze inspects one or more Android artifacts—such as application packages (.aab, .apk) or library archives (.aar, .jar)—and reports detailed build, structure, and performance metadata.

Supported File Types

android analyze supports both application packages and library archives:

  • Android App Bundles (.aab) and APKs (.apk): Evaluates application-level metadata, compilation configurations, DEX characteristics, and optimization outputs.
  • Android Archives (.aar) and Java Archives (.jar): Evaluates library-level metadata, DEX compilation metrics, keep rule impact, and bundled native components.

Analysis Categories (--analysis)

By default, all available analysis categories are performed. Use --analysis=<category> to filter output to specific categories (comma-separated).

  • basic: Basic metadata such as package name and version for applications: Reports application identification details (e.g., package name, version name, and version code for applications).

  • optimization: Compiler optimizations, DEX sizes, and code-shrinking metadata:

    • For applications (.aab, .apk): Reports Android Gradle Plugin (AGP) version, uncompressed DEX size, R8 shrinking and optimization settings and percentages, R8 resource optimization status, and DEX marker metadata.
    • For libraries (.aar, .jar): Reports D8 and R8 DEX sizes, keep ratio, item collection summaries (kept vs. total classes, methods, and fields), used and unused package-wide keep rules with impact radius, blocked consumer keep rules, packaged native libraries (.so files), and warnings for detected optimization antipatterns.

Output Formatting (-f, --format)

  • By default, output is printed in a human-readable summary format.
  • -f json, --format=json: Emits machine-readable JSON, suitable for programmatic parsing by scripts and CI pipelines.
  • -f textproto, --format=textproto: Emits Protobuf text format (textproto).

Examples

Analyze an APK with all default categories:

android analyze app-release.apk

Analyze multiple artifacts together:

android analyze app-release.apk library.aar

Analyze an AAB and output the results as JSON:

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

Sample JSON output:

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

Analyze a Java Archive (JAR) library with all default categories:

android analyze library.jar

Analyze an Android Archive (AAR) library filtering for the optimization category and outputting as JSON:

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

Sample JSON output:

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