面试Tip之Android优化工具Systrace

Systrace是Android性能分析的重要工具,用于收集系统级数据,如CPU调度、磁盘活动、应用线程等,以解决界面卡顿问题。通过systrace.py命令行工具、Android Studio的Systrace工具或自定义trace进行性能数据抓取。分析HTML报告中的颜色块、警告和帧信息,可以定位和优化性能瓶颈,例如减少ListView的回收和绑定时间。此外,自定义trace和CPU分析器也是排查UI线程瓶颈的有效手段。

——查阅过无数的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参数表
optionsdescription
-o < FILE >输出的目标文件
-t N, –time=N执行时间,默认5s
-b N, –buf-size=Nbuffer大小(单位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参数表
categorydescription
gfxGraphics
inputInput
viewView System
webviewWebView
wmWindow Manager
amActivity Manager
smSync Manager
audioAudio
videoVideo
cameraCamera
halHardware Modules
appApplication
resResource Loading
dalvikDalvik VM
rsRenderScript
bionicBionic C Library
powerPower Management
schedCPU Scheduling
irq IRQEvents
freqCPU Frequency
idleCPU Idle
diskDisk I/O
mmceMMC commands
loadCPU Load
syncSynchronization
workqKernel Workqueues
memreclaimKernel Memory Reclaim
regulatorsVoltage and Current Regulators

2.AndroidStudio Systrace工具

打开AndroidStudio,连接好设备,打开DDMS , 点击 Tools——>Android——>Android device monitor

Image1.pngImage1.png

点击systrace按钮,弹出信息配置框,确认后,会记录Trace duration 5秒钟内的设备进程,并生成一个名为trace.html报告

1529479249.png1529479249.png

此处信息对应上面的命令参数表,请自行参照
注意: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,浏览器打开界面如下:

Image3.pngImage3.png
(图源来自官网)

分析trace.html图形信息之前,先了解下快捷键
点击浏览器界面上左上角“?”,可以查看到各个快捷键提示

快捷键作用
w放大,[+shift]速度更快
s缩小,[+shift]速度更快
a左移,[+shift]速度更快
d右移,[+shift]速度更快
f放大当前选定区域
m标记当前选定区域
v高亮VSync
g切换是否显示60hz的网格线
0恢复trace到初始态,这里是数字0而非字母o
h切换是否显示详情
/搜索关键字
enter显示搜索结果,可通过← →定位搜索结果
`显示/隐藏脚本控制台
?显示帮助功能

分析trace.html

Image5.pngImage5.pngImage6.pngImage6.png

(图源来自官网)

颜色块
每块颜色占据的长度即为该系统或者自定义trace等执行所占据的时间长度

Alerts
含有三角状的圆圈图标,对应出现警告的位置,点击可以在右边栏Alerts查看具体警告内容;
警告会告诉你可能丢帧或者卡顿等的原因

Frame
含有F字母的圆圈图标,对应每一帧开始的位置,不同颜色有不同意义;
绿色表示正常,当颜色为橙色或者红色时,意味着这一帧超过16.6ms(即发现丢帧);

Kernel
(上图为四核CPU)显示每个CPU各自执行的系统方法或自定义trace块,以及占据的时间长度

SurfaceFlinger
surfaceFilnger,进程id为118,显示系统方法以及占据的时间长度

com.android.janktown
应用进程,进程id为13409,显示应用进程内各个线程等信息
每个线程有颜色表示各自不同的状态

  • 灰色:正在休眠。
  • 蓝色:可运行(它可以运行,但是调度程序尚未选择让它运行)。
  • 绿色:正在运行(调度程序认为它正在运行)。
  • 红色:不可中断休眠(通常在内核中处于休眠锁定状态)。可以指示 I/O 负载,在调试性能问题时非常有用。
  • 橙色:由于 I/O 负载而不可中断休眠。
Image7.pngImage7.png

分析卡顿或掉帧

Systrace可以直观的看到掉帧引起的界面卡顿
如下图

frame-unselected.pngframe-unselected.png

(图源来自官网)

点击F,使用快捷键f放大该帧,可以选择m高亮该选区,查看该帧的所有系统trace块执行时间

Image8.pngImage8.png
(图源来自官网)

查看下面面板的Frame里的信息

ListView recycling takiing too mush time per frame.Ensure your Adapter#getView() binds data efficiently

主要问题是在ListView回收和重新绑定中花费了太多时间。

Alerts选项卡可以查看每个警报以及设备触发每个警报的次数

Image11.pngImage11.png

如果你在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.youkuaiyun.com/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/


————————————————————————————————————————

本人公众号首发且还有其他文章和漫画

会不定期更新!

感谢您的喜欢

请多多关注和支持!

❤️

程序员七猫

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值