Android性能优化之启动速度优化(工具篇)
一、Android中的使用启动指标
Android 使用初步显示所用时间 (TTID) 和完全显示所用时间 (TTFD) 指标来优化冷应用启动和温应用启动。
较短的 TTID 有助于用户看到应用是真的在启动。保持较短的 TTFD 非常重要,可确保用户能快速开始与应用互动。
1.1 初步显示所用时间 (TTID)
初步显示所用时间 (TTID) 是指显示应用界面的第一帧所需的时间。该指标用于测量应用生成第一帧所用的时间,包括冷启动期间的进程初始化、冷启动或温启动期间的 activity 创建,以及显示第一帧。让应用的 TTID 保持较低水平,以便用户快速看到应用启动情况,有助于改善用户体验。
TTID 以时间值的形式衡量,表示包含以下事件序列的总经过时间:
- 启动进程。
- 初始化对象。
- 创建和初始化 activity。
- 膨胀布局。
- 首次绘制应用。
2.2 完全显示所用时间 (TTFD)
完全显示所用时间 (TTFD) 是指应用与用户进入可交互状态所需的时间。报告的显示时间是显示应用界面的第一帧所用的时间,以及在显示第一帧后异步加载的内容。通常,这是从网络或磁盘加载的主要内容(由应用报告)。换言之,TTFD 包括 TTID 以及应用可供使用所需的时间。让应用的 TTFD 保持在低水平有助于用户快速与应用互动,从而改善用户体验。
1.3 reportFullyDrawn()
调用 omponentActivity
的 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();
}
}
二、启动时间测试方法
2.1 使用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
: 输出表示应用程序的启动已完成。
2.2 查看日志输出
在 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
2.3 Android Profiler
Android Profiler 是 Android Studio 的一项强大的性能分析工具,可以用于测量和分析应用的启动耗时。
三、启动分析工具
3.1 Android Profiler
随着 Android Studio 的迭代、演进,到目前,Android Studio 有了自己的性能分析工具 Android Profiler,它是一个集合体,集成了多种性能分析工具于一体,让开发者可以在 Android Studio 做开发应用,也不用再下载其它工具就能让能做性能调优工作。
官方文档:https://developer.android.com/studio/profile
如果应用响应缓慢、动画不连贯、卡顿或耗电量过多,则表示应用性能不佳。修复性能问题需要确定应用在哪些方面对 CPU、内存、图形、网络或设备电池等资源的利用效率低下。
Android Studio 提供了多种分析工具来帮助查找和可视化潜在问题:
- CPU profiler:有助于追踪运行时性能问题。
- Memory profiler :有助于跟踪内存分配。
- Energy profiler:跟踪能源使用情况,这可能会导致电池耗尽。
要分析可分析的应用程序,请执行以下操作:
1.从开发模拟器或设备启动应用程序。
2.在 Android Studio 中,通过选择View > Tool Windows > Profiler来启动分析器。
3.应用程序启动后,点击分析器加 + 按钮 分析器中的按钮查看下拉菜单。选择您的设备,然后选择其他可分析进程
下的应用程序条目。
4.分析器应附加到应用程序。只有 CPU 和内存分析器可用,内存分析器的功能有限。
点击CPU:可以选择 System Trace
点击 Record
去记录跟踪
点击Memory:选择 Capture head dump
点击 Record
去捕获堆转储
5. 您可以将 Profiler 数据保存为会话,这些会话会一直保留,直到您退出 Android Studio。通过在多个会话中记录分析信息并在它们之间切换,您可以比较各种场景下的资源使用情况。
- 要开始新的会话,请点击“开始新的分析会话” 按钮,然后从出现的下拉菜单中选择一个应用程序进程。
- 当您
记录跟踪
或捕获堆转储
时,Android Studio 会将该数据(连同应用的网络活动)作为单独的条目添加到当前会话中。 - 要停止向当前会话添加数据,请单击停止当前分析会话 。
- 要导入上次运行 Android Studio 时导出的跟踪信息,请点击“ 启动新的分析器会话” ,然后选择“从文件加载”。
3.2 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 中识别整个应用启动阶段,请按以下步骤操作:
1.在 Perfetto 中,找到包含“Android App Startups”派生指标的行。如果您没有看到该行,请尝试使用设备上的系统跟踪应用捕获跟踪记录。
2.点击关联的 slice,然后按 m
选择该 Slice。该 Slice 会被括出显示,并标注所用时间。时长也会显示在 Current selection 标签页中。
3.点击图钉图标以固定“Android App Startups”行(将鼠标悬停在该行上即可看到图钉图标)。
4.滚动到相关应用所在的行,然后点击第一个单元格以展开该行。
5.按 w 放大主线程(通常位于顶部),按 s
、a
、d
分别缩小线程
、向左移动
和向右移动
。
6.派生指标 slice 可让您更轻松地查看应用启动阶段包含的具体内容,以便您继续进行更详细的调试。
3.3 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
。
四、优化指南
https://developer.android.com/topic/performance/appstartup/analysis-optimization?hl=zh-cn
https://developer.android.com/topic/performance/vitals/launch-time?hl=zh-cn