Android性能分析工具:Perfetto介绍及用法
本文字数:8409字
预计阅读时间:22分钟
概念
Perfetto?Perfetto是Android 10中引入的全新平台级跟踪工具。这是适用于Android、Linux和Chrome的更加通用和复杂的开源跟踪项目。与Systrace不同,它提供数据源超集,可让您以protobuf编码的二进制流形式记录任意长度的跟踪记录。您可以在Perfetto界面中打开这些跟踪记录。Perfetto是一款比较强大的安卓性能分析工具(它还可以用于分析其他系统),其功能涵盖了对CPU的追踪、电池耗电追踪、系统调用的追踪,内存分配与释放的追踪。除了性能数据记录还,它还有自带的分析工具,分析工具包括:通过自定义追踪功能来拼接命令行,用SQL方式筛选数据,将数据转换成其他格式方便自定义数据处理,Web形式的火焰图(Web可离线),以及Web上的ADB功能(有bug)。Perfetto的优缺点是什么?
Android 9及以上机型;ADB、Python、LLM、pprof、Perfetto命令行的知识点,才能熟练运用该工具;so,只能全部分析完了再筛选;Mac上操作,否则无法解析函数堆栈信息(需要自己编译一个windows的trace-to-text程序);Perfetto的内存分析原理是什么?
Perfetto:git clonePerfetto也是使用注入(hook)的方式,将内存分配和释放的几个函数修改为自己的代码指令后,当内存分配和释放时进行统计。与LoliPerfiler不同的是,它有得天独厚的优势,就是它本身就是安卓系统自带的程序,不需要用JDWP方式启动某个程序,直接启动执行程序就可以了。系统分析(适用于Liux和Android系统范围分析)
Perfetto-系统分析,应用程序跟踪和跟踪分析。Perfetto是用于性能检测和跟踪分析的生产级开源堆栈。它提供用于记录系统级和应用程序级跟踪的服务和库,本机+Java堆分析,使用SQL分析跟踪的库以及基于Web的UI以可视化和探索多GB跟踪。Linux内核跟踪:捕获高频ftrace数据:调度活动,任务切换延迟,CPU频率等等。Java堆分析,/ proc状态文件的轮询器。Android:自Android 9 Pie以来该平台的一部分,也可在Linux上运行。应用追踪
raceconv工具将Perfetto跟踪转换为其他跟踪格式。C++应用程序的活动。protobuf消息以表示强类型的应用程序特定信息,仅跟踪您需要的信息。追踪查看器
heapprofd:Android堆分析器。CI用于AOSP的TreeHugger的顶部(而不是替代)。它提供早期测试信号,并涵盖TreeHugger不支持的其他操作系统和较旧的Android设备。AppEngineAppEngine BG服务Compute Engine + DockerFirebase实时数据库Firebase数据库耦合。DB是整个CI的真理之源。Perfetto UI记录,查看和处理跟踪数据。TraceEvent JSON,Android systrace,ftrace文本输出。痕量分析
C++库(/ src / trace_processor),它吸收以多种格式编码的跟踪,并公开一个SQL接口,用于查询一致的表集中所包含的跟踪事件。它还具有其他功能,包括计算摘要度量,使用用户友好的描述注释跟踪以及从跟踪的内容派生新事件。SQL的跟踪模型:跟踪处理器提取跟踪并公开基于SQLite的接口以通过外壳和UI访问跟踪的内容。GB的跟踪。Chromium JSON跟踪格式,Android Systrace,ftrace,CSV。Perfetto的使用方法
CPU分析:c++内存分析:web界面:使用系统工具获取跟踪记录
Android 10的手机上,开发者模式新增加了一个“系统跟踪”的功能,我们首先将开发者模式下的“系统跟踪”打开:2)从“类别”选项中选择我们关注的信息类别:
3)设置完之后,下拉快捷选项多了个棒棒糖形状的图标:
/data/local/traces”目录下,文件的后缀名为“.perfetto-trace”,我们就可以在网站界面(https://ui.perfetto.dev)中打开这些跟踪记录,进行性能分析了。使用
Perfetto网站获取perfetto-trace文件
1)打开https://ui.perfetto.dev;
2)点击record new trace;
3)在web站点上选指令,可选择更详细的指令,包括cpu综合数据、gpu综合数据、函数调用堆栈、内存memory分配情况;
4)开始录入,点击start recording,网站自动生成脚本代码,默认是10秒dump一次(或一次性导出);
5)点击stop结束录制,在/data/misc目录下,即可看到生成的.perfetto-trace文件。
使用脚本语言
Android Q及P先设置:adb shell setprop
persist.traced.enable 1Android Q以上perfetto默认运行,无需上述步骤。perfetto的两种模式下都可使用的选项:systrace。如果需要设定时间加-t,默认跟踪10s。-o输出文件的位置,使用/data/misc/perfetto-traces/,否则perfetto没有权限访问, 然后pull出文件,在Perfetto UI中打开使用。如下命令可直接使用,通常这种信息对大多数情况都够用了。.perfetto-trace文件:adb shell perfetto gfx input view wm am ss sched freq idle
binder_driver res rs -o /data/misc/perfetto-traces/trace
-t 10s.perfetto-trace文件:adb pull
/data/misc/perfetto-traces/trace ~/traceconfig文件配置要调试的内容,命令行如下,其中config.pbtx为config file,可以借助Perfetto UI的recording setting(Perfetto UI)生成,或者在Perfetto UI中的redording settings中设置后好,在recording command 中copy所有内容,在terminal中直接copy执行即可。cat config.pbtx | adb shell
perfetto -c - --txt -o /data/misc/perfetto-traces/trace.perfetto-trace解析perfetto-trace文件
导入文件
Open trace file,选择本地录制好的perfetto trace或ftrace等文件,即可以Timeline方式展现各进程、线程的详细跟踪信息。trace文件大于1G时,Open trace file会出现内存溢出无法访问。trace_processor来辅助,该程序建议在Linux环境下运行,Win10系统可安装WSL (Ubuntu20.04),参考附录安装WSL。trace_processor:curl -LO https://get.perfetto.dev/trace_processorchmod +x ./trace_processorperfetto trace文件:./trace_processor --full-sort
-D xxx.pftraceWindows下也可以运行如下命令(不稳定,内存耗用大):python3 trace_processor
--full-sort -D xxx.pftraceChrome浏览器打开https://ui.perfetto.dev/#!/,会自动检测本地是否已经有trace_processor生成的HTTP SERVER(9001端口),如下图提示,请选择:YES, use loaded trace”,将自动解析trace_processor已经加载的pftrace文件。常规分析
slice (片段,选中片段后会显示黑色边框),对应代码中Trace.beginSection/ATRACE_BEGIN记录的事件。counter (计数器,离散的数值点) 代码中Trace.traceCounter/ATRACE_INT记录的事件。sched/freq (CPU调度、频率)thread_state (线程状态)Running),可以看到线程当前运行在哪个CPU上。CPU调度中看到该运行片段,可以看到调度时延信息。被P(Process):system_server的 T(Thread):Binder_1754_18线程唤醒,从就绪到运行延迟了363us,再次点击,可以回到原片段,这个跳转比systrace更加灵活方便。同样的,Binder调用也可以如此在目标和原调用线程跳转来分析查看。shift+m”即可添加常驻区域标记。选中已经添加的标记,底部出现的Current Selection TAB里可以为其添加标记名,更改其颜色,以及执行移除操作。m”添加的是临时区域标记,再次选中另外一块区域添加临时区域时,上一个临时区域会自动移除。lock contention)lock contention片段,可以点击上边的monitor contention来查看当前对象锁竞争发生的调用栈,如下详情中显示当前对象锁被Owner (Binder:1754_16)持有,其持锁当前运行在serviceDoneExecuting(AMS.java 16426行),且当前等待该对象锁的线程已经有2个了;当前线程执行被阻塞在getUidState方法中(AMS.java 6614行)。SQL查询与展现
trace的perfetto
UI界面,Search框中输入 : ,即可开启SQL输入,我们就可以使用SQL来查询并定位具体的trace片段(slice)。SQL语句,Enter,得到查询结果,显示在底部表格中,点击表格中的每一行,可以跳转到具体的slice中,根据trace上下文可以进一步分析问题。SQL查询:应用实战
log立可以看出损耗的相关代码:进入perfetto,导入trace文件,界面如下,找到对应的包名线程:
onResume方法阻塞了4s的样子,这样能在具体的类里尽快定位产生耗时的方法,其余的功能可以具体分析。项目实际应用
android手机日益更新换代,现在折叠屏手机已经面市,搜狐视频要根据折叠屏幕尺寸不同变化适配不同的UI展示,这次的需求。crash崩溃,log里也没啥有用信息,实在不好定位问题,百思不得其解,最后想到用Perfetto看看有没有什么有用信息,按照上述步骤得到trace文件,导入界面如下,找到搜狐视频的包名线程,可以看到:上千次执行
RV onBindView方法,在代码里找到对应位置,发现是2个xml的UI都在刷新,所以导致图片View加载混乱,所以一直重复刷新,修改后切换界面就正常了,长叹一口气,问题圆满解决,鼓掌撒花~
参考
https://blog.csdn.net/imqingyue/article/details/124194680?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-124194680-blog-110933087.pc_relevant_multi_platform_featuressortv2dupreplace&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-124194680-blog-110933087.pc_relevant_multi_platform_featuressortv2dupreplace&utm_relevant_index=2 https://blog.csdn.net/u011578734/article/details/110933087 https://developer.android.google.cn/studio/command-line/perfetto https://blog.csdn.net/vviccc/article/details/124567746?spm=1001.2101.3001.6650.6&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-6-124567746-blog-124194680.pc_relevant_layerdownloadsortv1&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-6-124567746-blog-124194680.pc_relevant_layerdownloadsortv1&utm_relevant_index=9