Android 性能优化(25)*性能工具之「Systrace」Analyzing UI Performance with Systrace:用Systrace得到ui性能报告
1.官方文档
https://developer.android.google.cn/topic/performance/tracing
https://ui.perfetto.dev/ 在线阅读trace文件
https://perfetto.dev/ perfetto 官方
2.命令行上捕获系统跟踪
systrace 命令在 {android-sdk}/platform-tools/systrace/ 中。
2.1 语法
python systrace.py [options] [categories]
示例:
$ python systrace.py -o mynewtrace.html sched freq idle am wm gfx view \
binder_driver hal dalvik camera input res
2.2 命令和命令选项
命令和选项 | 说明 |
---|---|
-o file |
将 HTML 跟踪报告写入指定的文件。如果您未指定此选项, |
-t N | --time=N |
跟踪设备活动 N 秒。如果您未指定此选项, |
-b N | --buf-size=N |
使用 N KB 的跟踪缓冲区大小。使用此选项,您可以限制跟踪期间收集到的数据的总大小。 |
-k functions |
跟踪逗号分隔列表中指定的特定内核函数的活动。 |
-a app-name |
启用对应用的跟踪,指定为包含进程名称的逗号分隔列表。这些应用必须包含 跟踪检测调用。您应在分析应用时指定此选项。很多库(例如 检测调用,这些调用可在您启用应用级跟踪时提供有用的信息。如需了解详情,请参阅定义自定义事件。 如需跟踪搭载 Android 9(API 级别 28)或更高版本的设备上的所有应用,请传递用添加引号 的通配符字符 |
--from-file=file-path |
根据文件(例如包含原始跟踪数据的 TXT 文件)创建交互式 HTML 报告,而不是运行实时跟踪。 |
-e device-serial |
在已连接的特定设备(由对应的设备序列号标识)上进行跟踪。 |
categories |
包含您指定的系统进程的跟踪信息,如 运行 |
3. 使用系统录制功能
Android 9(API 级别 28)及以上包含一个名为 System Tracing 的系统级应用 ,可录制系统Systrace(perfetto格式)。
3.1 设置
在开发者选项里可以设置
3.2 导出
adb pull /data/local/traces/ .
4.打开、分析trace文件
https://ui.perfetto.dev/ 在线阅读trace文件
5.adb shell strace
官方教程 https://source.android.google.cn/devices/tech/debug/strace
线上文档 https://man7.org/linux/man-pages/man1/strace.1.html
简单使用如下:
#strace -CttTip PID
- 要以 root 身份运行。
- PID是进程名
结果如下:
1 ..... 2 10:57:57.573781 [0000797de61bfcca] recvfrom(56, "nysv\0\0\0\0\0{+zj\354\34\0\240\347\256\233$\4\0\0\6)\0\0\0\0\0\0"..., 4000, MSG_DONTWAIT, NULL, NULL) = 40 <0.000015> 3 10:57:57.573875 [0000797de61bfcca] recvfrom(56, 0x7ffead8be190, 4000, MSG_DONTWAIT, NULL, NULL) = -1 EAGAIN (Try again) <0.000025> 4 10:57:57.574007 [0000797de61beee7] write(46, "\1\0\0\0\0\0\0\0", 8) = 8 <0.000012> 5 10:57:57.574086 [0000797de61672a8] futex(0x797c137866e8, FUTEX_REQUEUE_PRIVATE, 0, 1, 0x797c137866c4) = 1 <0.000011> 6 10:57:57.574122 [0000797de61672a8] futex(0x797c137866c4, FUTEX_WAKE_PRIVATE, 1) = 1 <0.000010> 7 10:57:57.574254 [0000797de61bfcca] recvfrom(56, 0x7ffead8bb1e0, 4000, MSG_DONTWAIT, NULL, NULL) = -1 EAGAIN (Try again) <0.000011> 8 10:57:57.574326 [0000797de61bf147] ioctl(5, BINDER_WRITE_READ, 0x7ffead8bbe40) = 0 <0.000020> 9 10:57:57.574415 [0000797de61beee7] write(51, "\1\0\0\0\0\0\0\0", 8) = 8 <0.000011> 10 10:57:57.575181 [0000797de61beee7] write(46, "\1\0\0\0\0\0\0\0", 8) = 8 <0.000015> 11 10:57:57.575863 [0000797de61beee7] write(51, "\1\0\0\0\0\0\0\0", 8) = 8 <0.000079> 12 10:57:57.576028 [0000797de61672a8] futex(0x797c237c30a0, FUTEX_WAIT_BITSET_PRIVATE, 98, NULL, FUTEX_BITSET_MATCH_ANY) = 0 <0.000225> 13 10:57:57.576349 [0000797de61bea27] getuid() = 10165 <0.000010> 14 10:57:57.576394 [0000797de61c010a] epoll_pwait(47, [{EPOLLIN, {u32=46, u64=46}}], 16, 0, NULL, 8) = 1 <0.000012> 15 10:57:57.576733 [0000797de61beec7] read(46, "\2\0\0\0\0\0\0\0", 8) = 8 <0.000013> 16 10:57:57.576800 [0000797de61c010a] epoll_pwait(47, [{EPOLLIN, {u32=56, u64=56}}], 16, -1, NULL, 8) = 1 <0.013377> 17 10:57:57.591447 [0000797de61bfcca] recvfrom(56, "nysv\0\0\0\0\0{+zj\354\34\0\0057\255\234$\4\0\0\7)\0\0\0\0\0\0"..., 4000, MSG_DONTWAIT, NULL, NULL) = 40 <0.000018> 18 10:57:57.591550 [0000797de61bfcca] recvfrom(56, 0x7ffead8be190, 4000, MSG_DONTWAIT, NULL, NULL) = -1 EAGAIN (Try again) <0.000010> 19 10:57:57.591659 [0000797de61beee7] write(46, "\1\0\0\0\0\0\0\0", 8) = 8 <0.000013> 20 10:57:57.591752 [0000797de61bea27] getuid() = 10165 <0.000009> 21 10:57:57.591793 [0000797de61c010a] epoll_pwait(47, [{EPOLLIN, {u32=46, u64=46}}], 16, 0, NULL, 8) = 1 <0.000012> 22 10:57:57.591835 [0000797de61beec7] read(46, "\1\0\0\0\0\0\0\0", 8) = 8 <0.000010> 23 .....