介绍

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设备自带的,因此无需从远端下载,可是有以下多个约束:

  1. 运用Ctrl + C通常能够结束本次链路盯梢,可是在运用adb shell perfetto的时分无法透传进去,因此会形成链路盯梢无法顺利结束,需求调用adb shell运用PTY-based交互式会话才能够运用Ctrl + C指令提前结束本次链路盯梢。
  2. 在没有root的Android 12 之前的设备中,因为SELinux 规矩过度约束,只能运用cat config | adb shell perfetto -c - (-: stdin)来装备。并且Android 12之后/data/misc/perfetto-configs才能够用来存储装备。
  3. 当盯梢比较长的链路,在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翻开文件或许直接将文件拖进去,成果如下所示。

【Android性能优化】使用 Perfetto 进行链路跟踪(Record trace)

二、外部脚本

能够运用 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

【Android性能优化】使用 Perfetto 进行链路跟踪(Record trace)

然后在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进入记载链路的页面。

【Android性能优化】使用 Perfetto 进行链路跟踪(Record trace)

此处能够设置trace的参数,能够按需挑选需求record的装备项,不需求的就能够不挑选。

【Android性能优化】使用 Perfetto 进行链路跟踪(Record trace)

选完之后点击Recording command,能够检查到一串指令,而这个指令其实就是第一种方法的指令,可是没有采用简略的参数装备,而是运用了比较复杂的参数装备。

【Android性能优化】使用 Perfetto 进行链路跟踪(Record trace)

复制参数到Terminal中调用是和右上角的Start Recording按钮的作用是相同的。

假如没有Start Recording按钮,能够点击Add ADB Device衔接设备,衔接上了就能够开始记载。需求留意的是,假如当时正在运用其他方法衔接设备(例如正在运用Android Studio衔接设备),会导致录制失败,需求中止其他方法的衔接。

点击按钮并成功记载,会自动翻开录制好的文件,和运用外部脚本的行为共同。

【Android性能优化】使用 Perfetto 进行链路跟踪(Record trace)

总结

Perfetto是一个比较新的也是官方引荐的东西,只支撑Android9以上,运用的方法多种多样,算是比较友好了。它也能够用于dump Java内存、本地内存、本地内存符号翻译等等。本文仅仅简略介绍怎么运用,而关于获得了成果文件之后怎么分析卡顿、内存走漏、ANR等等,不同的项目分析方法不相同,还需求更多的实践经验才能熟练掌握。

参考

  • Capture a trace on a device
  • Perfetto 官网文档
  • Android开发者Perfetto介绍
  • Bard