Android性能优化之启动速度优化(工具篇)
Android性能优化之启动速度优化(工具篇)
本文将详细介绍Android应用启动速度优化的关键指标、测试方法和分析工具,帮助开发者深入理解应用启动过程并进行性能优化。
Android中的使用启动指标
Android 使用初步显示所用时间 (TTID) 和完全显示所用时间 (TTFD) 指标来优化冷应用启动和温应用启动。较短的 TTID 有助于用户看到应用是真的在启动。保持较短的 TTFD 非常重要,可确保用户能快速开始与应用互动。
初步显示所用时间 (TTID)
初步显示所用时间 (TTID) 是指显示应用界面的第一帧所需的时间。该指标用于测量应用生成第一帧所用的时间,包括冷启动期间的进程初始化、冷启动或温启动期间的 activity 创建,以及显示第一帧。让应用的 TTID 保持较低水平,以便用户快速看到应用启动情况,有助于改善用户体验。
TTID 以时间值的形式衡量,表示包含以下事件序列的总经过时间:
- 启动进程
- 初始化对象
- 创建和初始化 activity
- 膨胀布局
- 首次绘制应用
完全显示所用时间 (TTFD)
完全显示所用时间 (TTFD) 是指应用与用户进入可交互状态所需的时间。报告的显示时间是显示应用界面的第一帧所用的时间,以及在显示第一帧后异步加载的内容。通常,这是从网络或磁盘加载的主要内容(由应用报告)。换言之,TTFD 包括 TTID 以及应用可供使用所需的时间。让应用的 TTFD 保持在低水平有助于用户快速与应用互动,从而改善用户体验。
reportFullyDrawn()
调用 ComponentActivity
的 reportFullyDrawn()
方法来指示完全绘制状态。向系统报告您的应用现已完全绘制,以进行诊断和优化。系统可能会调整优化以优先处理在调用 reportFullyDrawn
之前发生的工作,从而改善应用启动。过晚或过早调用 reportFullyDrawn
会错误地表示启动窗口,从而降低应用和启动性能。
@Override
public void reportFullyDrawn() {
try {
if (Trace.isEnabled()) {
Trace.beginSection("reportFullyDrawn() for " + getComponentName());
}
if (Build.VERSION.SDK_INT > 19) {
super.reportFullyDrawn();
} else if (Build.VERSION.SDK_INT == 19 && ContextCompat.checkSelfPermission(this,
Manifest.permission.UPDATE_DEVICE_STATS) == PackageManager.PERMISSION_GRANTED) {
// On API 19, the Activity.reportFullyDrawn() method requires the
// UPDATE_DEVICE_STATS permission, otherwise it throws an exception. Instead of
// throwing, we fall back to a no-op call.
super.reportFullyDrawn();
}
// The Activity.reportFullyDrawn() got added in API 19, fall back to a no-op call if
// this method gets called on devices with an earlier version.
} finally {
Trace.endSection();
}
}
启动时间测试方法
使用ADB
使用 adb 工具执行 Activity Manager 启动一个 Activity :am start
,用于在设备上启动指定应用程序并输出启动的相关信息。
server@dev-fj-srv:$ adb shell am start -W -S com.android.deskclock
Stopping: com.android.deskclock
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] pkg=com.android.deskclock }
Status: ok
LaunchState: COLD
Activity: com.android.deskclock/.DeskClock
TotalTime: 769
WaitTime: 773
Complete
参数:
-W
:等待 Activity 启动完成并返回结果。-S
:强制停止目标应用程序并清除其实例状态(如果已运行)。
测试冷启动时间一般加上 -S
参数
输出结果解释:
Stopping: com.android.deskclock
:输出表示正在停止目标应用程序(com.android.deskclock)。Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] pkg=com.android.deskclock }
:输出表示正在启动一个带有指定属性的 Intent,包括操作(action)、类别(category)和包名(package)等信息。Status: ok
:输出表示命令执行状态正常。LaunchState: COLD
:输出表示应用程序的启动状态为冷启动。Activity: com.android.deskclock/.DeskClock
:输出表示启动的 Activity 的完整类名。TotalTime: 622
:输出表示应用程序的总启动时间(以毫秒为单位)。WaitTime: 630
:输出表示等待应用程序启动完成的总时间(以毫秒为单位)。Complete
:输出表示应用程序的启动已完成。
查看日志输出
在 Logcat 命令行工具中搜索包含名为 Displayed 的值的输出行。该值是 TTID,但是 ActivityTaskManager
只有在冷启动的时候才会输出此段日志
server@dev-fj-srv:$ adb logcat -b all | grep Displayed
07-13 13:12:38.692 1165 1247 I ActivityTaskManager: Displayed com.android.deskclock/.DeskClock for user 0: +492ms
Android Profiler
Android Profiler 是 Android Studio 的一项强大的性能分析工具,可以用于测量和分析应用的启动耗时。
随着 Android Studio 的迭代、演进,到目前,Android Studio 有了自己的性能分析工具 Android Profiler,它是一个集合体,集成了多种性能分析工具于一体,让开发者可以在 Android Studio 做开发应用,也不用再下载其它工具就能让能做性能调优工作。
官方文档:https://developer.android.com/studio/profile
如果应用响应缓慢、动画不连贯、卡顿或耗电量过多,则表示应用性能不佳。修复性能问题需要确定应用在哪些方面对 CPU、内存、图形、网络或设备电池等资源的利用效率低下。
Android Studio 提供了多种分析工具来帮助查找和可视化潜在问题:
- CPU profiler:有助于追踪运行时性能问题。
- Memory profiler:有助于跟踪内存分配。
- Energy profiler:跟踪能源使用情况,这可能会导致电池耗尽。
要分析可分析的应用程序,请执行以下操作:
- 从开发模拟器或设备启动应用程序。
- 在 Android Studio 中,通过选择 View > Tool Windows > Profiler 来启动分析器。
- 应用程序启动后,点击分析器加
+
按钮 分析器中的按钮查看下拉菜单。选择您的设备,然后选择其他可分析进程下的应用程序条目。 - 分析器应附加到应用程序。只有 CPU 和内存分析器可用,内存分析器的功能有限。
点击CPU:可以选择 System Trace 点击 Record 去记录跟踪
点击Memory:选择 Capture head dump 点击 Record 去捕获堆转储
- 您可以将 Profiler 数据保存为会话,这些会话会一直保留,直到您退出 Android Studio。通过在多个会话中记录分析信息并在它们之间切换,您可以比较各种场景下的资源使用情况。
- 要开始新的会话,请点击“开始新的分析会话” 按钮,然后从出现的下拉菜单中选择一个应用程序进程。
- 当您记录跟踪或捕获堆转储时,Android Studio 会将该数据(连同应用的网络活动)作为单独的条目添加到当前会话中。
- 要停止向当前会话添加数据,请单击停止当前分析会话 。
- 要导入上次运行 Android Studio 时导出的跟踪信息,请点击“ 启动新的分析器会话” ,然后选择“从文件加载”。
Perfetto
Perfetto 是一种新一代的性能分析全栈工具,由 Google 开发并开源。它旨在提供全面、高效的性能分析解决方案,可用于跟踪、收集和分析各种系统和应用程序的性能数据。Perfetto 可以在 Android、Linux、macOS 和 Windows 等平台上使用,并支持多种数据源和数据格式。
Android 文档:app-startup-perfetto
通过命令行记录跟踪
cd ~/bin/
curl -O https://raw.githubusercontent.com/google/perfetto/main/tools/record_android_trace
chmod u+x record_android_trace
# See ./record_android_trace --help for more
./record_android_trace -o trace_file.perfetto-trace -t 30s -b 64mb \
sched freq idle am wm gfx view binder_driver hal dalvik camera input res memory
通过加参数 -a <包名>
进行记录trace,Ctrl_+C 后会自动打开trace分析网页
通过 Perfetto 在线界面记录跟踪信息
网址:https://ui.perfetto.dev/#!/record
如何在 Perfetto 中识别应用启动
如需调试应用启动问题,确定应用启动阶段包含哪些确切内容会很有帮助。如需在 Perfetto 中识别整个应用启动阶段,请按以下步骤操作:
- 在 Perfetto 中,找到包含“Android App Startups”派生指标的行。如果您没有看到该行,请尝试使用设备上的系统跟踪应用捕获跟踪记录。
- 点击关联的 slice,然后按
m
选择该 Slice。该 Slice 会被括出显示,并标注所用时间。时长也会显示在 Current selection 标签页中。 - 点击图钉图标以固定“Android App Startups”行(将鼠标悬停在该行上即可看到图钉图标)。
- 滚动到相关应用所在的行,然后点击第一个单元格以展开该行。
- 按
w
放大主线程(通常位于顶部),按s
、a
、d
分别缩小线程、向左移动和向右移动。 - 派生指标 slice 可让您更轻松地查看应用启动阶段包含的具体内容,以便您继续进行更详细的调试。
Systrace
Systrace 是第一代系统级性能分析工具。在 Perfetto 出现之前,基本上是唯一的性能分析工具,它将 Android 系统和 App 的运行信息以图形化的方式展示出来,与 Log 相比,Systrace 的图像化方式更为直观;与 TraceView 相比,抓取 Systrace 时候的性能开销基本可以忽略,最大程度地减少观察者效应带来的影响。
但是在Android SDK Platform-Tools 33.0.1版本时候将 systrace
工具移除,推荐使用 Profiler
。
最后一个支持 systrace
的版本 platform-tools_r30.0.0-linux.zip
。
优化指南
对于具体的优化建议和实践,可以参考以下官方文档: