另一個Android性能剖析工具——simpleperf
談到Android上的性能剖析,很多人會想到TraceView,SysTrace。TraceView擅長Method Tracing,與IDE集成,使用方便,不過有時候它的誤差讓人無法忍受;SysTrace的牛逼之處在于它可以給出整個系統的一些關鍵模塊的性能信息,因此用途廣泛;雖然它也支持分析自定義模塊,但是使用起來稍顯復雜。
事實上,在AOSP中有另外一個性能剖析工具不為人知,這個安靜的小可愛就是今天要介紹的主角—— simpleperf 。我們先來看看它的介紹:
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!這玩意兒還支持 **火焰圖**! 如果你不知道火焰圖為何物,建議看看這篇文章 動態追蹤技術漫談 。
然后,要繪制火焰圖,我們需要借助 FlameGraph 這個工具;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` 結合文檔去探索它的奧妙;祝大家玩得開心~
來自:https://zhuanlan.zhihu.com/p/25277481