-
背景
1、什么是systrace?
Systrace是Android4.1引入的性能分析工具。利用ftrace,在系统关键位置都有埋点,主要用于分析系统调用耗时问题,可以自定义trace标签来细化调用栈
2 、为什么要用systrace,像腾讯的PerfDog不香吗?
原因有以下几点:
- PerfDog这种软件能直观的查看CPU、GPU、内存等数据,比较适合用来做内存泄漏分析或者帧率的测试,但是对CPU具体使用情况是无法细化的,而systrace可以查看手机全部CPU每时每刻的占用情况,从而发现哪些时刻的CPU比较空闲或者太忙碌
- 想象一下,如果你要排查项目中主线程耗时情况,你会怎么做呢?可选的方法是可以写个基于asm的插件来为每个方法进行插桩,不过这样一方面需要额外的人力消耗,另一方面不够直观,因为你最多只能发现耗时点,但是不知道当时的环境以及其他相关耗时。这时候systrace就有优势了,它可以直观的展示出比较耗时的方法以及里面的相关调用,而且也不需要你额外编写什么插件,最好的方式是systrace与插桩的结合,这样能快速定位问题
-
具体使用
-
systrace命令
systrace_path=“/xxx/Android/sdk/platform-tools/systrace/systrace.py"
python $systrace_path -a “com.test.myapplication” -o trace.html gfx input view wm am dalvik
说明:systrace是Android SDK自带的工具,位置就是systrace_path定义的目录,注意的是目前只能用Python2来执行,不能用Python3
1)option可取值:
Option | 解释 |
-o <FILE> | 指定trace数据文件的输出路径,如果不指定就是当前目录的trace.html |
-t N, –time=N | 执行时间,默认5s。绝对不要把时间设的太短导致你操作没完Trace就跑完了,这样会出现Did not finish 的标签,分析数据就基本无效了 |
-b N, –buf-size=N | buffer大小(单位kB),用于限制trace总大小,默认无上限 |
-k <KFUNCS>,–ktrace=<KFUNCS> | 追踪kernel函数,用逗号分隔 |
-a <APP_NAME>,–app=<APP_NAME> | 这个选项可以开启指定包名App中自定义Trace Label的Trace功能。也就是说,如果你在代码中使用了Trace.beginSection("tag"), Trace.endSection;默认情况下,你的这些代码是不会生效的,因此,这个选项一定要开启 |
–from-file=<FROM_FILE> | 从文件中创建互动的systrace |
-e <DEVICE_SERIAL>,–serial=<DEVICE_SERIAL> | 指定设备,在特定连接设备上进行跟踪,由 |
2)category可取值:
gfx | Graphic系统的相关信息 |
input | 输入事件 |
view | View绘制相关信息 |
webview | Webview |
wm | Window Manager |
am | Activity Manager |
sm | Sync Manager |
audio | Audio |
video | Video |
camera | Camera |
hal | Hardware Modules |
app | Application |
res | Resource Loading |
dalvik | 虚拟机相关信息 |
rs | RenderScript |
bionic | Bionic C Library |
power | Power Management |
sched | CPU调度的信息 |
Binder_driver | Binder驱动的相关信息 |
core_services | SystemServer中系统核心Service的相关信息 |
irq | IRQ Events |
freq | CPU Frequency |
idle | CPU Idle |
disk | Disk I/O |
mmc | eMMC commands |
load | CPU Load |
sync | Synchronization |
workq | Kernel Workqueues |
memreclaim | Kernel Memory Reclaim |
regulators | Voltage and Current Regulators |
从上面命令可以看出,systrace提供了非常丰富的性能种类,可以根据自己需要来选择相关category,一般情况下我们主要监听主线程和CPU情况,所以像input、view、am、wm、dalvik、sched是比较常用的
-
具体场景分析
以上图为例进行分析:
- 先看一下左边栏目,左边是一些具体的性能种类,我们一般是先找到对应的进程名,每个进程下面有一系列信息,比如上面的UI Thread就是我们关心的
- 接着定位到具体栏目,开始查看右边信息,上图右边是UI线程相关情况,这里我们抓取的是应用启动5秒内的信息,最上面是时间轴,中间那些五颜六色的就是具体的调用方法以及耗时信息,颜色越深代表越耗时
- 快捷键介绍,如何查看信息,这边介绍几个快捷键,分别是a、d、w、s,和游戏使用的按键有点像,分别代表左移、右移、放大、缩小。第一次使用应该很多人不知道这个快捷键
- 接着看下面部分,下面部分是你选择具体某个调用方法后展示的相关信息,里面有这个调用方法的介绍,耗时信息以及一些描述,比如我们可以看到像bindApplication这些系统方法,这个就代表了应用启动阶段走到了Application初始化这边,从上往下分别是该方法的调用栈,越往下越具体,比如下面这个:
上面是点击了框中位置的方法调用,然后下面就显示了该方法具体信息,可以看出是我们的一个类对象创建,Wall Duration代表持续时间,即该方法总耗时,CPU Duration代表CPU耗时,还有个Self Time代表自身方法耗时,不包含其调用方法
- CPU信息查看
以上图为例,我们可以清楚看到该手机八个CPU核的占用情况,和上面方法视图类似,也是用颜色来代表耗时情况,白色就是空闲状态,像我们做启动优化就可以根据CPU的空闲状态来重新分配每个时间段的代码调用,这样就能充分利用CPU,又能避免CPU高负载导致的ANR
-
总结
- systrace是提供查看系统相关api调用情况的工具,它相比插桩来看是无法具体到每个方法,但是可以提供一个全局的性能数据,然后你可以根据定位到的具体对象来进一步排查就能解决大部分问题
- systrace提供了很多性能选项,并且视图里面以时间为横轴记录了完整的代码执行过程,可以清晰看到CPU和每个对象的创建过程,可以做为性能优化的参考依据
- systrace结合插桩可以做到先定位具体对象,再看对象具体方法耗时的操作流程,建议作为性能优化的必备工具