确认启动配置文件优化

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

使用 Android Studio 进行确认

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

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

Kotlin

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

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 布局优化。

使用软件包元数据进行确认

从 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 中的值相符。如需获取所有 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 文件。