天天看點

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 設定 

在開發者選項裡可以設定

Android 性能優化(25)*性能工具之「Systrace」Analyzing UI Performance with Systrace:用Systrace得到ui性能報告

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