通过避免对包含的代码路径进行解释和即时 (JIT) 编译步骤,基准配置文件可将代码执行速度从首次启动开始提高约 30%。
通过在应用或库中提供基准配置文件,Android Runtime (ART) 可以通过预先 (AOT) 编译优化指定的代码路径,从而为每个新用户和每次应用更新提供性能增强。这种配置文件引导式优化 (PGO) 可让应用从首次启动开始就优化启动速度、减少交互卡顿并提高用户的整体运行时性能。
这些性能增强直接带来业务指标的改善,例如用户留存率、交易量和评分。您可以在 Josh、Lyft、TikTok 和 Zomato 的案例中详细了解性能如何影响业务指标。
基准配置文件的优势
基准配置文件可让所有用户互动(例如应用启动、在屏幕之间导航或滚动内容)从首次运行起就更流畅。通过提高应用的速度和响应能力,基准配置文件可以带来更多的每日活跃用户和更高的平均回访率。
基准配置文件通过提供可提升应用从首次启动开始的运行时性能的常见用户互动,帮助指导应用启动之外的优化。引导式 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.4
- Profile Installer:
androidx.profileinstaller:profileinstaller:1.4.1
我们建议使用最新版本的 AGP 来创建和管理基准配置文件。以下是不同 AGP 版本的主要功能:
AGP 版本 | 功能 |
---|---|
8.4 | 使用 Gradle 封装器命令行工具或 Android Studio 在本地安装不可调试的构建版本时,会安装基准配置文件,使本地发布构建的性能更接近生产环境。此更新不会影响基准配置文件的生产性能。 |
8.3 |
|
8.2 |
|
8.0 | 建议的最低版本:使用基准配置文件 Gradle 插件通过单个 Gradle 任务生成基准配置文件。
|
7.4 |
支持的最低版本:应用可以从库中消耗基准配置文件,并在 src/main/baseline-prof.txt 文件中提供自己的基准配置文件。
|
配置文件生成示例
以下是一个示例类,用于使用建议的 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 性能中的“使用基准配置文件”部分。
基准配置文件的工作原理
在开发应用或库时,请考虑定义基准配置文件,以涵盖渲染时间或延迟很重要的常见用户互动。以下是它们的工作原理:
您的应用会生成人类可读的配置文件规则,并在应用中编译成二进制形式。您可以在
assets/dexopt/baseline.prof
中找到它们。然后,您可以像往常一样将 AAB 上传到 Google Play。Google Play 会处理配置文件并将其与 APK 一起直接分发给用户。在安装过程中,ART 会对配置文件中的方法执行 AOT 编译,从而使这些方法执行得更快。如果配置文件包含在应用启动或帧渲染期间使用的方法,用户可能会体验到更快的启动时间和更少的卡顿。
此流程与云配置文件聚合协作,根据应用随时间的实际使用情况来微调性能。

云配置文件
云配置文件提供了另一种形式的 PGO(配置文件引导式优化)——由 Google Play 商店聚合并分发用于安装时编译——与基准配置文件一起使用。
虽然云配置文件是由用户与应用的实际互动驱动的,但它们在更新后需要数小时到数天才能分发,这限制了它们的可用性。在配置文件完全分发之前,新应用或更新应用的用户会获得次优的应用性能。此外,云配置文件仅支持运行 Android 9 (API level 28) 或更高版本的 Android 设备,并且仅适用于拥有足够庞大用户群的应用。
不同 Android 版本中的编译行为
Android 平台版本使用不同的应用编译方法,每种方法都有相应的性能权衡。基准配置文件通过为所有安装提供配置文件,改进了以前的编译方法。
Android 版本 | 编译方法 | 优化方法 |
---|---|---|
5 到 6 (API level 21 到 23) | 完整 AOT | 整个应用在安装过程中进行优化,导致使用应用的等待时间过长,RAM 和磁盘空间占用增加,从磁盘加载代码的时间变长,这可能会增加冷启动时间。 |
7 到 8.1 (API level 24 到 27) | 部分 AOT(基准配置文件) | 当应用模块定义此依赖项时,基准配置文件会在首次运行时由 androidx.profileinstaller 安装。ART 可以通过在应用使用期间添加额外的配置文件规则,并在设备空闲时编译它们来进一步改进此功能。这可以优化磁盘空间和从磁盘加载代码的时间,从而缩短应用的等待时间。 |
9 (API level 28) 及更高版本 | 部分 AOT(基准 + 云配置文件) | Play 在应用安装期间使用基准配置文件来优化 APK 和云配置文件(如果可用)。安装后,ART 配置文件会上传到 Play,经过聚合,然后在其他用户安装或更新应用时作为云配置文件提供给他们。 |
已知问题
以下是可能的问题和解决方案,或正在开发中的解决方法的问题:
在某些设备(包括 OnePlus 设备)上,由于权限设置,基准配置文件生成可能会失败。要解决此问题,请在“开发者选项”设置中关闭“停用权限监控”选项。
Firebase Test Lab 设备(包括 Gradle 管理的 Test Lab 设备)不支持基准配置文件生成(问题 #285187547)。
要成功为库提供基准配置文件,请至少使用 Baseline Profile 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 商店内部应用共享不支持基准配置文件;但是,内部测试轨道支持。
某些设备(例如华为设备)上的电池优化可能会干扰配置文件安装。为确保您的配置文件有效安装,请在您的基准测试设备中停用任何电池优化。
其他资源
为您推荐
- 注意:如果 JavaScript 关闭,则会显示链接文本
- 创建基准配置文件 {:#creating-profile-rules}
- 不使用 Macrobenchmark 创建和衡量基准配置文件
- DEX 布局优化和启动配置文件