基准配置文件通过避免解释和 即时 (JIT) 编译包含代码路径的步骤,将首次启动的代码执行速度提高约 30%。
通过在应用程序或库中提供基准配置文件,Android 运行时 (ART) 可以通过提前 (AOT) 编译优化指定的代码路径,为每个新用户和每个应用程序更新提供性能增强。这种配置文件引导优化 (PGO) 使应用程序能够优化启动、减少交互卡顿并从首次启动开始提高用户的整体运行时性能。
这些性能增强直接导致业务指标的改进,例如用户留存率、交易和评分。您可以在 Josh、Lyft、TikTok 和 Zomato 的故事中了解更多有关性能如何影响业务指标的信息。
基准配置文件的优势
基准配置文件使用户从首次运行开始的所有用户交互(例如应用程序启动、在屏幕之间导航或滚动浏览内容)更加流畅。通过提高应用程序的速度和响应能力,基准配置文件可以导致更多每日活跃用户和更高的平均回访率。
基准配置文件通过提供常见的用户交互来帮助引导超越应用程序启动的优化,这些交互可以从首次启动开始提高应用程序的运行时。引导式 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.0
- 配置文件安装程序:
androidx.profileinstaller:profileinstaller:1.3.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 级别 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,进行聚合,然后在其他用户安装或更新应用程序时以云配置文件的形式提供给他们。 |
已知问题
以下是可能出现的问题和解决方案,或者正在开发解决方法的问题
由于某些设备(包括 OnePlus 设备)上的权限设置,基线配置文件生成可能会失败。要解决此问题,请在“开发者选项”设置中关闭“禁用权限监控”选项。
基线配置文件生成不支持 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 商店内部应用程序共享 不支持基线配置文件;但是,内部测试轨道 支持。
某些设备(例如华为设备)上的电池优化可能会干扰配置文件安装。要帮助确保您的配置文件有效安装,请在基准测试设备中禁用任何电池优化。
其他资源
为您推荐
- 注意:JavaScript 关闭时显示链接文本
- 创建基线配置文件 {:#creating-profile-rules}
- 在没有 Macrobenchmark 的情况下创建和测量基线配置文件
- DEX 布局优化和启动配置文件