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 指令和指令選項
指令和選項 | 說明 |
---|---|
| 将 HTML 跟蹤報告寫入指定的檔案。如果您未指定此選項, 會将報告儲存到 所在的目錄中,并将其命名為 。 |
| 跟蹤裝置活動 N 秒。如果您未指定此選項, 會提示您在指令行中按 Enter鍵結束跟蹤。 |
| 使用 N KB 的跟蹤緩沖區大小。使用此選項,您可以限制跟蹤期間收集到的資料的總大小。 |
| 跟蹤逗号分隔清單中指定的特定核心函數的活動。 |
| 啟用對應用的跟蹤,指定為包含程序名稱的逗号分隔清單。這些應用必須包含 類中的 跟蹤檢測調用。您應在分析應用時指定此選項。很多庫(例如 )都包括跟蹤 檢測調用,這些調用可在您啟用應用級跟蹤時提供有用的資訊。如需了解詳情,請參閱定義自定義事件。 如需跟蹤搭載 Android 9(API 級别 28)或更高版本的裝置上的所有應用,請傳遞用添加引号 的通配符字元 |
| 根據檔案(例如包含原始跟蹤資料的 TXT 檔案)建立互動式 HTML 報告,而不是運作實時跟蹤。 |
| 在已連接配接的特定裝置(由對應的裝置序列号辨別)上進行跟蹤。 |
| 包含您指定的系統程序的跟蹤資訊,如 表示用于渲染圖形的系統程序。您可以使用 指令 運作 ,以檢視已連接配接裝置可用的服務清單。 |
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 .....