基线配置文件概述

基线配置文件通过避免解释和 即时 (JIT) 编译包含代码路径的步骤,将首次启动时的代码执行速度提高了约 30%。

通过在应用或库中提供基线配置文件,Android 运行时 (ART) 可以通过提前 (AOT) 编译优化指定的代码路径,为每个新用户和每个应用更新提供性能增强。此配置文件引导优化 (PGO) 使应用能够优化启动、减少交互卡顿并从首次启动开始提高用户的整体运行时性能。

这些性能增强直接导致业务指标(如用户留存率、交易量和评分)得到改善。您可以在来自 JoshLyftTikTokZomato 的案例中了解更多有关性能如何影响业务指标的信息。

基线配置文件的优势

基线配置文件使所有用户交互(例如应用启动、在屏幕之间导航或滚动内容)从第一次运行时变得更加流畅。通过提高应用的速度和响应能力,基线配置文件可以带来更多每日活跃用户和更高的平均回访率。

基线配置文件通过提供可从首次启动开始改善应用运行时的常见用户交互,帮助指导超越应用启动的优化。引导式 AOT 编译不依赖于用户设备,并且可以在开发机器上而不是移动设备上针对每个版本执行一次。通过发布包含基线配置文件的版本,应用优化比仅依赖 云配置文件 快得多。

如果不使用基线配置文件,所有应用代码要么在解释后在内存中进行 JIT 编译,要么在设备空闲时写入后台的odex文件中。安装或更新应用后,用户从第一次运行应用到新的代码路径被优化之前,体验都不佳。许多应用在优化后性能提升约 30%。

启动配置文件

启动配置文件类似于基线配置文件,但区别在于它们是在编译时使用,而不是用于设备上的优化。启动配置文件用于优化 DEX 文件的布局以提高启动时间。启动配置文件中识别的代码被放入主classes.dex文件中,其他代码被放入单独的 DEX 文件中。这通过减少应用启动期间的页面错误来缩短启动时间。要了解有关启动配置文件和 DEX 布局优化如何提高应用启动时间的更多信息,请参阅DEX 布局优化和启动配置文件

开始使用

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

依赖项链提供稳定和开发版本。要生成和安装基线配置文件,请使用以下支持的版本或更高版本的 Android Gradle 插件、Macrobenchmark 库和 Profile Installer。这些依赖项在不同时间需要,并作为一个工具链协同工作以实现最佳的基线配置文件。

  • Android Gradle 插件:com.android.tools.build:8.0.0
  • Macrobenchmark 库:androidx.benchmark:benchmark-macro-junit4:1.3.3
  • Profile Installer:androidx.profileinstaller:profileinstaller:1.4.1

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

AGP 版本 功能
8.4 使用Gradle 包装器命令行工具或 Android Studio 安装非可调试版本的本地应用安装基线配置文件,以便本地发行版本的性能更接近生产环境。此更新不影响基线配置文件的生产性能。
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文件中提供自己的基线配置文件。
  • 从应用包构建 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 中修复。

  • 生成所有构建类型的基线配置文件的命令——./gradlew app:generateBaselineProfile——仅为发行版构建类型生成基线配置文件。此问题已在 AGP 8.1 中修复。

  • 非 Google Play 商店应用分发渠道可能不支持在安装时使用基线配置文件。通过这些渠道安装的应用用户在后台 dexopt 运行之前(可能是在隔夜)不会看到好处。

  • Play 商店内部应用共享不支持基线配置文件;但是,内部测试轨道支持。

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

其他资源