——查阅过无数的systrace资料后,我觉得这个工具介绍篇,可能不会让大家特别满意,但是当且算一个学习阶段的纪录吧,希望大家一起学习进步
Systrace
Systrace是分析Android设备的性能的主要工具
作用
用于收集可帮助您检查原生系统进程的详细系统级数据,例如CPU调度、磁盘活动、应用线程等,并解决掉帧引起的界面卡顿
本质
它是 atrace 的主机端封装容器,是用于控制用户空间跟踪和设置 ftrace 的设备端可执行文件,也是 Linux 内核中的主要跟踪机制。 systrace 使用 atrace 来启用跟踪,然后读取 ftrace 缓冲区并将其全部封装到一个独立的 HTML 查看器中
官网
https://source.android.google.cn/devices/tech/debug/systrace https://developer.android.google.cn/studio/command-line/systrace
extra: 什么是atrace?什么是ftrace?
ftrace 是一种调试工具,用于了解 Linux 内核中的情况;而 atrace (frameworks/native/cmds/atrace) 使用 ftrace 来捕获内核事件; 官网简单的介绍地址:https://source.android.google.cn/devices/tech/debug/ftrace
抓取方法
抓取信息方式有以下三种
1.systrace.py 2.AndroidStudio Systrace工具 3.自定义trace
1.systrace.py
使用python命令以及systrace.py工具 systrace.py工具位置在 sdk/platform-tools/systrace;
python systrace.py [options] [categories]
复制代码
示例: 调用systrace来记录10秒钟内的设备进程,包括图形进程,并生成mynewtrace.html报告 具体命令如下
python systrace.py --time=10 -o mynewtrace.html gfx
复制代码
参数信息
options参数表
options | description |
---|---|
-o < FILE > | 输出的目标文件 |
-t N, –time=N | 执行时间,默认5s |
-b N, –buf-size=N | buffer大小(单位kB),用于限制trace总大小,默认无上限 |
-k < KFUNCS >,–ktrace=< KFUNCS > | 追踪kernel函数,用逗号分隔 |
-a < APP_NAME >,–app=< APP_NAME > | 追踪应用包名,用逗号分隔 |
–from-file=< FROM_FILE > | 从文件中创建互动的systrace |
-e < DEVICE_SERIAL >,–serial=< DEVICE_SERIAL > | 指定设备 |
-l, –list-categories | 列举可用的tags |
-h , --help | 显示帮助信息 |
-l,--list-categories | 列出可用于连接设备的跟踪categories类别 |
-o file | 将HTML跟踪报告写入指定的文件。 如果您不指定此选项,systrace会将您的报告保存到systrace.py所在的同一目录中,并将其命名为trace.html。 |
-t N ,--time=N | 跟踪设备活动N秒。 如果不指定此选项,systrace将提示您通过按命令行中的Enter键结束跟踪。 |
-b N ,--buf-size=N | 使用N千字节的跟踪缓冲区大小。 通过此选项,可以限制跟踪期间收集的数据的总大小。 |
-k functions,--ktrace=functions | 跟踪中指定的特定内核函数的活动,以逗号分隔的列表 |
-a app-name,--app=app-name | 跟踪指定应用,为逗号分隔列表。 |
--from-file=file-path | 从文件(例如包含原始跟踪数据的TXT文件)创建交互式HTML报告,而不是运行实时跟踪。 |
-e device-serial,--serial=device-serial | 跟踪指定的设备序列号标识的特定连接设备 |
catagories参数表
category | description |
---|---|
gfx | Graphics |
input | Input |
view | View System |
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 | Dalvik VM |
rs | RenderScript |
bionic | Bionic C Library |
power | Power Management |
sched | CPU Scheduling |
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 |
2.AndroidStudio Systrace工具
打开AndroidStudio,连接好设备,打开DDMS , 点击 Tools——>Android——>Android device monitor
点击systrace按钮,弹出信息配置框,确认后,会记录Trace duration 5秒钟内的设备进程,并生成一个名为trace.html报告
此处信息对应上面的命令参数表,请自行参照
注意:Enable Application Trace from :若是需要自定义trace信息,必须选择对应的应用进程,否则不会被捕获到
3.自定义trace
用户可以自己添加自定义的trace块,来捕获指定trace的信息 Android 4.3 (API level 18) 以及更高版本可以使用
Android
Trace.beginSection();
Trace.endSection();
复制代码
代码示例
public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {
...
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
Trace.beginSection("MyAdapter.onCreateViewHolder");
MyViewHolder myViewHolder;
try {
myViewHolder = MyViewHolder.newInstance(parent);
} finally {
// In 'try...catch' statements, always call endSection()
// in a 'finally' block to ensure it is invoked even when an exception
// is thrown.
Trace.endSection();
}
return myViewHolder;
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
Trace.beginSection("MyAdapter.onBindViewHolder");
try {
try {
Trace.beginSection("MyAdapter.queryDatabase");
RowItem rowItem = queryDatabase(position);
mDataset.add(rowItem);
} finally {
Trace.endSection();
}
holder.bind(mDataset.get(position));
} finally {
Trace.endSection();
}
}
...
}
复制代码
native
#include <android/trace.h>
ATrace_beginSection();
ATrace_endSection();
复制代码
创建一个便利的对象/宏结构来跟踪代码块
#define ATRACE_NAME(name) ScopedTrace ___tracer(name)
// ATRACE_CALL is an ATRACE_NAME that uses the current function name.
#define ATRACE_CALL() ATRACE_NAME(__FUNCTION__)
class ScopedTrace {
public:inline ScopedTrace(const char *name) {
ATrace_beginSection(name);
}
inline ~ScopedTrace() {
ATrace_endSection();
}
};
void myExpensiveFunction() {
ATRACE_CALL();
... // trace-worthy work here
}
复制代码
快捷键
查看Systrace生成的trace.html,浏览器打开界面如下:
(图源来自官网)分析trace.html图形信息之前,先了解下快捷键 点击浏览器界面上右上角“?”,可以查看到各个快捷键提示
快捷键 | 作用 |
---|---|
w | 放大,[+shift]速度更快 |
s | 缩小,[+shift]速度更快 |
a | 左移,[+shift]速度更快 |
d | 右移,[+shift]速度更快 |
f | 放大当前选定区域 |
m | 标记当前选定区域 |
v | 高亮VSync |
g | 切换是否显示60hz的网格线 |
0 | 恢复trace到初始态,这里是数字0而非字母o |
h | 切换是否显示详情 |
/ | 搜索关键字 |
enter | 显示搜索结果,可通过← →定位搜索结果 |
` | 显示/隐藏脚本控制台 |
? | 显示帮助功能 |
分析trace.html
(图源来自官网)
颜色块 每块颜色占据的长度即为该系统或者自定义trace等执行所占据的时间长度
Alerts 含有三角状的圆圈图标,对应出现警告的位置,点击可以在右边栏Alerts查看具体警告内容; 警告会告诉你可能丢帧或者卡顿等的原因
Frame 含有F字母的圆圈图标,对应每一帧开始的位置,不同颜色有不同意义; 绿色表示正常,当颜色为橙色或者红色时,意味着这一帧超过16.6ms(即发现丢帧);
Kernel (上图为四核CPU)显示每个CPU各自执行的系统方法或自定义trace块,以及占据的时间长度
SurfaceFlinger surfaceFilnger,进程id为118,显示系统方法以及占据的时间长度
com.android.janktown 应用进程,进程id为13409,显示应用进程内各个线程等信息 每个线程有颜色表示各自不同的状态
- 灰色:正在休眠。
- 蓝色:可运行(它可以运行,但是调度程序尚未选择让它运行)。
- 绿色:正在运行(调度程序认为它正在运行)。
- 红色:不可中断休眠(通常在内核中处于休眠锁定状态)。可以指示 I/O 负载,在调试性能问题时非常有用。
- 橙色:由于 I/O 负载而不可中断休眠。
分析卡顿或掉帧
Systrace可以直观的看到掉帧引起的界面卡顿 如下图
(图源来自官网)
点击F,使用快捷键f放大该帧,可以选择m高亮该选区,查看该帧的所有系统trace块执行时间
(图源来自官网)查看下面面板的Frame里的信息
ListView recycling takiing too mush time per frame.Ensure your Adapter#getView() binds data efficiently
复制代码
主要问题是在ListView回收和重新绑定中花费了太多时间。
Alerts选项卡可以查看每个警报以及设备触发每个警报的次数
如果你在UI线程上看到了太多的工作,你需要找出哪些方法消耗了太多的CPU时间。 一种方法是添加跟踪标记即自定义trace信息到您认为会导致这些瓶颈的方法; 另一种由于不确定哪些方法可能导致UI线程出现瓶颈,可以使用Android Studio的内置CPU分析器,或生成跟踪日志并使用Traceview来进行查看。
其他
systrace 具体落实到项目如何进行分析,又要多废一番心思,如何才能把这工具发挥好它的功能,就看大家了,如果有什么心得,欢迎分享和告之 ~~o(>_<)o ~~以下连接为搜罗到的使用的例子,可以借鉴参考
Reanative-systrace
https://reactnative.cn/docs/0.36/android-ui-performance.html
http://mlazy.club/react-native-animation-performance-tool-systrace.html
android性能分析之Systrace的使用(转) https://blog.csdn.net/lamp_zy/article/details/53375521
手把手教你使用Systrace(一)
https://zhuanlan.zhihu.com/p/27331842
手把手教你使用Systrace(二)——锁优化
https://zhuanlan.zhihu.com/p/27535205
主要参考
http://maoao530.github.io/2017/02/06/systrace/
http://gityuan.com/2016/01/17/systrace/
本人公众号首发且还有其他文章和漫画
会不定期更新!
感谢您的喜欢
请多多关注和支持!
❤️