面试Tip之Android优化工具Systrace

——查阅过无数的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

点击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/


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

会不定期更新!

感谢您的喜欢

请多多关注和支持!

❤️

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值