创建启动配置文件

启动配置文件是基线配置文件的一个子集。构建系统使用启动配置文件通过改进 APK 的 DEX 文件中代码的布局来进一步优化其中包含的类和方法。使用启动配置文件,您的应用启动速度通常比仅使用基线配置文件快 15% 到 30%。

图 1. DEX 布局优化带来的代码局部性改进。

要求

我们建议使用以下工具与启动配置文件一起使用

  • Jetpack Macrobenchmark 1.2.0 或更高版本
  • Android Gradle 插件 8.2 或更高版本
  • Android Studio Iguana 或更高版本

此外,您需要在应用中进行以下设置

  • R8 已启用。对于您的发布版本,请设置 isMinifyEnabled = true
  • DEX 布局优化已启用。在应用模块的 build 文件的 baselineProfile {} 代码块中,设置 dexLayoutOptimization = true

创建启动配置文件

当您使用默认的基线配置文件生成器模板时,Android Studio 会在基线配置文件旁边创建一个启动配置文件。

创建和生成启动配置文件的常规步骤与创建基线配置文件的步骤相同。

创建启动配置文件的默认方法是使用 Android Studio 中的基线配置文件生成器模块模板。这包括形成基本启动配置文件的启动交互。要使用更多关键用户旅程 (CUJ) 增强此启动配置文件,请将您的应用启动 CUJ 添加到 rule 代码块中,并将 includeInStartupProfile 设置为 true。对于简单的应用,启动应用的 MainActivity 可能就足够了。对于更复杂的应用,请考虑添加进入应用的最常见入口点,例如从主屏幕启动应用或启动到深层链接

以下代码片段显示了一个基线配置文件生成器(默认情况下为 BaselineProfileGenerator.kt 文件),其中包括从主屏幕启动您的应用以及启动到深层链接。深层链接直接进入应用的新闻提要,而不是应用的主屏幕。

@RunWith(AndroidJUnit4::class)
@LargeTest
class BaselineProfileGenerator {

    @get:Rule
    val rule = BaselineProfileRule()

    @Test
    fun generate() {
        rule.collect(
            packageName = "com.example.app",
            includeInStartupProfile = true
        ) {
            // Launch directly into the NEWS_FEED.
            startActivityAndWait(Intent().apply {
                setPackage(packageName)
                setAction("com.example.app.NEWS_FEED")
            })
        }
    }
}

运行为应用生成基线配置文件配置,并在 src/<variant>/generated/baselineProfiles/startup-prof.txt 中找到启动配置文件规则。

确认启动配置文件优化

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

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

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

创建启动配置文件的注意事项

启动配置文件的类和方法输出受第一个 classes.dex 文件的大小限制。这意味着并非所有基线配置文件旅程也应该是启动配置文件旅程。

要确定在创建启动配置文件时要涵盖哪些用户旅程,请考虑大多数用户从哪里启动应用程序。通常是从启动器以及他们在登录后开始。这也是最基本的基线配置文件旅程。

在第一个用例得到涵盖后,请遵循应用启动的用户漏斗。在许多情况下,应用启动漏斗遵循以下列表

  1. 主启动器活动
  2. 触发应用启动的通知
  3. 可选启动器活动

从顶部开始处理此列表,并在 classes.dex 填满之前停止。要随后涵盖更多旅程,请将代码移出启动路径并添加更多旅程。要将代码移出启动路径,请在应用启动期间检查 Perfetto 跟踪并查找长时间运行的操作。您还可以使用启用方法跟踪宏基准测试,以自动获取应用启动期间方法调用的完整视图。