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 跟踪报告写入指定的文件。如果您未指定此选项,systrace 会将报告保存到

 systrace.py 所在的目录中,并将其命名为 trace.html

-t N | --time=N

跟踪设备活动 N 秒。如果您未指定此选项,systrace 会提示您在命令行中按 Enter键结束跟踪。

-b N | --buf-size=N 使用 N KB 的跟踪缓冲区大小。使用此选项,您可以限制跟踪期间收集到的数据的总大小。
-k functions
|--ktrace=functions
跟踪逗号分隔列表中指定的特定内核函数的活动。
-a app-name
|--app=app-name

启用对应用的跟踪,指定为包含进程名称的逗号分隔列表。这些应用必须包含 Trace 类中的

跟踪检测调用。您应在分析应用时指定此选项。很多库(例如 RecyclerView)都包括跟踪

检测调用,这些调用可在您启用应用级跟踪时提供有用的信息。如需了解详情,请参阅定义自定义事件

如需跟踪搭载 Android 9(API 级别 28)或更高版本的设备上的所有应用,请传递用添加引号

的通配符字符 "*"

--from-file=file-path 根据文件(例如包含原始跟踪数据的 TXT 文件)创建交互式 HTML 报告,而不是运行实时跟踪。
-e device-serial
|--serial=device-serial
在已连接的特定设备(由对应的设备序列号标识)上进行跟踪。
categories

包含您指定的系统进程的跟踪信息,如 gfx 表示用于渲染图形的系统进程。您可以使用 -l 命令

运行 systrace,以查看已连接设备可用的服务列表。

 

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 .....

 

 

  

 

posted @ 2016-04-23 16:27  f9q  阅读(1538)  评论(0编辑  收藏  举报