方法指南

性能提升之旅的升级指南

阅读用时:9 分钟
Alice Yuan
开发者关系工程师

表演历程升级指南

欢迎来到“效果聚焦周”的第 4 天。现在,您已经了解了我们最近推出的一些出色工具和最佳实践,例如 R8 优化器,以及使用基准配置文件启动配置文件的配置文件引导型优化,您可能想知道从何处开始性能改进之旅。

我们制定了一份分步式性能提升指南,无论您的移动开发团队规模如何,都能帮助您提升应用性能。无论您是只有一名开发者的应用,刚刚开始着手提升性能,还是拥有一个专门负责提升 Android 性能的团队,这份指南都能为您提供帮助。

性能分级指南包含 5 个级别。我们将从级别 1 开始,该级别引入了最低限度的采用工作量性能分析工具,然后一直到级别 5,该级别非常适合有资源来维护定制性能框架的应用。


您可以随意跳转到最能引起您共鸣的级别:

第 1 级:使用 Play 管理中心提供的实地监控功能

我们建议您先在 Play 管理中心内利用 Android Vitals 查看自动收集的实地监控数据,以便您轻松获取有关应用的分析洞见。

Android Vitals 是 Google 推出的一项计划,旨在自动收集并向您显示这些实地数据。

下面介绍了我们如何提供这些数据:

  1. 收集数据: 当用户选择启用该功能后,其 Android 设备会自动记录所有应用(包括您的应用)的关键性能和稳定性事件。
  2. 汇总数据:Google Play 会从应用的用户处收集并匿名化处理这些数据。
  3. 显示数据分析:数据会显示在 Google Play 管理中心内的 Android Vitals 信息中心内。

Android Vitals 信息中心会跟踪许多指标,但其中一些被指定为核心 Vitals。这些指标之所以最重要,是因为它们会影响应用在 Google Play 商店中的曝光度和排名。

Android Vitals 核心指标

GOOGLE PLAY 的核心技术质量指标

为了最大限度提高应用在 Google Play 上的曝光度,请让应用始终保持在这些指标的不良行为阈值以下。

用户感知的崩溃率遇到过至少 1 次可能已被注意到的崩溃的日活跃用户数所占的百分比
用户感知的 ANR 发生率遇到过至少 1 次可能已被注意到的 ANR 的日活跃用户数所占的百分比
耗电量过高每小时电池用量超过 4.44% 的表盘工作时段所占百分比
新:过度局部唤醒锁定用户会话中累计的非豁免唤醒锁定使用时间超过 2 小时的会话所占的百分比

Android Vitals 核心指标包括用户感知崩溃率、ANR 发生率、过度电池用量以及新引入的过度部分唤醒锁定指标。

用户感知的 ANR 发生率

您可以使用 Android Vitals ANR 信息中心查看实地发生的问题的堆栈轨迹,并获取有关如何解决问题的分析和建议。

crashesAnrs.png

您可以深入分析发生的特定 ANR,查看堆栈轨迹以及有关可能导致该问题的分析洞见。

insights.png

此外,您还可以查看我们的 ANR 指南,以便诊断和修复可能发生 ANR 的常见情况。

用户感知崩溃率

使用 Android Vitals 崩溃信息中心进一步调试崩溃问题,并查看应用内发生的堆栈轨迹示例。

我们的文档还提供了有关排查特定崩溃问题的指导。例如,前台服务问题排查指南讨论了如何识别和修复发生崩溃的常见场景。

耗电量过高

如需减少 Wear OS 上耗电量过高的表盘会话,请参阅 Wear 指南,了解如何改善和节省电池用量

[新] 过度局部唤醒锁定

 

我们最近宣布,自 2026 年 3 月 1 日起,如果应用超出“过度局部唤醒锁定”阈值,可能会受到额外处理。

对于移动设备,Android Vitals 指标适用于在屏幕关闭且应用在后台运行或运行前台服务时获取的非豁免唤醒锁定。如果应用在 24 小时内持有唤醒锁定至少 2 小时,且在 28 天内的平均影响超过应用会话的 5%,Android Vitals 就会认为部分唤醒锁的使用量过高。

如需调试和修复过多的唤醒锁定问题,请查看我们的技术博文

请参阅我们的 Android Vitals 文档,继续探索如何更好地利用 Android Vitals。

第 2 级:按照“应用性能得分”中的待办项操作

接下来,请继续了解如何使用应用性能得分来找到可大幅提升应用性能的待办项。

Android 应用性能得分是一个用于衡量应用技术性能的标准化框架。它会为您提供一个介于 0 到 100 之间的分数,分数越低,说明可改进的空间越大。

如需轻松获胜,您应先从静态效果得分入手。这些通常是配置更改或工具更新,可显著提升性能。

第 1 步:执行静态评估

静态评估会评估项目的配置和工具采用情况。这些通常是提高性能的最快方法。

前往排行榜页面的静态得分部分,然后执行以下操作:

  1. 评估 Android Gradle 插件 (AGP) 版本。
  2. 逐步采用 R8 缩减大小功能,或者最好使用完整模式下的 R8 来缩减大小和优化应用代码。
  3. 采用基准配置文件,该配置文件可在应用首次启动后提高代码执行速度,从而针对每项新应用安装和每项应用更新提升性能。
  4. 采用启动配置文件来改进 DEX 布局。构建系统会使用启动配置文件,通过改进 APK 的 DEX 文件中的代码布局,进一步优化其中包含的类和方法。
  5. 升级到最新版本的 Jetpack Compose

第 2 步:执行动态评估

应用静态简单优化后,使用动态评估在真实设备上验证改进效果。您可以先使用实体设备和秒表手动执行此操作。

前往记分牌页面的动态得分部分,然后执行以下操作:

  1. 使用实体设备设置测试环境。考虑使用低端设备来放大性能问题,以便更轻松地发现这些问题。
  2. 测量使用启动器时的启动时间。从启动器图标冷启动应用,并测量应用变为可交互状态所需的时间。
  3. 从通知开始测量应用启动时间,目标是将通知启动时间缩短到几秒以内。
  4. 通过滚动浏览核心界面和动画来衡量渲染性能。

完成上述步骤后,您将获得静态得分和动态得分(介于 1 到 100 之间),从而了解应用的表现以及应重点关注的方面。

第 3 级:利用本地性能测试框架

开始评估动态性能后,您可能会发现手动衡量性能过于繁琐。考虑使用 Macrobenchmark 和 UiAutomator 等性能测试框架自动执行性能测试。

Macrobenchmark 💚 UiAutomator

您可以将 Macrobenchmark 和 UiAutomator 视为协同工作的两种工具:Macrobenchmark 是衡量工具。它就像一个秒表和一个帧速率计数器,在您的应用外部运行。它负责启动您的应用、记录指标(例如启动时间或丢弃的帧),以及停止应用。UiAutomator 是机器人用户。借助该库,您可以编写代码来与设备的屏幕互动。它可以查找图标、点按按钮、在列表中滚动等。

如何编写测试

编写测试时,您需要将 UiAutomator 代码封装在 Macrobenchmark 块中。

  1. 定义测试:使用 @MacrobenchmarkRule
  2. 开始衡量:调用 benchmarkRule.measureRepeated
  3. 驱动界面:在该代码块内,使用 UiAutomator 代码启动应用、查找界面元素并与之互动。

以下是一个代码段示例,展示了如何测试 Compose 列表是否存在滚动卡顿。

benchmarkRule.measureRepeated(

    // ...

    metrics = listOf(

        FrameTimingMetric(),

    ),

    startupMode = StartupMode.COLD,

    iterations = 10,

) {

    // 1. Launch the app's main activity

    startApp()

    // 2. Find the list using its resource ID and scroll down

    onElement { viewIdResourceName == "$packageName.my_list" }

        .fling(Direction.DOWN)

}

4. 查看结果:每次测试运行都会提供精确的衡量信息,以便您获得有关应用性能的最佳数据。

timeToInitialDisplayMs  min  1894.4,   median 2847.4,   max  3355.6


frameOverrunMs          P50 -3.2,  P90  6.2, P95  10.4, P99  119.5

常见使用场景

宏基准测试可提供多种开箱即用的核心指标。StartupTimingMetric 可让您准确衡量应用启动时间。借助 FrameTimingMetric,您可以了解应用在测试期间的渲染性能。

我们提供了详细而完整的指南,介绍了如何将 Macrobenchmark 和 UiAutomator代码示例搭配使用,以便您继续学习。

第 4 级:使用 Perfetto 等轨迹分析工具 

当您需要查看自己的应用代码之外的内容时,可以使用 Perfetto 等轨迹分析工具。与仅能看到您的进程的标准调试程序或性能分析器不同,Perfetto 会捕获整个设备状态(包括内核调度、CPU 频率、其他进程和系统服务),从而为您提供完整的性能问题背景信息。

请查看我们的“Performance Debugging”(性能调试)YouTube 播放列表,其中包含有关如何使用系统跟踪记录、Android Studio 性能分析器和 Perfetto 进行性能调试的视频说明。

如何使用 Perfetto 调试性能

使用轨迹分析工具调试性能的一般工作流程是记录、加载和分析轨迹。

第 1 步:记录轨迹

您可以使用多种方法记录系统轨迹:

第 2 步:加载轨迹

获得跟踪文件后,您需要将其加载到分析工具中。

  1. 打开 Chrome,然后前往 ui.perfetto.dev
  2. .perfetto-trace(或 .pftrace)文件直接拖放到浏览器窗口中。
  3. 界面将处理该文件并显示时间轴。

第 3 步:分析轨迹

您可以使用 Perfetto 界面或 Android Studio 性能分析器来调查性能问题。观看本期“MAD 技巧”系列视频,了解性能,我们的性能工程师 Carmen Jackson 将在其中讨论 Perfetto 跟踪查看器。

使用 Perfetto 检查系统轨迹的场景

Perfetto 是一款专业工具,可以提供在捕获轨迹时 Android 设备上发生的所有事件的相关信息。如果您无法使用标准日志或基本分析器找出减速的根本原因,此功能会特别有用。

调试卡顿(丢帧)

如果应用在滚动时出现卡顿,Perfetto 可以准确显示特定帧错过截止时间的原因。

如果问题是由应用引起的,您可能会看到主线程长时间运行并执行繁重的解析任务;这表明您应该将工作移至异步处理。

如果是由于系统原因,您可能会看到主线程已准备好运行,但 CPU 内核调度程序优先处理了其他系统服务,导致您的应用处于等待状态(CPU 争用)。这表示您可能需要优化平台 API 使用情况的场景。

分析应用启动缓慢问题

启动过程非常复杂,涉及系统初始化、进程派生和资源加载。Perfetto 可精确直观地呈现此时间轴。

您可以查看是否在等待 Binder 调用(进程间通信)。如果您的 onCreate 等待系统 PackageManager 的响应很长时间,Perfetto 会清楚地显示该阻塞状态。

您还可以查看应用在启动期间是否执行了不必要的操作。例如,如果您创建和布局的视图比应用需要显示的视图多,您可以在轨迹中看到这些操作。

调查电池耗尽和 CPU 使用情况

由于 Perfetto 可以查看整个系统,因此非常适合查找隐藏的耗电问题。

您可以在“设备状态”轨迹下确定哪些进程持有唤醒锁定,从而阻止设备进入休眠状态。如需了解详情,请参阅我们的唤醒锁定博文。此外,您还可以使用 Perfetto 来查看后台作业是否运行过于频繁或不必要地唤醒 CPU。

第 5 级:构建自己的效果跟踪框架

最后一个级别适用于拥有足够资源来维护效果跟踪框架的团队。

在 Android 上构建自定义性能跟踪框架涉及利用多个系统 API 来捕获整个应用生命周期(从启动到退出)以及特定高负载场景中的数据。

通过使用 ApplicationStartInfoProfilingManager 和 ApplicationExitInfo,您可以创建一个强大的遥测系统,用于报告应用启动方式、运行期间的详细信息以及终止原因。

ApplicationStartInfo:跟踪应用启动方式

ApplicationStartInfo 从 Android 15(API 35)开始提供,可提供有关应用启动的详细实地指标。数据包括是冷启动、温启动还是热启动,以及不同启动阶段的持续时间。

这有助于您使用生产数据开发基准启动指标,以进一步优化可能难以在本地重现的指标。您可以使用这些指标运行 A/B 测试,以优化启动流程。

目标是准确记录启动指标,而无需手动检测每个初始化阶段。

您可以在应用启动后的一段时间内以延迟方式查询此数据。

ProfilingManager:捕获运行缓慢的原因

ProfilingManager (API 35) 可让您的应用以编程方式在用户设备上触发系统轨迹。这对于捕获您无法在本地重现的实际环境中的暂时性性能问题非常有用。

目标是在检测到特定关键用户历程运行缓慢或遇到性能问题时,自动记录跟踪记录。

您可以注册一个在满足特定条件时触发的监听器,也可以在检测到性能问题(例如卡顿、内存使用过量或耗电过快)时手动触发该监听器。

请参阅我们的文档,了解如何捕获配置文件检索和分析性能分析数据以及使用调试命令

ApplicationExitInfo:跟踪应用终止的原因

ApplicationExitInfo (API 30) 会告知您之前进程终止的原因。这对于查找因内存用量过量 (OOM) 而导致的原生崩溃、ANR 或系统终止至关重要。您还可以使用 API getTraceInputStream 获取详细的墓碑轨迹。

该 API 的目标是了解不会触发标准 Java 崩溃报告程序(例如低内存终止)的稳定性问题。

您应在 下次启动应用时触发此 API。

后续步骤

提升 Android 性能是一个循序渐进的过程。我们非常期待看到您如何使用这些工具来提升自己的表现!

明天记得观看“Ask Android”

您已使用 R8 缩减了应用大小,并使用配置文件引导型优化功能优化了运行时。并衡量应用的表现。

欢迎明天参加“Ask Android”直播活动。现在就使用 #AskAndroid 提出问题,并获得专家的解答。

作者:

继续阅读