基准配置文件概览

基准配置文件可以略过所包含代码路径的解译和即时 (JIT) 编译步骤,从而使应用首次启动时的代码执行速度即可提高约 30%。

通过在应用或库中分发基准配置文件,Android 运行时 (ART) 可以通过预先 (AOT) 编译来优化指定的代码路径,从而针对每位新用户以及每个应用更新提升性能。这种配置文件引导式优化 (PGO) 可让应用优化启动、减少互动卡顿,并在用户首次启动应用时即可提高整体的运行时性能。

上述性能增强能够直接提高用户留存率、交易次数和评分等业务指标。如需详细了解性能对业务指标的影响,请阅读来自 JoshLyftTikTokZomato 的故事。

基准配置文件的优势

利用基准配置文件,自应用首次运行起,所有用户互动(例如应用启动、切换界面或滚动浏览内容)都会变得更加顺畅。通过提升应用的速度和响应能力,基准配置文件可以提高日活跃用户数和平均回访率。

基准配置文件可以帮助引导应用启动后的优化,通过提供常见的用户互动,从应用首次启动时即开始改进应用运行时环境。引导式 AOT 编译不依赖于用户设备,可以在开发机器(而非移动设备)上为每个版本执行一次。与单纯依赖云配置文件相比,通过使用基准配置文件发布版本,您可以更快速地实现应用优化。

如果不使用基准配置文件,所有应用代码都会在经过解译后在内存中进行 JIT 编译,或在设备处于空闲状态时在后台被写入 odex 文件。安装或更新应用后,一开始运行该应用时,用户的体验会不太理想,直到新的代码路径得到优化。根据测量结果,许多应用在优化后性能会提升约 30%。

启动配置文件

启动配置文件与基准配置文件类似,不同之处在于前者是在编译时使用,而不是用于设备端优化。启动配置文件用于优化 DEX 文件的布局,以缩短启动时间。启动配置文件中标识的代码会放在主 classes.dex 文件中,其他代码会放在单独的 DEX 文件中。这样可以减少应用启动期间的页面故障数,从而缩短启动时间。如需详细了解启动配置文件和 DEX 布局优化可以如何缩短应用启动时间,请参阅 DEX 布局优化和启动配置文件

开始使用

如需开始优化现有应用的性能,请参阅创建基准配置文件

依赖项链提供稳定发布版本和开发发布版本。如需生成并安装基准配置文件,请使用以下受支持版本或更高版本的 Android Gradle 插件、Macrobenchmark 库和配置文件安装程序。需要使用这些依赖项的时间各不相同,它们会以工具链的形式协同工作,以构建最佳的基准配置文件。

  • Android Gradle 插件:com.android.tools.build:8.0.0
  • Macrobenchmark 库:androidx.benchmark:benchmark-macro-junit4:1.3.3
  • 配置文件安装程序:androidx.profileinstaller:profileinstaller:1.4.1

我们建议您使用最新版本的 AGP 创建和管理基准配置文件。以下是不同版本的 AGP 附带的主要功能:

AGP 版本 功能
8.4 使用 Gradle 封装容器命令行工具或 Android Studio 安装基准配置文件的不可调试 build 的本地应用安装,以便本地发布 build 的性能与生产环境更接近。此更新不会影响基准配置文件的正式版性能。
8.3
  • 完整源代码集目录支持(库模块):现在,对于库模块和应用模块,声明多个基准配置文件源文件,并使用变体感知目录,例如 src/free/generated/baselineProfiles/baseline-prof1.txt
  • 基准配置文件包含脱糖类
8.2
  • R8 重写规则:D8 和 R8 可以转换人类可读的基准和启动配置文件规则,以完整捕获优化应用性能所需的所有规则。将方法的基准配置文件覆盖率提高约 30%,将应用性能提高约 15%。
  • 启动配置文件:生成这种新型的基准配置文件,用于说明 DEX 中的代码布局。将启动性能额外提高约 15%;对于大型应用,升幅可能更高。
8.0 建议的最低版本:使用基准配置文件 Gradle 插件,通过单个 Gradle 任务生成基准配置文件。
  • 完整源代码集目录支持(应用模块):声明多个基准配置文件源文件,并使用变体感知目录,例如 src/free/generated/baselineProfiles/baseline-prof1.txt
7.4 支持的最低版本:应用可以使用库中的基准配置文件,并在 src/main/baseline-prof.txt 文件中提供自己的基准配置文件。
  • 从 app bundle 构建 APK 时,系统会正确打包基准配置文件(问题 230361284)。
  • 对于具有多个 .dex 文件的应用,系统会针对主要 .dex 文件正确打包基准配置文件。

配置文件生成示例

以下示例类使用建议的 Macrobenchmark 库,针对应用启动以及几项导航和滚动事件创建基准配置文件:

@OptIn(ExperimentalBaselineProfilesApi::class)
class BaselineProfileGenerator {
    @get:Rule
    val baselineProfileRule = BaselineProfileRule()

    @Test
    fun appStartupAndUserJourneys() {
        baselineProfileRule.collect(packageName = PACKAGE_NAME) {
            // App startup journey.
            startActivityAndWait()

            device.findObject(By.text("COMPOSE LAZYLIST")).clickAndWait(Until.newWindow(), 1_000)
            device.findObject(By.res("myLazyColumn")).also {
                it.fling(Direction.DOWN)
                it.fling(Direction.UP)
            }
            device.pressBack()
        }
    }
}

查看这些代码时,您可以参阅 GitHub 上的性能示例,获取完整上下文和更多详细信息。

应添加的内容

在应用中使用基准配置文件时,您可以添加应用启动代码和常见的用户互动,例如切换界面或滚动浏览。您还可以收集完整的流程,例如注册、登录或付款。您认为至关重要的任何用户体验历程都适合利用基准配置文件来提升运行时性能。

如果您正在实验使用不同的方法来提升性能,请考虑为两个实验组都添加基准配置文件。这样,您就可以确保所有用户都能以一致的方式运行编译后的代码,从而更轻松地解读结果。

库可以提供自己的基准配置文件并将其随版本一起发布,以便提升应用性能。例如,请参阅“Jetpack Compose 性能”中的“使用基准配置文件”部分

基准配置文件的工作原理

在开发应用或库时,请考虑定义基准配置文件,涵盖渲染时间或延迟时间非常重要的常见用户互动。 其工作原理如下:

  1. 系统会为您的应用生成人类可读的配置文件规则,并在应用中将其编译为二进制文件格式。您可以在 assets/dexopt/baseline.prof 中找到这些规则。然后,您可以照常将相应 AAB 上传到 Google Play。

  2. Google Play 会处理该配置文件,然后将其与 APK 一起直接发布给用户。在应用安装期间,ART 会对配置文件中的方法执行 AOT 编译,以便提升这些方法的执行速度。如果配置文件包含应用启动或帧渲染期间使用的方法,用户使用应用时,启动速度可能会更快,并且卡顿现象可能会更少。

  3. 此流程可与云配置文件汇总功能结合使用,在一段时间后根据应用的实际使用情况对性能进行微调。

图 1. 此图演示了从上传到向最终用户交付的基准配置文件工作流程,以及该工作流程与云配置文件的关系。

云配置文件

云配置文件与基准配置文件结合使用可以提供另一种形式的 PGO。云配置文件由 Google Play 商店进行汇总,并分发给用户以进行安装时编译。

虽然云配置文件是由用户与应用的实际互动驱动的,但它们在更新后需要几小时到几天的时间才能分发,这就限制了它们的可用性。在配置文件全面分发之前,用户在使用新应用或更新版应用时的应用性能会不太理想。此外,云配置文件仅支持搭载 Android 9(API 级别 28)或更高版本的 Android 设备,也只能针对用户群规模足够大的应用进行理想的扩缩。

各种 Android 版本的编译行为

Android 平台版本使用了不同的应用编译方法,每种方法在性能方面都进行了相应的权衡。基准配置文件提供了一个适用于所有安装的配置文件,对之前的编译方法进行了改进。

Android 版本 编译方法 优化方法
5 至 6(API 级别 21 至 23) 完全 AOT 整个应用会在安装期间进行优化,这会导致用户需要等待较长的时间才能使用应用,RAM 和磁盘空间使用量增加,并且从磁盘加载代码需要更长的时间,进而可能增加冷启动时间。
7 至 8.1(API 级别 24 至 27) 部分 AOT(基准配置文件) androidx.profileinstaller 会在应用首次运行时安装基准配置文件,届时应用模块会定义此依赖项。ART 可以通过以下方法进一步改进这一点:在应用使用期间添加额外的配置文件规则,并在设备空闲时编译这些规则。这可以优化磁盘空间利用率并缩短从磁盘加载代码所需的时间,从而减少用户使用应用需要等待的时间。
9(API 级别 28)及更高版本 部分 AOT(基准配置文件 + 云配置文件) 在应用安装期间,Play 会使用基准配置文件优化 APK 和云配置文件(如果有)。应用安装完毕后,ART 配置文件会上传到 Play 并汇总在一起,然后在其他用户安装或更新应用时,以云配置文件的形式提供给他们。

已知问题

下面列出了可能出现的问题和解决方案,或相关解决方案尚在开发中的问题:

  • 由于某些设备(包括一加设备)上的权限设置,基准配置文件生成可能会失败。如需解决此问题,请在开发者选项设置中关闭停用权限监控选项。

  • Firebase Test Lab 设备(包括 Gradle 管理的 Test Lab 设备)不支持生成基准配置文件(问题 285187547)。

  • 如需成功为库提供基准配置文件,请至少使用基准配置文件 Gradle 插件 1.2.3 或 AGP 8.3(问题 313992099)。

  • 如果您使用 ./gradlew app:generateBaselineProfile 命令生成基准配置文件,测试模块中的基准测试也会运行,并且结果会被舍弃。如果发生这种情况,您可以使用 -P android.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=BaselineProfile 运行命令,仅生成基准配置文件。此问题已在 AGP 8.2 中得到解决。

  • 用于为所有 build 类型生成基准配置文件的命令(./gradlew app:generateBaselineProfile)仅会为发布 build 类型生成基准配置文件。此问题已在 AGP 8.1 中修复。

  • 非 Google Play 商店应用分发渠道可能不支持在安装时使用基准配置文件。通过这些渠道安装应用的用户无法享受这些好处,直到后台 dexopt 运行(可能一夜过后)。

  • Play 商店内部应用分享不支持基准配置文件;不过,内部测试轨道支持基准配置文件。

  • 某些设备(例如华为设备)上的电池优化功能可能会干扰配置文件安装。为帮助确保您的配置文件能有效安装,请停用基准设备中的电池优化功能。

其他资源