在短时间内记录设备活动被称为systrace。这里所说的systrace是安卓系统中的一个性能数据采集和分析工具。
内核部分:linux kernel中开启ftrace相关模块。如trace_block_getrq()。
数据采集:Android系统(即手机)利用Trace类把统计信息输出给ftrace。
数据分析:执行Android SDK目录/platform-tools/systrace目录下的systrace.py,配置systrace,收集ftrace统计信息,生成文件。
默认生成trace.html,该文件可生成一个系统报告,在chrome://tracing中load这个文件可以看到一定时间内的运行状态信息,用户可根据这些信息对设备做性能优化。(其实和kernel中用ftrace抓的trace log类似,关于ftrace之后会另起一篇博文来介绍)
systrace工具下载地址:
https://dl.google.com/android/repository/platform-tools-latest-linux.zip
下载压缩包后解压缩–>platform-tools
这里所说的抓取systrace的方法是用adb+systrace.py来完成的。还有其他的一些抓取方法,如:Android device minitor工具…这里就先不介绍了。
前提条件:
1.系统已安装python
2.系统已安装adb
3.安卓手机开启了开发者模式+允许USB debug
常见用法示例:
转到/platform-tools/systrace路径下,用如下方式运行systrace.py脚本。
./systrace.py -b 32768 -t 15 gfx input view sched freq -o ./1.html
**释义:**开辟约32M的buffer来存放抓取到的15s以内的运行信息,这些信息包含gfx、input、view、sched、freq等模块相关的信息,生成的文件名为 1.html 。
当然还可以获取其他一些模块信息,如下所示:(加注释的是几个比较重要的categories)
didi@ubuntu: ~/Downloads/platform-tools/systrace$ ./systrace.py -l
gfx - Graphics #Graphic系统的相关信息,包括SurfaceFlinger,VSYNC消息,Texture,RenderThread等;
input - Input
view - View System #View绘制系统的相关信息,比如onMeasure,onLayout等
webview - WebView
wm - Window Manager
am - Activity Manager #ActivityManager调用的相关信息;用来分析Activity的启动过程比较有效
sm - Sync Manager
audio - Audio
video - Video
camera - Camera
hal - Hardware Modules
res - Resource Loading
dalvik - Dalvik VM
rs - RenderScript
bionic - Bionic C Library
power - Power Management
pm - Package Manager
ss - System Server
database - Database
network - Network
adb - ADB
vibrator - Vibrator
aidl - AIDL calls
nnapi - NNAPI
rro - Runtime Resource Overlay
pdx - PDX services
sched - CPU Scheduling #CPU调度信息。包括线程运行状态、被调度的情况。
freq - CPU Frequency #CPU各个core的频率变化
idle - CPU Idle #CPU idle C-state
disk - Disk I/O
sync - Synchronization
memreclaim - Kernel Memory Reclaim
binder_driver - Binder Kernel driver #Binder驱动的相关信息
binder_lock - Binder global lock trace
pagecache - Page cache
NOTE: more categories may be available with adb root
更多systrace的使用方法可以通过./systrace.py -h
来获取。
didi@ubuntu:~/Downloads/platform-tools/systrace$ ./systrace.py -b 32768 -t 15 gfx input view sched freq -o ./test.html
Starting tracing (15 seconds)
Tracing completed. Collecting output...
Outputting Systrace results...
Tracing complete, writing results
Wrote trace HTML file: file:///home/user.name/Downloads/platform-tools/systrace/test.html
didi@ubuntu:~/Downloads/platform-tools/systrace$ ls #这里可以看到systrace路径下生成了test.html文件
catapult NOTICE systrace.py test.html UPSTREAM_REVISION
命令输入后,将自动开始计时15s,最后在同一路径下生成所设置名字的文件。
下面在chrome://tracing中load test,如下图所示
图中左侧一列可以看出该手机是8核的CPU,每个CPU从上到下有两栏信息:CPUx的进程、CPU的时钟频率分别对应右侧横向的图谱。点击图谱的一个色块,可以看到最下边信息框的内容。其中包含了该进程(或线程)的具体信息,比如:进程名,pid,tid,优先级,进程被调度时的状态等等。
一般看systrace中间段的情况。
①观察task、idle分析负载情况。负载太重的CPU值得注意。
②观察freq分析变频情况。变频严重时值得注意。在一些功耗问题方面可以通过观察变频情况来确认是由哪个task导致的耗电过高。
③截取一定时间段的task明细,观察wall duration的情况。duration过大的task值得注意。
另外,注意多抓几组数据,对比观察。
[1]C-state简介
[2]在命令行上捕获系统跟踪记录
[3]理解和使用systrace
以上,与君共勉。
2021.2.7
补充,遇到的问题:
因为换了系统,重装了systrace,在抓systrace的时候出现了下面问题:
Traceback (most recent call last):
File "./systrace.py", line 48, in <module>
from systrace import run_systrace
File "/home/di.di/Downloads/install_pacs/platform-tools/systrace/catapult/systrace/systrace/run_systrace.py", line 43, in <module>
from systrace import systrace_runner
File "/home/di.di/Downloads/install_pacs/platform-tools/systrace/catapult/systrace/systrace/systrace_runner.py", line 11, in <module>
from systrace import output_generator
File "/home/di.di/Downloads/install_pacs/platform-tools/systrace/catapult/systrace/systrace/output_generator.py", line 15, in <module>
from tracing.trace_data import trace_data
File "/home/di.di/Downloads/install_pacs/platform-tools/systrace/catapult/tracing/tracing/trace_data/trace_data.py", line 19, in <module>
import six
ImportError: No module named six
实际上和systrace安装没有关系,还是python惹的祸。可以看到问题运行systrace python脚本的时候缺少一个名叫six的库。安装即可。安装命令如下:
sudo apt install python-six
2021.3.16
补充:用systrace脚本将atrace文件转换成systrace文件:
didi@ubuntu:/Download/platform-tools/systrace$ ./systrace.py --from-file test.atrace
执行上面语句后就可以看到test.trace被转换成test.html文件。
2021.5.25
补充:用perfetto抓取trace信息1
(1)在本地下载record_android_trace工具,并添加执行权限
curl -O https://raw.githubusercontent.com/google/perfetto/master/tools/record_android_trace
chmod u+x record_android_trace
(2)保证usb链接正常,adb可用。执行下面命令来抓取trace。命令执行完后会自动打开chrome浏览器的perfetto页面。
# See ./record_android_trace --help for more
./record_android_trace -o trace_file.perfetto-trace -t 10s -b 32mb \
sched freq idle am wm gfx view binder_driver hal dalvik camera input res memory
另外,还可在网页中将pefetto trace转化为systrace。
2022.6.21
【声明】本博文为个人学习笔记,仅供参考。转发请注明出处。如发现有误,还请不吝赐教,谢谢!
recording-a-trace-through-the-cmdline ↩︎