Perfetto使用详解

686 阅读4分钟

一、概述

在这里插入图片描述

Perfetto 支持多个平台,包括 Linux、Android 和 Chrome,并提供了用于记录系统级和应用级活动的服务和库、低开销的针对 Native 和 Java 的内存分析工具、可供 SQL 分析跟踪文件的 C++库和 Python 库(Python 基于 C++库),以及基于 Web 可视化方便分析 Trace 文件的 Perfetto UI。 快速开始,Android 抓 Trace 可视化工具,Perfetto UI 教程 开源 贡献

性能分析工具perfetto/systrace android10引入perfetto

  • AndroidStudio3.0,Android Profiler取代了 Android Monitor
  • 与CPU Profiler功能类似的TraceView、DDMS已弃用
  • 在Android platform tools 33.0.1版本中已经移除systrace,建议用Studio 性能分析器、Perfetto 取代

二、trace生成

trace生成有多种方式,如AndroidStudio的Profiler、Perfetto命令行、PerfettoUI等。其中,Profiler生成10s以内的还好,再大容易卡死,这里在AndroidStudio K有验证。而Perfetto命令行可以自定义生成的trace大小和时间,试了30s都很流畅,再大待尝试。

1、命令行

MINGW执行如下命令,下载record_android_trace需要翻墙。需要提前准备好python环境,我这里用的是python3.12.7。 配置科学上网代理,下载record_android_trace

export http_proxy=127.0.0.1:10809 https_proxy=127.0.0.1:10809 curl -O raw.githubusercontent.com/google/perf…

py record_android_trace -o trace_file.perfetto-trace -a com.example.myapplication -t 30s -b 600mb sched freq idle am wm gfx view binder_driver hal dalvik camera input res memory

2、UI

按照下图操作,设备时华为Mate60,无法连接,应该是安全限制,后面换个机型试试。

image.png

当点击Start Recording时报如下错误A WebUSB error occurred image.png

在chrome浏览器地址输入chrome://device-log/ 发现是拒绝访问,如下图

[05:47:24] Failed to open \?\usb#vid_12d1&pid_107e&mi_02#6&2b68b0c2&0&0002#{dee824ef-729b-4a0e-9c14-b7117d33a817}: 拒绝访问。 (0x5)

image.png

也可以通过chrome://usb-internals/查详细的设备信息 image.png

参考:github.com/google/perf… stackoverflow.com/questions/6… blog.csdn.net/sinat_20059…

三、分析

如下图,输入自己应用的进程名称,通过W、S、A、D键来调整大小,很快能找到耗时方法。 image.png

注:自定义方法如testSharedFlow想展示出来,需要加上Trace.beginSection("testSharedFlow")和Trace.endSection(),否则不会展示。另外,执行record_android_trace 脚本需要加上-a。

查找某个指定方法,如下图,如果耗时,slice块会很长一眼就能看出来,如果不是很耗时,slice块就会很短,这时候,可以在输入框输入Trace记录的key,如testSharedFlow,下面两个蓝色框是搜索的结果。时间只有15微妙,如果不搜索的话,slice块极其小,只靠adws很难找到。 image.png

2、数据库查询

如下图查询渲染线程的DrawFrames时间段,点击查到的结果行,直接定位到上面上,特别方便。

select * from slice where name like 'DrawFrames%' limit 10

image.png

四、FAQ

1、为什么我加了Trace,无法根据关键字onCreateViewHolder,在pefetto里搜索到对应的section呢?

Trace.beginSection("onCreateViewHolder");
coding...
Trace.endSection();

检查生成trace的包名,如下com.example.myapplication,如果和自己的不匹配,是无法搜索到的。

py record_android_trace -o trace_file.perfetto-trace -a com.example.myapplication -t 30s -b 600mb sched freq idle am wm gfx view binder_driver hal dalvik camera input res memory

2、AndroidStudio和Perfetto的区别

相同点:

  • 都可以使用ADWS左移右移放大缩小。
  • 都可以查看自定义trace时间段信息

不同点:

  • AndroidStuidoProfiler开发中直接录制,比较方便
  • Perfetto支持模糊查找你关注的apk进程
  • Perfetto支持模糊查找特定时间段信息,自定义Trace关键字搜索
  • Perfetto支持sql语句查询时间段及自定义trace
  • Perfetto性能要好很多,对于比较大的trace文件,AndroidStudio往往很卡,Perfetto却表现优秀。

3、ADB connection failed

$ py record_android_trace -o trace_file.perfetto-trace -a com.eyuan.android -t 30s -b 600mb sched freq idle am wm gfx view binder_driver hal dalvik camera input res memory adb.exe: no devices/emulators found ADB connection failed

解决方法:先通过USB连接好电脑

4、adbd cannot run as root in production builds

$ py record_android_trace ... C:\Users\xxx.local\share\perfetto\prebuilts\tracebox: 0 files pushed, 1 skipped. adbd cannot run as root in production builds Running /data/local/tmp/tracebox --background --txt -o /data/local/tmp/2024-12-13_05-54-77bd8d.pftrace -t 30s -b 600mb --app 'com.xxx' sched freq idle am wm gfx view binder_driver hal dalvik camera input res memory Trace started. Press CTRL+C to stop E/perfetto( 4334): probes_producer.cc:418 Data source id=1 not found

原因:可能是因为我使用雷电模拟器的原因,之前能成功一直在用真机。 解决方式:请有经验的同学在评论区回答