Android 분석

지정된 위치에서 파일(AAB, APK, JAR, AAR)을 분석하고 사용 가능한 모든 세부정보를 다시 보고합니다.

사용

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

옵션

  • --analysis=PARAM - 출력을 필터링할 분석 카테고리 (기본, 최적화)입니다. 쉼표로 구분된 값을 지원합니다 (기본값: 모두).
  • -f,--format=PARAM - 출력 형식: json, textproto. 생략하면 출력이 사람이 읽을 수 있는 형식으로 지정됩니다.
  • -h,--help - 지정된 명령어의 도움말 메시지를 표시합니다.

android 옵션:

  • --sdk=PARAM - Android SDK의 경로
  • -v,--verbose - 문제 해결을 위해 상세 출력을 사용 설정합니다.
  • -V,--version - 버전 정보를 출력하고 종료합니다.

위치 인수

  • <path> - 분석할 대상 파일의 경로(AAB, APK, JAR, AAR)입니다.

설명

android analyze는 애플리케이션 패키지 (.aab, .apk) 또는 라이브러리 보관 파일 (.aar, .jar)과 같은 하나 이상의 Android 아티팩트를 검사하고 자세한 빌드, 구조, 성능 메타데이터를 보고합니다.

지원되는 파일 형식

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: 스크립트 및 CI 파이프라인에서 프로그래매틱 방식으로 파싱하는 데 적합한 기계 가독형 JSON을 내보냅니다.
  • -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"
    }
  ]
}