另一個Android效能剖析工具——simpleperf

disable發表於2021-09-09

另一個Android效能剖析工具——simpleperf

原文連結:

談到Android上的效能剖析,很多人會想到TraceView,SysTrace。TraceView擅長Method Tracing,與IDE整合,使用方便,不過有時候它的誤差讓人無法忍受;SysTrace的牛逼之處在於它可以給出整個系統的一些關鍵模組的效能資訊,因此用途廣泛;雖然它也支援分析自定義模組,但是使用起來稍顯複雜。

事實上,在AOSP中有另外一個效能剖析工具不為人知,這個安靜的小可愛就是今天要介紹的主角—— 。我們先來看看它的介紹:

Simpleperf is a native profiling tool for Android. Its command-line interface supports broadly the same options as the linux-tools perf, but also supports various Android-specific improvements.

native profiling?是不是很心動? 

至於simpleperf的原理,簡單來說,現代CPU一般都帶有一個叫做效能監視單元(PMU)的元件,這個硬體能夠記錄諸如cpu週期數、執行的指令數、快取失效次數等等關鍵資訊;Linux核心對這個硬體做了一層封裝,透過 `perf_event_open` 系統呼叫把介面暴露給使用者空間;這就是simpleperf工具的由來。

簡介和原理都表明這個工具貌似很牛逼,接下來我們就試一試。

首先把AOSP上的原始碼下載下來,。

simpleperf是一個命令列工具,與systrace不同的是,它的工具集包涵client端和host端;client端執行在Android系統上,負責收集效能資料;host端則執行在你的開發機上,負責對資料進行分析和視覺化。(這些可執行檔案在下載後的bin資料夾的android和win/mac/linux下)整個工具鏈使用起來相對複雜,所幸simpleperf的創造者提供了一個炒雞傻瓜的使用指令碼,使用起來毫不費力,非常方便!這個指令碼就是 `app_profile.py`。

我們把 simpleperf 下載下來之後,首先修改 `app_profile.config` 檔案中的配置,主要是以下幾個欄位:

# 待分析的app的包名,需要是debuggable的
app_package_name = ""

# 分析的命令,體驗的話使用預設即可;更詳細的用途看文件。
record_options = "-e cpu-cycles:u -f 4000 -g --dump-symbols --duration 10"

# 待分析app的主介面,app_profile.py會透過am start 幫助開啟app
main_activity = ''

然後在你的裝置上安裝待分析的App,要注意的是這個App必須是debuggable的,在AndroidManifest中把debuggable設定為true即可。接下來,就可以直接透過:

python app_profile.py 

進行分析了,這個指令碼幫你完成了simpleperf下載,許可權設定,開啟app,匯出資料等等一系列過程;開始分析之後,就可以對App進行操作;在設定好的時間之後就會停止分析,跟SysTrace一樣。分析完畢之後,指令碼會自動把分析資料從裝置上pull下來並存放在當前目錄下,叫 perf.data。

接下來就是分析資料了;原始的資料是一個文字檔案,長這樣:

0.00%     0.00%  ORDERED_THREAD_  17046  18210  /system/lib/libart.so                                                                                         art::Mutex::ExclusiveLock(art::Thread*)
       |
       -- art::Mutex::ExclusiveLock(art::Thread*)
0.00%     0.00%  AsyncTaskExecut  17046  18216  /system/lib/libart.so                                                                                         art::Monitor::Lock(art::Thread*)
       |
       -- art::Monitor::Lock(art::Thread*)
          |
          |--52.01%-- art::Mutex::ExclusiveLock(art::Thread*)
          |
           --0.54%-- art::Mutex::ExclusiveUnlock(art::Thread*)

巢狀如果過深,基本就看不懂了;所幸我們有另外一個分析指令碼!直接執行:

python report.py -g

會啟動一個GUI顯示分析得到的資料,這個GUI使用python的tk寫的,實話說,長得比較醜。。





簡單觀察分析圖,可以知道,的確支援native profiling;gui和TraceView差不多,比較直觀,但是指標沒有TraceView多。另外,這個工具由於硬體直接支援,對效能的影響非常小;光是這一點就好頂讚了。

你以為這就完了?No!這玩意兒還支援 火焰圖! 如果你不知道火焰圖為何物,建議看看這篇文章。

然後,要繪製火焰圖,我們需要藉助  這個工具;clone下來之後,裡面的指令碼就可以直接使用了。(perl指令碼,windows系統需要安裝Perl語言的支援)

接下來我們執行命令:

$python report_sample.py >out.perf
$stackcollapse-perf.pl out.perf >out.folded
$./flamegraph.pl out.folded > graph.svg

我們用Chrome瀏覽器開啟這個 `graph.svg` 即可得到火焰圖:

圖片描述

透過火焰圖,我們能非常直觀地看到效能的瓶頸,對於分析效能問題很有幫助;相信這個圖已經說明一切了。

當然 simpleperf 遠非這麼簡單,我只是帶大家嚐嚐鮮;對它感興趣的,可以執行 `simpleperf -h` 結合文件去探索它的奧妙;祝大家玩得開心~


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/200/viewspace-2808436/,如需轉載,請註明出處,否則將追究法律責任。

相關文章