CPU性能分析器主要用于捕獲、分析CPU使用的情況,通過捕獲的信息可以分析應用的CPU使用率、線程活動、函數(shù)調用及其開銷時間、與系統(tǒng)交互的流程等。通過分析CPU的使用可以優(yōu)化應用的CPU的使用率,有效提升應用的流暢性、提升用戶使用體驗、較少電量消耗提升使用時間等
CPU 性能分析器概覽
按以下步驟打開CPU性能分析器:
- 依次選擇View——》Tool windows——》Profiler或者點擊工具欄中的Profiler圖標
- 點擊CPU時間抽上的任意位置打開CPU性能分析器
當打開CPU性能分析時,它會立即顯示應用的CPU使用率和線程活動情況,如下圖所示:

1、事件時間軸:顯示應用中的activity在其生命周期內不斷轉換經(jīng)歷的各種不同狀態(tài)過程,如touch(down、press等)事件、屏幕選中等。
2、CPU時間軸:顯示應用的實時CPU使用率(以占總可以CPU的百分比表示)、其他應用的實時CPU使用率、應用當前使用的線程總數(shù)。
3、線程活動時間軸:這里會列出應用的每個線程,使用一下不同顏色表示它們的活動情況:
- 綠色:表示線程處于活動狀態(tài)或者準備使用CPU。代表線程正在運行或者可運行狀態(tài)
- 黃色:表示線程處于活動狀態(tài),但它正在等待一個項IO操作(如磁盤讀寫、請求網(wǎng)絡等),然后才能完成它的工作。
- 灰色:表示線程正在休眠且沒有消耗任何CPU時間。當線程需要訪問尚不可用的資源時,就會出現(xiàn)這種情況,在這種情況下,要么線程進入休眠狀態(tài),要么內核將線程置于休眠狀態(tài),知道所有資源可用。
捕獲CPU使用信息
在CPU性能分析器中,可以根據(jù)需要捕獲不同的數(shù)據(jù):
- Java Method Sample Recording(Java 方法采樣):對Java方法的CPU使用信息進行采用、捕獲記錄,它是在應用的Java執(zhí)行期間,頻繁捕獲應用的調用堆棧,分析器依據(jù)捕獲的堆棧信息推倒出于應用的Java代碼執(zhí)行有關的時間和資源使用情況。重點:通過捕獲堆棧分析Java方法代碼執(zhí)行的時間及資源使用情況(不是java方法調用的所有細節(jié)都會捕獲到)。
- Java Method Trace Recording(跟蹤java方法):追蹤java方法會記錄每個java方法開始調用和結束調用的時間戳,系統(tǒng)會收集比較這些時間戳,用于生成方法追蹤數(shù)據(jù),包括方法調用花費時間和CPU使用率。這種捕獲方式會影響APP的運行效率。
- C/C++ Function Reacording(對C/C++函數(shù)采樣):與Java 方法采樣類似,不過這里是對原生C/C++方法的采樣,通過捕獲原生C/C++的堆棧來追蹤原生方法的CPU使用情況,包括時間開銷、CPU使用率等。這種捕獲方式只支持Android8.0+的設備。
- System Tracing Recording(追蹤系統(tǒng)調用):會捕獲應用與系統(tǒng)資源交互的細節(jié),如:線程當前狀態(tài)的確切時間和持續(xù)時間及與系統(tǒng)交互的情況、渲染情況、CPU調度情況等。注重點在于系統(tǒng)調用的細節(jié),一般用于性能瓶頸分析
可以在代碼中調用系統(tǒng)提供的API,捕獲追蹤對應的CPU使用信息,如:
- Debug.startMethodTracingSampling和Debug.stopMethodTracing對應的是捕獲java方法采樣
- Debug.startMethodTracing和Debug.stopMethodTracing對應的是跟蹤java方法
- Trace.beginSection和Trace.endSection對應的是追蹤系統(tǒng)調用
也可以在CPU分析器中勾選要捕獲記錄CPU的配置信息,點擊開始即可可是捕獲,點擊停止捕獲后CPU性能分析器會自動打開捕獲到的記錄CPU活動的信息。
也可以在命令行使用systrace和traceview的命令捕獲systrace和traceview的追蹤數(shù)據(jù)進行分析。
要使用Android Studio捕獲應用啟動時自動開始記錄CPU使用信息,可以執(zhí)行以下操作:
- 依次選擇Run——》Edit Configurations
- 在Profiler標簽中,勾選Start recording a method trace on startup復選框
- 從菜單中選擇CPU記錄配置
- 點擊apply
- 依次選擇Run——》Profile,將應用部署到Android8.0+的設備上
分析
捕獲到記錄CPU活動的信息之后,CPU性能分析器會自動打開追蹤的日志文件,如下圖:
[圖片上傳失敗...(image-60165a-1649840871050)]
1、Display顯示圖形流水線信息:
- Frames: 顯示應用中UI線程和渲染線程的軌跡,可以理解為顯示每幀的開銷情況,標紅表示此幀繪制時間超過16ms,存在性能問題,我們主要關注的也是標紅的部分
- SurfaceFlinger: 此部分顯示SurfaceFlinger處理幀緩存區(qū)的時間。SurfaceFlinger是負責將緩存區(qū)內容發(fā)送到顯示屏的系統(tǒng)進程。
- VSYNC: 此部分顯示VSYNC,是一個表示與顯示流水線保持同步的信號。如果軌跡上出現(xiàn)VSYNC-app信號,這個信號會在應用啟動時間過晚時顯示,發(fā)生這種情況一般是UI線程處于過于忙碌狀態(tài)。在動畫播放期間,它會導致屏幕上出現(xiàn)可見的閃爍,且在動畫或者滾動完成之前,會持續(xù)帶來額外的輸入延遲。
- BufferQueue: 此部分顯示有多少幀緩沖區(qū)在排隊等待SurfaceFlinger使用。
2、活動線程狀態(tài)信息:記錄的是線程與界面界面程序相關信息,如:inflate、layout、draw等方法的調用及開銷情況
3、Top Down:所有線程中函數(shù)調用情況,Top Down中顯示每個方法調用所花的CPU時間:
- self:方法內部調用自己的代碼所花的時間(不含執(zhí)行其他方法的時間)
- children: 方法內部執(zhí)行其他方法所花的時間
-
total: self和children的總和。表示應用在調用執(zhí)行方法的總時間
4、Flame chart: 以倒置圖表的方式顯示方法調用情況,如下圖所示:
flameChart.png
上圖中是Top Down函數(shù)調用按逆序用圖表的方式進行展示,如:依次調用了:
main——》xxx.initFnSDK——》xxx.loader......
tt_pangle_thread_pll_report1——》xxxThread.run.....
......
鼠標移到每個條目上都會響應的顯示在相對時間段內執(zhí)行該方法所花費的時間(包括self和childred)
5、Bottom Up: 函數(shù)被調用情況,方法默認按占用CPU時間由多到少的順序對排序顯示,展開是調用此方法的方法列表。
我們可以:
- 通過在Top Down和Bottom Up中查看方法調用和被調用的情況及其開銷時間,排查java方法層面性能問題。
-
通過排查Display中Frames被標紅的部分,ctrl + 滑動鼠標滾輪放大(或者按w鍵減小放大,s鍵縮小,a鍵左移,d鍵右移),查看各個線程的調用情況,特別是UI線程、renderThread,如下圖所示:
frames.png
放大之后,我們通過分析ui線程中各ui相關方法的開銷,如traversal方法,點擊它可以在后側展示此方法的Top Down、Flame Chart、Bottom Up等情況

