确认启动配置文件优化

您可以使用 Android Studio 或查看 R8 build 元数据,以检查启动配置文件是否正常运行。

使用 Android Studio 进行确认

如需确认 DEX 布局优化,请使用 Android Studio 打开 APK 并验证 DEX 文件中的类。确保主 classes.dex 未完全填满。如果您的应用包含单个 DEX 文件,则可以在启用启动配置文件后检查该应用是否包含两个 DEX 文件。

如果启动类不适合单个 DEX 文件,Android Studio 会向您发出警告。 如需获取包含启动类中非启动方法数量的诊断信息,请在应用启动配置文件时对 settings.gradle 文件进行以下更改,确保 R8 编译器至少更新到 8.3.21 版:

Kotlin

pluginManagement {
    buildscript {
        repositories {
            mavenCentral()
            maven {
                url = uri("https://storage.googleapis.com/r8-releases/raw")
            }
        }
        dependencies {
            classpath("com.android.tools:r8:8.3.21")
        }
    }
}

Groovy

pluginManagement {
    buildscript {
        repositories {
            mavenCentral()
            maven {
                url uri('https://storage.googleapis.com/r8-releases/raw')
            }
        }
        dependencies {
            classpath 'com.android.tools:r8:8.3.6-dev"
        }
    }
}

使用 Gradle 进行构建时,请确保在以下命令中的 assembleRelease 后添加 --info

./gradlew assembleRelease --info

然后,诊断信息会输出到终端。

如果您的应用或任何库引用了任何 脱糖 API,则这些类的捆绑 兼容性实现始终包含在最后一个 DEX 文件中。此脱糖的最后一个 DEX 文件不参与 DEX 布局优化。

使用 bundle 元数据进行确认

从 AGP 8.8 开始,R8 会在 Android App Bundle (AAB) 中输出元数据,您可以使用这些元数据来检查 DEX 布局优化是否成功。如需检查优化是否有效,请执行以下操作:

  1. 构建应用的 AAB:

    ./gradlew app:bundleRelease
    
  2. 检查是否至少有一个 DEX 文件包含文本 "startup": true

    1. 打开元数据:

      unzip -j -o path-to-aab BUNDLE-METADATA/com.android.tools/r8.json && jq .dexFiles r8.json
      

      AAB 的路径可能类似于 app/build/outputs/bundle/release/app-release.aab

    2. 检查输出,输出应如下所示:

          inflating: r8.json
      [
        {
          "checksum": "f0b4b0ddb295812607f44efe03cf7a830056ccfddbdb81db3760d2281940e951",
          "startup": true
        }
      ]
      

    如果您仅在元数据中看到 "startup": false,则需要 启用启动配置文件,并确保启动 配置文件未混淆。

  3. 检查元数据中的 SHA-256 值是否与 AAB 中的 SHA-256 值一致。如需获取所有 DEX 文件的 SHA-256 值,请运行以下命令:

    unzip -o path-to-aab */dex/*.dex && sha256sum */dex/*
    

    输出应如下所示:

    Archive: app/build/outputs/bundle/release/myapp-release.aab
      inflating: base/dex/classes.dex
    f0b4b0ddb295812607f44efe03cf7a830056ccfddbdb81db3760d2281940e951  base/dex/classes.dex
    

    将哈希值与第 1 步中的“校验和”值进行比较。如果 SHA-256 值不一致,则可能是编译步骤干扰了 R8 输出 DEX 文件的能力。