目录
1. 使用Android Device Monitor抓取 Systrace
了解 Systrace: https://source.android.google.cn/devices/tech/debug/systrace
浏览Systrace报告: https://developer.android.google.cn/topic/performance/tracing/navigate-report
系统跟踪概览: https://developer.android.google.cn/topic/performance/tracing
Perfetto: https://developer.android.google.cn/studio/command-line/perfetto
ftrace : https://source.android.google.cn/devices/tech/debug/ftrace
抓取Systrace 办法有很多种,以下会介绍5种:
- android device Monitor 工具抓取
- Systrace 命令抓取
- Atrace
- Perfetto(包含3种方式)
- 高通Perfdump
1. 使用Android Device Monitor抓取 Systrace
Android studio 已经去掉了直接抓取Systrace 的按钮,可以通过打开SDK 的tootls目录的monitor.bat 脚本来启动相关的页面来抓取SysTrace.
脚本的路径:android-sdk\tools\monitor.bat.
Destination File :生成的trace.html文件的地址
Trace duration:抓取时间,默认是5秒. 这个时间可以自己修改,但是时间太长会导致JavaHeap不够而无法保存.
Trace Buffer Size:存储Systrace的size,默认是2048. 太小会导致信息丢失,太长会导致Java Heap不够而无法保存。如果检测结果有异常,请调整Buffer Size的大小试试。
Enable Application Traces from:检测的应用,默认选择none,这里需选择自己需要检测的应用。
Commonly Used Tag:常用标签,默认全部勾选。
Advanced Options:高级选项。如果设备root了,可以看到更多的TAG,如eMMC commands、Synchonization、Kernel Workqueues。
实际多次连续抓取的时候,会出现因为缓存太大,导致抓取失败,可以点击右下角的清除按钮.
2. 使用命令行抓取 Systrace
参考链接:https://developer.android.google.cn/topic/performance/tracing/command-line
使用命令抓取前,需要安装指定版本的python,安装后还是出现出现six 模块的
如果缺少six 模块,执行命令按下:
python -m pip install --upgrade pip
python -m pip install six
命令格式:python systrace.py [options] [categories]
Options 主要是配置时长/buffer 大小/保存文件名称等
Categories 主要是配置具体需要跟踪那些些进程的信息
| 命令和选项 | 说明 |
| -o file | 将 HTML 跟踪报告写入指定的文件。如果您未指定此选项,systrace 会将报告保存到 systrace.py 所在的目录中,并将其命名为 trace.html。 |
| -t N | --time=N | 跟踪设备活动 N 秒。如果您未指定此选项,systrace 会提示您在命令行中按 Enter 键结束跟踪。 |
| -b N | --buf-size=N | 使用 N KB 的跟踪缓冲区大小。使用此选项,您可以限制跟踪期间收集到的数据的总大小。 |
| -k functions | 跟踪逗号分隔列表中指定的特定内核函数的活动。 |
| -a app-name | 启用对应用的跟踪,指定为包含进程名称的逗号分隔列表。这些应用必须包含 Trace 类中的跟踪检测调用。您应在分析应用时指定此选项。很多库(例如 RecyclerView)都包括跟踪检测调用,这些调用可在您启用应用级跟踪时提供有用的信息。如需了解详情,请参阅定义自定义事件。 如需跟踪搭载 Android 9(API 级别 28)或更高版本的设备上的所有应用,请传递用添加引号的通配符字符 "*"。 |
| --from-file=file-path | 把atrace 转换为html 格式的文件 |
| -e device-serial | 在已连接的特定设备(由对应的设备序列号标识)上进行跟踪。 |
| categories | 包含您指定的系统进程的跟踪信息,如 gfx 表示用于渲染图形的系统进程。您可以使用运行命令 systrace -l,以查看已连接设备可用的服务列表。 |
例如,以下命令会调用 systrace 来记录设备活动,并生成一个名为 my_systrace_report.html 的 HTML 报告。
$ python systrace.py -a com.android.systemui -b 16384 -o my_systrace_report.html sched freq idle am wm gfx view binder_driver hal dalvik camera input res
这里没有指定抓取systrace 时长,systrace 会提示您在命令行中按 Enter 键结束跟踪.
如需查看已连接设备支持的类别列表,请运行以下命令:
$ python systrace.py --list-categories
如果您未指定任何类别或选项,systrace 会生成包含所有可用类别的报告,并使用默认设置。可用类别取决于您所使用的已连接设备。
Root 后选项会多一些. 实际使用的时候可以根据个人喜好把user 和userdebug版本的命令保存为对应.bat 脚本文件
3. 命令抓取Atrace
和方法2的方式差不多,本身systrace 就是对atrace的一种封装
3.1. 抓取atrace
开始命令:
| adb shell atrace -c -b 16384 --async_start gfx input view webview wm am sm audio video camera hal res dalvik rs bionic power pm ss database network adb vibrator aidl sched freq idle disk sync -a com.android.systemui |
结束命令:
| adb shell atrace -c -b 16384 --async_stop -z gfx input view webview wm am sm audio video camera hal res dalvik rs bionic power pm ss database network adb vibrator aidl sched freq idle disk sync -a com.android.systemui > atracedump.atrace |
atrace 的categories 选项和systrace 是一样的.
查看categories 命令:
adb shell atrace --list_categories
3.2. 转换为systrace 格式文件
进入SDK 目录systrace目录,类似android-sdk\platform-tools\systrace
| systrace.py --from-file atracedump.atrace -o atracedump.html |
4. Perfetto 抓trace
Perfetto 是 Android 10 中引入的全新平台级跟踪工具。这是适用于 Android、Linux 和 Chrome 的更加通用和复杂的开源跟踪项目。与 Systrace 不同,它提供数据源超集,可让您以 protobuf 编码的二进制流形式记录任意长度的跟踪记录。您可以在 https://ui.perfetto.dev/#!/viewer 链接中打开这些跟踪记录。抓取的方式主要有3种,后面会一一介绍.
Perfetto 和 Systrace 可交互使用,可使用下面的方式把Perfetto 文件以Systrace 方式查看:
1)在 Perfetto 界面中使用旧版 Systrace 查看器打开 Systrace 文件(使用 Open with legacy UI 链接)。
2)使用traceconv工具将 Perfetto 跟踪记录转换为旧版 Systrace 文本格式。
在低于Android R的版本上面默认是关闭的,需要先执行命令打开:
| adb shell setprop persist.traced.enable 1 |
对比Systrace 有很多优点:
- 进程名称显示完整
- Binder跨进程点击跳转,跟踪方便,不需要类似systrace一样跟踪Binder跳转时需要挨个查看线程号
- 支持置顶你感兴趣的线程,放在一起分析更容易
- 看线程被谁唤醒非常方便
- 可以同时跟踪内存/电压/event log等信息
参考链接:
https://developer.android.google.cn/studio/command-line/perfetto
https://perfetto.dev/docs/quickstart/android-tracing
https://developer.android.google.cn/topic/performance/tracing
https://perfetto.dev/docs/quickstart/traceconv
4.1.系统跟踪APP抓取Perfetto
“系统跟踪”应用是一款用于将设备活动保存到跟踪文件的 Android 工具。在 Android 10(API 级别 29)或更高版本的设备上,跟踪文件会以 Perfetto 格式保存。在较低版本 Android 系统的设备上,跟踪文件会以 Systrace 格式保存.这个App 是在Android 9(API 级别 28)或更高版本的设备的系统级应用。此应用类似于 systrace 命令行实用工具,但允许您直接从测试设备本身录制跟踪记录,而无需插入设备并通过 ADB 连接到该设备。
4.1.1打开系跟踪的app 页面
1) adb 指令(请提前开启开发者选项,不然会打开失败)
| adb shell am start com.android.traceur/com.android.traceur.MainActivity |
- 打开 Settings->System->Developer options->System Tracing
录制根据记录:点击开始抓trace,通知通知栏会有通知提示,点击通知会保存systrace
跟踪可调试的应用:是否抓取app
类别:选择抓取那些模块的信息
4.1.2导出 trace 文件
adb pull /data/local/traces/ .
在android Q 之后生成的是以.perfetto-trace 为后缀的文件
4.1.3打开分析网站并打开 trace 文件进行分析
用 Chrome 浏览器打开网址https://ui.perfetto.dev/#!/ 并点击左上角的 Open trace file 就可以分析了。
快捷键的方式基本和 Systrace 的查看方式差不多
数据源选择
perfetto 命令包含以下两种模式:
轻量模式:只能选择一部分数据源,具体来说就是 atrace 和 ftrace。但此模式可提供类似于 systrace 的接口。
普通模式:从协议缓冲区获取其配置,并且可以让您使用 atrace 和 ftrace 之外的数据源,从而更加充分地利用 perfetto 的功能。
下面是简单介绍2种模式下参数不一样的地方,2种模式下命令相同的部分(常规参数)可以参考链接:
https://developer.android.google.cn/studio/command-line/perfetto
轻量模式
在轻量模式下使用 perfetto 的一般语法如下:
adb shell perfetto [ --time TIMESPEC ] [ --buffer SIZE ] [ --size SIZE ] [ ATRACE_CAT | FTRACE_GROUP/FTRACE_NAME | FTRACE_GROUP/* ]...
下表列出了在轻量模式下使用 perfetto 的可用选项:
| 选项 | 说明 |
| --time TIME[s|m|h] | -t TIME[s|m|h] | 指定跟踪记录的持续时间(以秒、分钟或小时为单位)。例如,--time 1m 指定持续 1 分钟的跟踪记录。默认持续时间为 10 秒。 |
| --buffer SIZE[mb|gb] | -b SIZE[mb|gb] | 指定环形缓冲区空间大小,以兆字节 (mb) 或千兆字节 (gb) 为单位。默认参数为 --buffer 32mb。 |
| --size SIZE[mb|gb] | -s SIZE[mb|gb] | 指定文件大小上限,以兆字节 (mb) 或千兆字节 (gb) 为单位。默认情况下,perfetto 仅使用内存中的环形缓冲区。 |
接下来介绍事件说明符列表
| 事件 | 说明 |
| ATRACE_CAT | 指定您想为其记录跟踪数据的 atrace 类别。例如,以下命令会使用 atrace 跟踪窗口管理器: adb shell perfetto --out FILE wm 如需记录其他类别,请参阅 atrace 类别列表。 |
| FTRACE_GROUP/FTRACE_NAME | 指定您想为其记录跟踪数据的 ftrace 事件。例如,以下命令用于跟踪 sched/sched_switch 事件: adb shell perfetto --out FILE sched/sched_switch |
参考命令:
| 抓取: adb shell perfetto -o /data/misc/perfetto-traces/trace_file.perfetto-trace -t 20s sched freq idle am wm gfx view 取出文件: adb pull /data/misc/perfetto-traces/trace_file.perfetto-trace . |
普通模式
在普通模式下使用 perfetto 的一般语法如下:
adb shell perfetto [ --txt ] --config CONFIG_FILE
下表列出了在普通模式下使用 perfetto 的可用选项:
| 选项 | 说明 |
| --config CONFIG_FILE | -c CONFIG_FILE | 指定配置文件的路径。 |
| --txt | 指示 perfetto 将配置文件解析为 pbtxt。此标记为实验性标记,不建议您在正式版中启用此标记。 |
配置文件不会写的,可以在https://ui.perfetto.dev/#!/record 配置好后复制对应命令并另存为配置文件:perfetto_config.pbtx
参考命令:
| adb push perfetto_config.pbtx /data/misc/perfetto-traces/
adb shell perfetto --txt --config /data/misc/perfetto-traces/perfetto_config.pbtx --out /data/misc/perfetto-traces/1.perfetto-trace
adb pull /data/misc/perfetto-traces/1.perfetto-trace |
配置文件:perfetto_config.pbtx
| buffers: { size_kb: 63488 fill_policy: DISCARD } buffers: { size_kb: 2048 fill_policy: DISCARD } data_sources: { config { name: "linux.process_stats" target_buffer: 1 process_stats_config { scan_all_processes_on_start: true } } } data_sources: { config { name: "android.log" android_log_config { } } } data_sources: { config { name: "linux.sys_stats" sys_stats_config { stat_period_ms: 1000 stat_counters: STAT_CPU_TIMES stat_counters: STAT_FORK_COUNT } } } data_sources: { config { name: "linux.ftrace" ftrace_config { ftrace_events: "sched/sched_switch" ftrace_events: "power/suspend_resume" ftrace_events: "sched/sched_wakeup" ftrace_events: "sched/sched_wakeup_new" ftrace_events: "sched/sched_waking" ftrace_events: "power/cpu_frequency" ftrace_events: "power/cpu_idle" ftrace_events: "power/gpu_frequency" ftrace_events: "raw_syscalls/sys_enter" ftrace_events: "raw_syscalls/sys_exit" ftrace_events: "sched/sched_process_exit" ftrace_events: "sched/sched_process_free" ftrace_events: "task/task_newtask" ftrace_events: "task/task_rename" ftrace_events: "mm_event/mm_event_record" ftrace_events: "kmem/rss_stat" ftrace_events: "ion/ion_stat" ftrace_events: "dmabuf_heap/dma_heap_stat" ftrace_events: "kmem/ion_heap_grow" ftrace_events: "kmem/ion_heap_shrink" ftrace_events: "lowmemorykiller/lowmemory_kill" ftrace_events: "oom/oom_score_adj_update" ftrace_events: "ftrace/print" atrace_categories: "gfx" atrace_categories: "input" atrace_categories: "view" atrace_categories: "webview" atrace_categories: "wm" atrace_categories: "am" atrace_categories: "sm" atrace_categories: "audio" atrace_categories: "video" atrace_categories: "camera" atrace_categories: "hal" atrace_categories: "res" atrace_categories: "dalvik" atrace_categories: "rs" atrace_categories: "bionic" atrace_categories: "power" atrace_categories: "pm" atrace_categories: "ss" atrace_categories: "database" atrace_categories: "network" atrace_categories: "adb" atrace_categories: "vibrator" atrace_categories: "aidl" atrace_categories: "nnapi" atrace_categories: "rro" atrace_categories: "binder_driver" atrace_categories: "binder_lock" atrace_apps: "lmkd" } } } duration_ms: 10000 |
4.3 通过网页抓取
目前测试验证有异常,网上搜索反馈windows 目前是会报错,ubuntu 上面是正常的.
5. 高通Perfdump
高通平台支持的一个工具,功能很多,有兴趣的可以尝试. 也是对atrace的一种封装使用.
打开app 页面:
adb shell am start -n com.qualcomm.qti.perfdump/.MainActivity
操作说明:点击Manual mod 会有一个三角形的图标,点击后开始抓Systrace ,再次点击就可以停止.
生成文件路径:在SDCard的根目录一个Perfdump 目录
转换文件格式:systrace.py --from-file trace_output -o output.htm
6.离线抓Systrace 方法
上面的方式4在离线抓取的时候比较方便.如果用其他方式也要离线抓取,可以使用wifi 连接adb后再去抓systrace
设置监听的端口: adb tcpip 5555
连接: adb connect 10.206.209.119:5555
对应的IP 地址可以在手机wifi 信息里面查询
本文详细介绍了多种在Android设备上抓取和分析Systrace的方法,包括使用Android Device Monitor、命令行工具Atrace、Perfetto以及高通Perfdump。Perfetto作为新一代跟踪工具,提供了更丰富的功能,如完整的进程名称、跨进程跟踪和内存分析等。此外,还介绍了如何通过系统跟踪应用和Perfetto命令行工具进行跟踪,并将Perfetto文件转换为Systrace格式进行查看。
1549





