Systrace從入門到放棄

什麼是Systrace

Systrace 是 Android4.1 中新增的性能數據採樣和分析工具。它可幫助開發者收集 Android 關鍵子系統(如 SurfaceFlinger/SystemServer/Kernel/Input/Display 等 Framework 部分關鍵模塊、服務,View系統等)的運行信息,從而幫助開發者更直觀的分析系統瓶頸,改進性能。通常使用 systrace 跟蹤系統的 I/O 操作、CPU 負載、Surface 渲染、GC 等事件。

Systrace 的功能包括跟蹤系統的 I/O 操作、內核工作隊列、CPU 負載以及 Android 各個子系統的運行狀況等。在 Android 平臺中,它主要由3部分組成:

內核部分:Systrace 利用了 Linux Kernel 中的 ftrace 功能。所以,如果要使用 Systrace 的話,必須開啓 kernel 中和 ftrace 相關的模塊。 數據採集部分:Android 定義了一個 Trace 類。應用程序可利用該類把統計信息輸出給ftrace。同時,Android 還有一個 atrace 程序,它可以從 ftrace 中讀取統計信息然後交給數據分析工具來處理。 數據分析工具:Android 提供一個 systrace.py( python 腳本文件,位於 Android SDK目錄/platform-tools/systrace 中,其內部將調用 atrace 程序)用來配置數據採集的方式(如採集數據的標籤、輸出文件名等)和收集 ftrace 統計數據並生成一個結果網頁文件供用戶查看。 從本質上說,Systrace 是對 Linux Kernel中 ftrace 的封裝。應用進程需要利用 Android 提供的 Trace 類來使用 Systrace. 關於 Systrace 的官方介紹和使用可以看這裏:http://developer.android.google.cn/tools/help/systrace.html

Systrace 允許你收集和檢查設備上運行的所有進程的計時信息。 它包括Androidkernel的一些數據(例如CPU調度程序,IO和APP Thread),並且會生成HTML報告,方便用戶查看分析trace內容。

systrace 利用了 Linux 的ftrace(https://source.android.google.cn/devices/tech/debug/ftrace)調試工具,相當於在系統各個關鍵位置都添加了一些性能探針,也就是在代碼里加了一些性能監控的埋點。Android 在 ftrace 的基礎上封裝了atrace(https://android.googlesource.com/platform/frameworks/native/+/master/cmds/atrace/atrace.cpp),並增加了更多特有的探針,例如 Graphics、Activity Manager、Dalvik VM、System Server 等。

systrace 工具只能監控特定系統調用的耗時情況,所以它是屬於 sample 類型,而且性能開銷非常低。但是它不支持應用程序代碼的耗時分析,所以在使用時有一些侷限性。由於系統預留了Trace.beginSection接口來監聽應用程序的調用耗時,那我們有沒有辦法在 systrace 上面自動增加應用程序的耗時分析呢?劃重點了,我們可以通過編譯時給每個函數插樁的方式來實現,也就是在重要函數的入口和出口分別增加Trace.beginSection和Trace.endSection。當然出於性能的考慮,我們會過濾大部分指令數比較少的函數,這樣就實現了在 systrace 基礎上增加應用程序耗時的監控。通過這樣方式的好處有:可以看到整個流程系統和應用程序的調用流程。包括系統關鍵線程的函數調用,例如渲染耗時、線程鎖,GC 耗時等。性能損耗可以接受。由於過濾了大部分的短函數,而且沒有放大 I/O,所以整個運行耗時不到原來的兩倍,基本可以反映真實情況。systrace 生成的也是 HTML 格式的結果,我們利用跟 Nanoscope 相似方式實現對反混淆的支持。

備註:何爲sample類型:可能你會覺得按照各種 Linux 命令組合來排查問題太麻煩了,有沒有更簡單的、圖形化的操作界面呢?Traceview 和 systrace 都是我們比較熟悉的排查卡頓的工具,從實現上這些工具分爲兩個流派。第一個流派是 instrument。獲取一段時間內所有函數的調用過程,可以通過分析這段時間內的函數調用流程,再進一步分析待優化的點。第二個流派是 sample。有選擇性或者採用抽樣的方式觀察某些函數調用過程,可以通過這些有限的信息推測出流程中的可疑點,然後再繼續細化分析。

systrace能幹什麼

如果想分析Android系統或者某個app的卡頓性能或者渲染問題,這時候Systrace 就非常有用。

首先我們需要抓取Systrace文件,然後分析並找出引起系統卡頓,或者app反應慢的原因,最好在源碼上解決引起卡頓、響應慢的問題。

一下是其他人搬運的官方的教程:https://www.jianshu.com/p/8ac1ceb5bb14

systrace簡單使用

獲取trace.html的方法,也可參考網上的鏈接:https://blog.csdn.net/weixin_33862514/article/details/91467096

\1. 命令行:systrace -l

python systrace -t 10 -o d:/mytrace.html sched gfx view am -a com.xx.xx

檢查app有沒有掉幀 ​ 功能: ​ 分析UI卡頓 ​ app啓動流程 ​ 分析鎖性能 ​ 參數介紹: ​ 如果測試列表滑動,桌面滑動等流暢性問題 ​ gfx ​ input ​ view ​ 如果還需分析hwui ​ 新增命令參數hwui ​ app啓動,進入某個界面的速度 ​ gfx input view am wm res ​ 懷疑gc或者io導致的卡頓 ​ gfx input view dalvik disk ​ 懷疑電量相關的 ​ power ​ gfx input view res am wm power

 

\2. 工具ddms抓取

 

3.手機上自己抓取:參考鏈接https://www.jianshu.com/p/0ab49e5aeb14,問題來了,這個文件格式需要其他的方式打開:https://www.jianshu.com/p/ab22238a9ab1, 也可以通過這個網址,轉成trace.html

google瀏覽器,輸入Chrome://tracing,點擊load按鈕,導入抓取到的html文件

備註:抓取的時間,最好5s左右

systrace基本使用:https://www.jianshu.com/p/75aa88d1b575

systrace基本使用:https://www.lizenghai.com/archives/26061.html

systrace生成文件的認識

systrace預備知識篇:https://www.androidperformance.com/2019/07/23/Android-Systrace-Pre/

systrace高級使用

參考這個博客的內容使用 :https://blog.csdn.net/w553000664/article/details/106268707 & https://www.androidperformance.com/2019/07/23/Android-Systrace-Pre/

 

同時學習這個課程能極大的理解systrace底層原理以及插樁等分析:張紹文---android開發高手課:https://time.geekbang.org/column/article/73277

** **

systrace使用場景舉例

app冷啓動分析:使用systrace分析:https://www.jianshu.com/p/6451538fb38b

命令行統計app冷啓動時間: adb shell am start -S -R 10 -W pkgname/mainActivity -S 表示每次啓動前先強行停止 -R表示重複測試次數

啓動方式:

冷 還沒有該應用的進程,啓動的時候,創建新進程 ​

熱 後臺有進程,比如home之後 ​

溫 進程還有,但是啓動的入口的acti幹掉了,應用進程還在,在啓動

命令行統計app冷啓動時間

參數 ​

thisTime 最後一個啓動的activity的啓動耗時 ​

totalTime 新應用啓動的耗時,包含新進程的啓動和activity的啓動 ​

waittime(5.0之前沒有) activitymanagerService啓動app的activity時的總時間,包括了當前activity的onpause和自己的activity的啓動

          系統日誌統計 過濾displayed輸出的啓動日誌
          waitTime 時startacriviryAndwait這個方法的調用耗時
          ThisTime 時指調用過程中最後一個activity啓動時間到這個activty的startactivityandWait調用結束
          TotalTime 時指調用過程中第一個activity的啓動時間到最後一個activity的startactivityandwait結束,如果過程中只有一個atvity,則total就等於thistime

WaitTime 就是總的耗時,包括前一個應用 Activity pause 的時間和新應用啓動的時間; ​

ThisTime 表示一連串啓動 Activity 的最後一個 Activity 的啓動耗時; ​

TotalTime 表示新應用啓動的耗時,包括新進程的啓動和 Activity 的啓動,但不包括前 ​ 一個應用 Activity pause 的耗時。也就是說,開發者一般只要關心 TotalTime 即可,這個時間纔是自己應用真正啓動的耗時。

其他性能優化功能簡介

traceView ​ 具體告訴哪個函數時間和調用次數 ​

profile cpu rendering (手機的開發者選項 profile hwUI rendering)

       ​ 藍色 測量繪製的時間 ​

       紅色 執行的時間 display list ​

        橙色 處理時間,耗cpu ​

         紫色 將資源轉移到渲染線程的時間 ​

shell dumpsys fgxinfo com.xxx.x

 

開發階段:使用blockcanary或者anrwatchdog等第三方監控sdk

method  、 tracing 、​ nimbledroid 、​ lint

性能優化方向:

          繪製優化 ​

          內存優化 ​

          存儲優化 ​

          穩定性優化 ​

          耗電優化 ​

          apk瘦身

數據結構優化-設計模式

性能優化必知必會

Android 性能優化必知必會(2020-5-16) https://juejin.im/post/5ebf4f21f265da7bad355036
張紹文---android開發高手課:https://time.geekbang.org/column/article/73277
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章