什麼是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