1. 概述
systrace 是 android 4.1 中新增的性能数据采集和分析工具,它可帮助开发者收集 Android 关键子系统(如 SurfaceFlinger、WindowManagerService、Framework 关键模块、服务、View 系统等)的运行信息,从而帮助开发者更直观的分析系统瓶颈,改进性能。
systrace 允许你监视和跟踪 android 系统的行为,它会告诉你系统都在哪些工作上花费时间、CPU 周期都用在哪里,甚至你可以看到每个线程、进程在指定时间内都在干嘛。它同时还会突出观测到的问题,从垃圾回收到渲染内容都可能是问题对象,甚至提供给你建议的解决方案。
systrace 的功能包括跟踪系统的 I/O 操作、内核工作队列、CPU 负载以及 android 各个子系统的运行状况等。在 Android 平台中,它主要由3部分组成:
- 内核部分:systrace 利用了 Linux Kernel 中的 ftrace 功能,所以如果要使用 systrace 的话,必须开启 kernel 中和 ftrace 相关的模块。
- 数据采集部分:android 定义了一个 Trace 类,应用程序可利用该类把统计信息输出给 ftrace。同时,Android 还有一个 atrace 程序,它可以从 ftrace 中读取统计信息然后交给数据分析工具来处理。
- 数据分析工具:android 提供了一个 systrace.py(python 脚本文件,位于 Android SDK 目录 /external/chromium-trace/catapult/systrace- 7.1以上系统,其内部将调用 atrace 程序)用来配置数据采集的方式(如采集数据的标签、输出文件名等)和收集 ftrace 统计数据并生成一个结果网页文件供用户查看。
从本质上看,systrace 是对 Linux kernel 中 ftrace 的封装,应用程序可以利用 android 提供的 Trace 类来使用 systrace
只有 userdebug 版本可以抓取 trace 文件
2. 启动 systrace
systrace 工具可以在 sdk/platform-tools/ 中找,源码位于 external/chromium-trace 下面
2.1 使用 AndroidStudio
1. Tools > Android > Monitor
2. 在设备tab中选择需要监听的 android 设备
3. 点击 Systrace
2.2 直接使用命令行
1. PC 安装 pythone2.7 以上版本
2. kernel 配置 ftrace,默认已打开
3. 连接设备,adb usb debugging options 打开
4. cmd 切换到 android-sdk-windows/sdk/platform-tool/systrace
5. 输入命令 python systrace.py + 相关参数
6. 在 chrome 地址栏输入"chrome:tracing"
点击 load 加载生成的 trace.html 文件
3. systrace 参数解析
参数 | 意义 |
---|---|
-h | 帮助 |
-o FILE | 输入文件名(-o trace.html) |
-t N / --time=N | trace 抓取的时间(-t 5),单位秒 |
-b N / --buf-size=N | 单位为千字节,限制数据大小 |
-a / -app= | 包名 |
-e <DEVICE_SERIAL> / --serial=<DEVICE_SERIAL> | 设备号 |
-l, --list-categories | 列出设备所有支持的trace模块 |
-k --ktrace= | 追踪特殊的方法 |
其中标签可选项如下:
标签名 | 意义 |
---|---|
gfx | Graphic 系统相关,包括 SurfaceFlinger、VSYNC消息、Texture、RenderThread等;分析卡顿非常依赖这个 |
input | Input |
view | View绘制系统的相关信息,比如onMeasure,onLayout等;对分析卡顿比较有帮助。 |
webview | Webview |
vm | Window Manager |
am | ActivityManager 调用的相关信息;用来分析Activity的启动过程比较有效。 |
audio | Audio |
video | Video |
camera | Camera |
hal | Hardware Modules |
res | Resource Loading |
dalvik | 虚拟机相关信息,比如GC停顿等 |
rs | RenderScript |
sched | Cpu的调度信息 |
freq | Cpu Frequency |
membus | Memory Bus Utilization |
idle | Cpu Idle |
disk | Disk input and output |
load | Cpu Load |
sync | Synchronization Manager |
workq | Kernel Workqueues |
经典样例:
python systrace.py -e 123456 -o trace.html sched freq idle am wm gfx view sync binder_driver irq workq input -b 96000 -t 5
4. trace 文件分析
-> 官方说明
使用 chrome 打开之后的快捷键列表:
Key | 含义 |
---|---|
w | 放大 |
s | 缩小 |
a | 向左边时间线移动 |
d | 向右边时间线移动 |
e | 定位到中间 |
g | 切换是否显示60hz的网格线 |
0 | 恢复trace到初始态,这里是数字0而非字母o |
h | 切换是否显示详情 |
m | 高亮显示 |
横坐标是以时间为单位,纵坐标是以进程-线程的方式来划分,同一进程的线程为一组放在一起,可收缩/展开
Frame
在每个 app 进程中,都会有一个 Frame 行,正常情况下以绿色的圆点表示。当圆点颜色为黄色或者红色时,意味着这一帧超过16.6ms(即发现丢帧),这时需要通过放大那一帧进一步分析问题。
Alart
systrace 能自动分析 trace 中的事件,并能自动高亮性能问题作为一个 Alerts,建议调试人员下一步该怎么做。
比如对于丢帧,点击黄色或红色的 Frames 圆点便会有相关的提示信息;另外,在 systrace 的最右侧,有一个 Alerts tab 可以展开,这里记录着所有的的警告提示信息。
当我们点击了Alerts或者点击右边的Alerts列表中的任何一点我们可以看到在界面的最底部会相对应的优化提示以及可能会出现优化的视频教程链接。
Alert Long View#draw()
Time spent
3.770 ms
Record View#draw() took 3.77ms
Frame
Description
Recording the drawing commands of invalidated Views took a long time. Avoid significant work in View or Drawable custom drawing, especially allocations or drawing to Bitmaps.
Video Link Android Performance Patterns: Invalidations, Layouts, and Performance
Video Link Android Performance Patterns: Avoiding Allocations in onDraw()
然后我们可以点击一块 Frames 来查看,同样的它会生成一份跟 Alerts 类似的报告结果并放在界面的最低端。我们可以通过按下 m 键查看这一帧到下一帧所花费的时间以及哪个方法被调用的最长。
系统要求 UI 的 60fps 水准所以系统会报出黄色或者红色的警告。照样我们从 Description 中可以读出到底是哪里出了问题
Alart 事件类型:
1. Long View#draw()
2. Scheduling delay
调度延迟
- 就是一个线程在处理一块运算的时候,在很长一段时间都没有被分配到CPU上面做运算
,从而导致这个线程在很长一段时间都没有完成工作。
3. inefficient view alpha usage
低效的设置 alpha 属性使用
- 因为调用具体 View 的 setAlpha 方法,View 的 setAlpha 在 Android 中是很昂贵的操作
- 解决方法是 用 ARGB 设置 color 代替直接调用 setAlpha
``