一起看 I/O | Android 性能相关最新动态

一起看 I/O | Android 性能相关最新动态

作者 / Ben Weiss

过去几年来,我们一直致力于让性能提升工作变得更易上手、回报更高。我们将在本文中分享这一领域的最新发展动态。为您介绍基准配置文件、Android Studio 中的工具改进,以及我们如何让这项技术更好地在后台为您服务。此外,我们非常高兴地分享在基准配置文件上使用的全新实验性技术,助您大幅提升启动性能。欢迎您继续阅读以全面了解 2023 年 Google I/O 大会期间发布的 Android 性能的最新动态,我们也在本文结尾处与您分享了性能探索之旅中切实可行的举措。

基准配置文件更新

基准配置文件可以通过避免即时 (JIT) 编译,将应用启动和运行时的代码执行速度提升约 30%。为此,我们构建了多款工具来帮助您简化基准配置文件的创建和维护工作,其中包括全新 Android Studio 模板基准配置文件 Gradle 插件。现在,您可以借助 Android Studio Hedgehog 和 Android Gradle 插件 8.0.0 或更新版本,即刻开始使用这两款工具。

借助基准配置文件 Gradle 插件

简化配置文件生成

基准配置文件 Gradle 插件可以在本地开发和 CI 过程中,进一步简化基准配置文件的生成和维护过程。此插件可以执行生成基准配置文件和将其安装到应用模块所需的所有必要步骤。

如要使用此插件,您可以在项目中添加一个插桩测试模块,并设定一组通过在您的应用中导航来模拟关键用户历程的测试。在运行插桩测试时,基准配置文件 Gradle 插件会跟踪在这类用户历程中执行的所有类和方法,并基于这些类和方法生成基准配置文件。然后,此插件会将生成的基准配置文件复制到应用模块的源集中。

应用此插件后,您可以使用构建脚本中的全新 baselineProfile 块对其进行配置。generateBaselineProfile 任务会代您运行所有基准配置文件测试。由此生成的配置文件将存储在生成的文件夹中,供您在此访问。这些功能使得在本地和远程 CI 服务器上自动生成基准配置文件的过程更顺畅。此外,通过指定要在生成配置文件时使用的 Gradle 管理的设备,您甚至不再需要附加实体设备。此插件的 DSL 支持高度可配置的设置,让您可以自动化并重现基准配置文件生成过程。

您可以查看代码示例 (目前位于单独分支) 和指导文档,即刻开始使用。

使用 AGP 8 及以上版本 创建 和管理 多个基准配置文件源文件

AGP 8 及以上版本支持多源文件、多种特定配置文件和上方提及的新版 Gradle 插件,且支持更轻松地生成基准配置文件。现在,基准配置文件的默认位置是 src/main/baselineProfiles/。此插件可将储存在此目录中的基准配置文件源文件提取并合并到您的应用中。帮助您单独存储应用启动和每个不同的用户历程所需的配置文件。

△ Macrobenchmark 示例中的多个基准配置文件源文件

使用 Android Studio 基准配置文件 生成器模板更轻松上手

为了帮助您开始使用基准配置文件,Android Studio Hedgehog (2023.1.1) 添加了基准配置文件生成器模块向导模板。使用此模板,您的应用可以通过视觉辅助方式设置基准配置文件。

首先前往 "文件">"新建">"新模块",然后在模板列表中选择 "基准配置文件生成器"。

△ 基准配置文件生成器向导

操作完成后,此模板将为您进行多项更改。它会创建包含基本生成器和基准测试的全新 :baselineprofile 测试模板。BaselineProfileGenerator 类会为您创建基本基准配置文件,而 StartupBenchmarks 可以验证一切是否合乎预期。此外,系统将在相关模块中应用基准配置文件 Gradle 插件。最后,此生成器将添加有关 androidx.profileinstaller 的依赖项,以协助进行本地验证并确保向后兼容性。

在这里,您只需执行 "生成基准配置文件" 运行配置,此操作会运行所含的基准配置文件生成器,并将生成的配置文件复制到 src/release/generated/baselineProfile。

△ "生成基准配置文件" 运行配置

运行配置会调用 :app:generateBaselineProfile 任务,查找所有基准配置文件生成器并只运行这些生成器。

BaselineProfileGenerator 是一个非常基础的生成器,它只会启动您的应用并等待应用启动完成。我们建议为您应用的每个关键用户历程创建一个基准配置文件。由于不同应用的用户历程各不相同,您需要自行决定优化哪些内容。可以先从与业务成果直接相关的任何内容开始,如注册、登录、结帐或您应用提供的其他主要操作。您可以从我们的代码示例中寻找灵感。

欢迎您立即下载 Android Studio Hedgehog Canary,开始体验:

https://developer.android.google.cn/studio/preview

如需了解整个新手入门过程导览,您可以查看已更新的 Codelab: 通过基准配置文件提升应用性能:

https://developer.android.google.cn/codelabs/android-baseline-profiles-improve

引入启动配置文件和 Dex 布局优化

自版本 8.1 起,Android Gradle 插件 (AGP) 便可将应用启动所需的代码导入应用的主要 Dex 文件。这项优化被称为 Dex 布局优化,有助于减少应用启动期间发生的 Dex 页面错误。由于自应用启动至应用完成启动的整个过程只需加载一个 Dex 文件,这使得应用启动速度大幅提升。

△ Dex 布局优化前后

虽然 AGP 可以为您的应用创建单独的 Dex 文件,但若没有您的帮助,它无法知道是什么完全定义应用启动。这时,启动配置文件就可以派上用场了。您可以将启动配置文件视作专为应用启动定制的基准配置文件的一个子集。两者拥有相同的格式,并且使用相同的底层技术。由于每个应用的启动过程并不相同,库对启动配置文件毫无助益。

与需要解释和 JIT 编译的应用相比,基准配置文件使得性能提升了约 30 %,例如在推送更新后。我们对 Dex 布局优化进行的早期测试显示,除了基准配置文件带来的提升之外,这项优化使得应用启动的性能额外提升了 30%。这些性能提升已经在冷启动中十分常见,即使您的生产应用已经拥有运行良好的云配置文件,这项优化也会大有裨益。

如要充分利用 Dex 布局优化和启动配置文件,您需要让 Android 框架知道您的应用何时完成启动。如果您什么都不做,此框架将在绘制第一帧时便认为应用已经完成启动。为了确保启动配置文件包含用户接管之前的所有信息,请使用 reportFullyDrawn API。您可以通过 FullyDrawnReporter 或 Compose ReportDrawn API 实现这一点。此外,您需要定义启动基准测试的终点,即您认为启动完成的时间点。将 reportFullyDrawn 调用与您期望在应用可供使用时屏幕上显示的内容相匹配。

您可以在指导文档中详细了解 Dex 布局优化和启动配置文件:

https://developer.android.google.cn/topic/performance/baselineprofiles/dex-layout-optimizations

Macrobenchmark 库的最新进展

Macrobenchmark 库让您可以衡量应用性能,创建基准配置文件并监控应用更改对应用性能有无影响。1.2.0 版将很快升级到 Beta 版。以下是一些功能亮点。

在基准测试中使用全新 Android 平台功能

在 Android 13 及更高版本中,您可以使用 BaselineProfileRule 在未取得 Root 权限的设备或模拟器上生成基准配置文件。

在 Android 14 及更高版本中,您不再需要每次运行基准测试时都重新安装目标应用。这让应用可以在运行之间保存状态,如缓存、会话状态或登录令牌。此项更改让您在检测之前无需手动注入 (需要已取得 Root 权限的设备) 这些状态。

新 API

基准配置文件生成已不再处于实验阶段

在使用 collectBaselineProfile 方法创建基准配置文件时,您可以选择从代码中删除实验性 API 注解。但如果您仍然使用实验性 API,我们会提供一款新的 API 供您考虑。

新引入的 collectStableBaselineProfile 会运行并等待,直到系统认为配置文件对于给定迭代数量来说足够稳定。这意味着您应用的基准配置文件将能更好地反映应用在执行代码路径时的具体操作。

@OptIn(ExperimentalStableBaselineProfilesApi::class)
@Test
fun profileGenerator() {
   rule.collectStableBaselineProfile(
       packageName = TARGET_PACKAGE,
       maxIterations = 10
   ) {
       profileBlock()
   }
}

自定义跟踪记录处理让指标更有效

PerfettoTraceRule 可以在测试中启用自定义跟踪记录收集,而不再需要基准测试 (需要 API 级别 23 及以上)。这是一项非常强大的功能,让用户可以收集与测试相关的性能和时间数据。

PerfettoTraceProcessor 支持查询跟踪记录内容,并且是所有现有 Macrobenchmark Metric API 的幕后引擎。现在,您可以将它与 TraceMetric 搭配使用,来制定完全自定义的指标,就像 Macrobenchmark 对 Perfetto 系统跟踪记录的任何信息所执行的操作一样。这是另外一项强大的功能,便于用户进一步自定义基准。

从基准测试中归因功耗

全新 PowerMetric API 可用于衡量耗电量和电源状态。这项非常有用的功能让用户可以跟踪基准测试的耗电量。

问题修复和其他改进

Macrobenchmark 的幕后团队还在人体工程学方面进行了多项改进,修复了错误,并改善了整体行为。如需了解详情,您可以参阅官方文档。若要深入了解,您可以查看所有版本说明,其中包含附加代码和问题跟踪。

Android Studio 电源性能分析器

Android Studio Hedgehog 采用全新性能分析器,可以展示按照子系统 (如相机、GPS 等) 细分的实体设备的功耗情况。这些数据会在记录系统跟踪记录时提供,并且有助于直观地将设备功耗与应用中正在发生的操作关联起来。例如,您可以执行 A/B 测试,批处理 API 和单独调用 API,以优化蜂窝网络电源轨中的功耗。

△ Android Studio Hedgehog 中的全新电源性能分析器 (Power Profiler)

首先,使用 Pixel 6 及以上版本的设备记录系统跟踪记录并将其加载至 Android Studio,或者使用性能分析器直接从附加设备捕获系统跟踪记录。

为什么需要重视性能

在处理应用性能时,找到正确的入手点并非易事。通过与 Android 开发者社区合作,我们发现工程师有时缺乏正确的信息来证明致力于提升应用性能的重要性。

提升性能对于用户和企业来说有诸多优势。对于用户而言,能够快速响应的应用可以带来更出色的用户体验。您的用户将能快速且轻松地获得他们需要的信息,并且更有可能继续使用您的应用。

对于企业而言,性能提升可以增加收入并降低成本。若用户满意您的应用,他们更有可能通过购买或其他操作,促进您的业务增长。此外,高性能应用有助于节省开发和维护成本。

后续步骤

  1. 借助全新 Gradle 插件设置您的应用,以开始使用基准配置文件

  2. 升级至 Android Gradle 插件 8 及以上版本

  3. 将现有基准配置文件移入新的默认目录 src/main/baselineProfiles/

  4. 下载 Android Studio Hedgehog Canary,查看基准配置文件模板和电源性能分析器 (Power Profiler)

  5. 查看我们更新的 Codelab 获取导览

  6. 使用 Fully Drawn 和 collectStableBaselineProfile API,获取更完善的基准配置文件

  7. 开始使用 Dex 布局优化,获得更多性能提升

  8. 实施您的专属 Macrobenchmark 测试,以衡量性能随时间的变化情况

  9. 在 Pixel 6 及以上版本设备上记录系统跟踪,查看不同子系统 (相机、GPS、CPU 等) 的功耗

  10. 👏 分享本文,帮助更多开发者提升应用性能

版权声明

禁止一切形式的转载-禁止商用-禁止衍生 申请授权

脉脉不得语
脉脉不得语
Zhengzhou Website
Android Developer | https://androiddevtools.cn and https://androidweekly.io Funder | GDG Zhengzhou Funder & Ex Organizer | http://Toast.show(∞) Podcast Host

你已经成功订阅到 Android 开发技术周报
太棒了!接下来,完成检验以获得全部访问权限 Android 开发技术周报
欢迎回来!你已经成功登录了。
Unable to sign you in. Please try again.
成功!您的帐户已完全激活,您现在可以访问所有内容。
Error! Stripe checkout failed.
Success! Your billing info is updated.
Error! Billing info update failed.
🍗