介绍
Perfetto 是一个开源的系统功能分析东西,它能够搜集和记载 Android 系统和应用程序的功能数据,并运用图形界面展现这些数据。 Perfetto 能够搜集多种类型的数据,如 CPU 运用率、内存运用情况、网络流量等。它还能够盯梢应用程序的事情,如启动时刻、触摸事情等。
- Android开发者:developer.android.com/tools/perfe…
- Perfetto官网:perfetto.dev/docs/
本文介绍依据官网材料介绍一下怎么运用Perfetto进行链路盯梢(Recording Trace)。
Recording Trace
开启链路盯梢服务
Perfetto基于Android渠道服务,在Android9以上可用,Android11以上默认开启,因此在Android 9 – Android 10需求调用以下指令确保链路盯梢服务启用。
adb shell setprop persist.traced.enable 1
一、设备内部东西
直接运用设备上的 /system/bin/perfetto
指令东西。事前需求准备ADB东西,然后运转相关指令。
举个官方文档中的比如:
adb shell perfetto -o /data/misc/perfetto-traces/trace_file.perfetto-trace -t 20s \
sched freq idle am wm gfx view binder_driver hal dalvik camera input res memory
sched
后面会带有比较多的装备,了解Android Framework的话肯定对这些字段会比较了解,它们都是追寻的可选装备项,此处暂时先不解说这些装备。
Perfetto东西是Android设备自带的,因此无需从远端下载,可是有以下多个约束:
- 运用Ctrl + C通常能够结束本次链路盯梢,可是在运用
adb shell perfetto
的时分无法透传进去,因此会形成链路盯梢无法顺利结束,需求调用adb shell
运用PTY-based交互式会话才能够运用Ctrl + C指令提前结束本次链路盯梢。 - 在没有root的Android 12 之前的设备中,因为SELinux 规矩过度约束,只能运用
cat config | adb shell perfetto -c -
(-: stdin)来装备。并且Android 12之后/data/misc/perfetto-configs
才能够用来存储装备。 - 当盯梢比较长的链路,在benchmarks或许CI,运用
PID=$(perfetto --background)
然后运用kill $PID
来中止。
经过该指令生成的trace文件能够经过Perfetto UI检查,先调用以下指令将生成的文件取出来:
adb pull /data/misc/perfetto-traces/trace ~/trace.perfetto-trace
在Android 10 之前的机器, adb 不能够直接pull
/data/misc/perfetto-traces
。只能运用adb shell cat /data/misc/perfetto-traces/trace > trace
来代替。
翻开Perfetto UI页面,点击左边的Open trace file翻开文件或许直接将文件拖进去,成果如下所示。
二、外部脚本
能够运用 tools/record_android_trace 脚本辅助trace,运用外部脚本的追寻作用和ADB东西相同,可是外部脚本能够协助正确设置路径、自动拉取成果、自动将成果推送到浏览器 Perfetto UI 页面。
在Linux和Mac上下载该脚本:
curl -O https://raw.githubusercontent.com/google/perfetto/master/tools/record_android_trace
chmod u+x record_android_trace
运用脚本,指令和ADB类似,例如:
./record_android_trace -o trace_file.perfetto-trace -t 10s -b 32mb \
sched freq idle am wm gfx view binder_driver hal dalvik camera input res memory
输出路径为电脑中的路径,而不是手机中的路径。
在Windows中:
curl -O https://raw.githubusercontent.com/google/perfetto/master/tools/record_android_trace
python3 record_android_trace -o trace_file.perfetto-trace -t 10s -b 32mb \
sched freq idle am wm gfx view binder_driver hal dalvik camera input res memory
需求留意的是,该脚本为python脚本,因此电脑中需求装备好Python环境。
三、进阶装备
上述的指令行包括如下装备
sched freq idle am wm gfx view binder_driver hal dalvik camera input res memory
假如需求进一步装备,则能够在trace的时分运用—-txt
指令传入完整装备。更多装备信息能够到Trace configuration page页面检查,举个比如,调用以下指令生成一个装备文件。
cat<<EOF>config.pbtx
duration_ms: 10000
buffers: {
size_kb: 8960
fill_policy: DISCARD
}
buffers: {
size_kb: 1280
fill_policy: DISCARD
}
data_sources: {
config {
name: "linux.ftrace"
ftrace_config {
ftrace_events: "sched/sched_switch"
ftrace_events: "power/suspend_resume"
ftrace_events: "sched/sched_process_exit"
ftrace_events: "sched/sched_process_free"
ftrace_events: "task/task_newtask"
ftrace_events: "task/task_rename"
ftrace_events: "ftrace/print"
atrace_categories: "gfx"
atrace_categories: "view"
atrace_categories: "webview"
atrace_categories: "camera"
atrace_categories: "dalvik"
atrace_categories: "power"
}
}
}
data_sources: {
config {
name: "linux.process_stats"
target_buffer: 1
process_stats_config {
scan_all_processes_on_start: true
}
}
}
EOF
然后在record时将该文件传进去
./record_android_trace -c config.pbtx -o trace_file.perfetto-trace
当然,也能够运用Android设备内置的perfetto东西
cat config.pbtx | adb shell perfetto -c - --txt -o /data/misc/perfetto-traces/trace.perfetto-trace
或许将该文件传进Android设备,再调用perfetto指令
adb push config.pbtx /data/local/tmp/config.pbtx
adb shell 'cat /data/local/tmp/config.pbtx | perfetto --txt -c - -o /data/misc/perfetto-traces/trace.perfetto-trace'
四、System Tracing APP
该APP为Android内置的系统应用,Android官方有对该东西比较详尽的中文描述:developer.android.com/topic/perfo…
关于Android10以上设备仍然是生成一个.perfetto-trace
文件,将其取出之后能够在Perfetto UI翻开。
五、Perfetto UI
这种方法是官方比较引荐、也是我比较喜欢和引荐的一种方法,一开始运用该东西先从该UI界面下手会比较简略,先放一下Perfetto UI的地址:ui.perfetto.dev/。
进入该页面,点击左边的Record new trace进入记载链路的页面。
此处能够设置trace的参数,能够按需挑选需求record的装备项,不需求的就能够不挑选。
选完之后点击Recording command,能够检查到一串指令,而这个指令其实就是第一种方法的指令,可是没有采用简略的参数装备,而是运用了比较复杂的参数装备。
复制参数到Terminal中调用是和右上角的Start Recording按钮的作用是相同的。
假如没有Start Recording按钮,能够点击Add ADB Device衔接设备,衔接上了就能够开始记载。需求留意的是,假如当时正在运用其他方法衔接设备(例如正在运用Android Studio衔接设备),会导致录制失败,需求中止其他方法的衔接。
点击按钮并成功记载,会自动翻开录制好的文件,和运用外部脚本的行为共同。
总结
Perfetto是一个比较新的也是官方引荐的东西,只支撑Android9以上,运用的方法多种多样,算是比较友好了。它也能够用于dump Java内存、本地内存、本地内存符号翻译等等。本文仅仅简略介绍怎么运用,而关于获得了成果文件之后怎么分析卡顿、内存走漏、ANR等等,不同的项目分析方法不相同,还需求更多的实践经验才能熟练掌握。
参考
- Capture a trace on a device
- Perfetto 官网文档
- Android开发者Perfetto介绍
- Bard