Android Studio 中 CPU Profiler 系統性能分析工具的使用

語言: CN / TW / HK

在 Android 的開發中我們常用的系統性能分析工具有 Systrace,Perfetto 與 Profiler 工具。我們依次來看看這些工具。

1 Systace

Systrace 是第一代系統級效能分析工具。在 Perfetto 出現之前,基本上是唯一的效能分析工具(DDMS 在 Android Studio 3.0 就被拋棄),它將 Android 系統和 App 的執行資訊以圖形化的方式展示出來,與 Log 相比,Systrace 的影象化方式更為直觀;與 TraceView 相比,抓取 Systrace 時候的效能開銷基本可以忽略,最大程度地減少觀察者效應帶來的影響。

1.1 Systrace 的設計思路

系統的一些關鍵操作(比如 Touch 操作、Power 按鈕、滑動操作等)、系統機制(input 分發、View 繪製、程序間通訊、程序管理機制等)、軟硬體資訊(CPU 頻率資訊、CPU 排程資訊、磁碟資訊、記憶體資訊等)的關鍵流程上,插入類似 Log 的資訊,我們稱之為 TracePoint(本質是 Ftrace 資訊),通過這些 TracePoint 來展示一個核心操作過程的執行時間、某些變數的值等資訊。然後 Android 系統把這些散佈在各個程序中的 TracePoint 收集起來,寫入到一個檔案中。匯出這個檔案後,Systrace 通過解析這些 TracePoint 的資訊,得到一段時間內整個系統的執行資訊。
Android 系統中,一些重要的模組都已經預設插入了一些 TracePoint,通過 TraceTag 來分類,其中資訊來源如下

  1. Framework Java 層的 TracePoint 通過 android.os.Trace 類完成
  2. Framework Native 層的 TracePoint 通過 ATrace 巨集完成
  3. App 開發者可以通過 android.os.Trace 類自定義 Trace

這樣 Systrace 就可以把 Android 上下層的所有資訊都收集起來並集中展示,對於 Android 開發者來說,Systrace 最大的作用就是把整個 Android 系統的執行狀態,從黑盒變成了白盒。全域性性和視覺化使得 Systrace 成為 Android 開發者在分析複雜的效能問題的時候的首選。
一般抓到的 Systrace 檔案如下 overview.png Systrace 已經很強大了,但 Google 並不滿足,在此基礎上提供了一個更加強大的工具 Pefetto。

2 新一代效能分析全棧工具 Perfetto

Perfetto 相比 Systrace 最大的改進是可以支援長時間資料抓取,這是得益於它有一個可在後臺執行的服務,通過它實現了對收集上來的資料進行 Protobuf 的編碼並存盤。從資料來源來看,核心原理與 Systrace 是一致的,也都是基於 Linux 核心的 Ftrace 機制實現了使用者空間與核心空間關鍵事件的記錄(ATRACE、CPU 排程)。Systrace 提供的功能 Perfetto 都支援,由此才說 Systrace 最終會被 Perfetto 替代。
Perfetto 所支援的資料型別、獲取方法,以及分析方式上看也是前所未有的全面,它幾乎支援所有的型別與方法。資料型別上通過 ATRACE 實現了 Trace 型別支援,通過可定製的節點讀取機制實現了 Metric 型別的支援,在 UserDebug 版本上通過獲取 Logd 資料實現了 Log 型別的支援。
開發者可以通過 Perfetto.dev 網頁、命令列工具手動觸發抓取與結束,通過設定中的開發者選項觸發長時間抓取,甚至你可以通過框架中提供的 Perfetto Trigger API 來動態開啟資料抓取,基本上涵蓋了我們在專案上能遇到的所有的情境。
本文主要討論如何在 Android 使用 Peffetto 來分析效能。提到 Android 的效能分析工具就不得不提 Android Studio 中的 Profiler。

3 Android Studio Profiler 工具

隨著 Android Studio 的迭代、演進,到目前,Android Studio 有了自己的效能分析工具 Android Profiler,它是一個集合體,集成了多種效能分析工具於一體,讓開發者可以在 Android Studio 做開發應用,也不用再下載其它工具就能讓能做效能調優工作。
目前 Android Studio Profiler 已經集成了 4 類效能分析工具: CPU、Memory、Network、Battery,其中 CPU 相關效能分析工具為 CPU Profiler,也是本章的主角,它把 CPU 相關的效能分析工具都整合在了一起,開發者可以根據自己需求來選擇使用哪一個。可能很多人都知道,谷歌已經開發了一些獨立的 CPU 效能分析工具,如 Perfetto、Simpleperf、Java Method Trace 等,現在又出來一個 CPU Profiler,顯然不可能去重複造輪子,CPU Profiler 目前做法就是:從這些已知的工具中獲取資料,然後把資料解析成自己想要的樣式,通過統一的介面展示出來。
CPU Profiler 集成了效能分析工具:Perfetto、Simpleperf、Java Method Trace,它自然而然具備了這些工具的全部或部分功能,如下:

  1. System Trace Recording,它是用 Perfetto 抓取的資訊,可用於分析程序函式耗時、排程、渲染等情況,除了在 Profiler 分析外,還可以將 Trace 匯出檔案後在 https://ui.perfetto.dev/ 上進行分析
  2. Java Method Trace Recording,它是從虛擬機器獲取函式呼叫棧資訊,用於分析 Java 函式呼叫和耗時情況
  3. C/C++ Function Trace,它是用 Simpleperf 抓取的資訊,Simpleperf 是從 CPU 的效能監控單元 PMU 硬體元件獲取資料。 C/C++ Method Trace 只具備 Simpleperf 部分功能,用於分析 C/C++ 函式呼叫和耗時情況

image.png

由此可知,使用 Profiler CPU 中的 System Trace Recording 就是在使用 Perfetto

4 Android 中 System trace 資訊的抓取

那麼我們下面列舉幾個例子來看看如何使用 Perfetto 來抓取和分析效能問題,具備條件的可以直接看 Android Developers 釋出的 Performance - MAD Skills 系列影片,以下示例是根據影片整理出來的,圖中所用例項程式碼來源於 google/iosched

4.1 Android Studio 如何抓取 App 啟動的 trace 資訊

1.點選此應用的 Edit Configurations 按鈕 image.png 2.修改配置

image.png 1. 選擇 Profiling 2. 勾選 Start this recording on startup 3. CPU activity 選擇 Trace System Calls 4. 點選 Aplay 5. 點選 Ok
3.點選 Profile 按鈕 image.png
4.App 執行之後會立即開始抓取,點選 stop 按鈕停止 recording

image.png 5.以下是抓取後的資訊

image.png 稍後我們來看看如何根據展示出的 System trace recording 分析效能問題

4.2 Android Studio 如何抓取任何時候的 trace 資訊

1.啟動 profiler 後,在 CPU 區域,選擇 System trace Recording,點選 Record 按鈕

image.png 2.在 App 中點選或者滑動之後,點選 Stop 按鈕,即可獲取 system trace 資訊

image.png

4.3 使用手機裝置抓取 trace 資訊

在 Android 9(Api 級別 28)或更高版本上有一個 System Tracing 的系統級應用。如何配置請參考官方文件。這裡就不再贅述。
抓取之後的.perfetto-trace檔案可以直接匯入 Android Stuido 的 Profier 進行分析,也可在 https://ui.perfetto.dev/ 上進行分析。
抓取之後的.ctrace檔案可以在 https://ui.perfetto.dev/ 上進行分析。

5 Android 中 System trace 資訊的分析

5.1 CPU 效能剖析器視窗介紹

image.png 1. 事件時間軸:顯示應用中的 activity 在其生命週期內不斷轉換經歷各種不同狀態的過程,並指示使用者與裝置的互動,包括螢幕旋轉事件。 2. CPU 時間軸:顯示應用的實時 CPU 使用率(以佔總可用 CPU 時間的百分比表示)以及應用當前使用的執行緒總數。此時間軸還會顯示其他程序(如系統程序或其他應用)的 CPU 使用率,以便您可以將其與您應用的 CPU 使用率進行對比。可以通過沿時間軸的橫軸方向移動滑鼠來檢查歷史 CPU 使用率資料。 3. 執行緒活動時間軸:列出屬於應用程序的每個執行緒,並使用下面列出的顏色在時間軸上指示它們的活動。記錄軌跡後,可以從此時間軸上選擇一個執行緒,以在軌跡窗格中檢查其資料。

-   **綠色**:表示執行緒處於活動狀態或準備使用 CPU。也就是說,執行緒處於正在執行或可執行狀態。
-   **黃色**:表示執行緒處於活動狀態,但它正在等待一項 I/O 操作(如磁碟或網路 I/O),然後才能完成它的工作。
-   **灰色**:表示執行緒正在休眠且沒有消耗任何 CPU 時間。 當執行緒需要訪問尚不可用的資源時,就會出現這種情況。在這種情況下,要麼執行緒主動進入休眠狀態,要麼核心將執行緒置於休眠狀態,直到所需的資源可用。

5.2 CPU Trace Recording 視窗介紹

image.png 1. 選定範圍:確定需在跟蹤資料窗格中檢查所記錄時間的哪一部分。可以用滑鼠拖選需要觀察的範圍。

  1. “Interaction”部分:沿著時間軸顯示使用者互動和應用生命週期事件。

  2. “Threads”部分:沿時間軸針對每一個執行緒顯示執行緒狀態活動(例如執行、休眠等)和呼叫圖表(在 System Trace 中則為跟蹤事件圖表)。

    • 使用滑鼠和鍵盤快捷鍵(WASD)在時間軸上選擇範圍。
    • 雙擊執行緒名稱,或在選中執行緒時按 Enter 鍵展開或摺疊執行緒。
    • 選擇某個執行緒即可在“Analysis”窗格中檢視更多資訊。 按住 Shift 可選擇多個執行緒。
  3. “Analysis”窗格:顯示所選擇的時間範圍和執行緒/方法呼叫的 trace 資料。在此窗格中,可以選擇如何檢視每個堆疊軌跡(使用“Analysis”標籤頁),以及如何測量執行時間(使用“Time reference”下拉選單)。

  4. “Analysis”窗格標籤頁:選擇如何顯示跟蹤資料詳細資訊。如需詳細瞭解各個選項,請參閱檢查跟蹤資料

  5. "Time reference"選單:選擇以下選項之一,以確定如何測量每次呼叫的時間資訊(僅在Sample/Trace Java 方法中受支援):

    • Wall clock time:該時間資訊表示實際經過的時間。
    • Thread time:該時間資訊表示實際經過的時間減去執行緒沒有佔用 CPU 資源的那部分時間。對於任何給定的呼叫,其執行緒時間始終小於或等於其掛鐘時間。使用執行緒時間可以更好地瞭解執行緒的實際 CPU 使用率中有多少是給定方法或函式佔用的。
  6. Filter:按函式、方法、類或軟體包名稱過濾跟蹤資料。

5.3 在 Android 10 及更低版本上檢測卡頓

Android 10(API 級別 29)及更低版本會在 CPU 效能分析器捕捉的系統軌跡的 Display 中顯示相關的作業系統圖形流水線資訊。 image.png Display 部分顯示以下圖形流水線資訊:FramesSurfaceFlingerVSYNC 和 BufferQueue。 - Frames:此部分顯示應用中的介面執行緒和 RenderThread 軌跡事件。時長超過 16 毫秒的事件會以紅色表示。 - SurfaceFlinger:此部分顯示 SurfaceFlinger 處理幀緩衝區的時間。SurfaceFlinger 是負責將緩衝區內容傳送到顯示屏的系統程序。 - VSYNC:此部分顯示 VSYNC,這是一個表示與 Display 流水線保持同步的訊號。 - BufferQueue:此部分顯示有多少幀緩衝區在排隊等待 SurfaceFlinger 使用。對於部署到搭載 Android 9(API 級別 28)或更高版本的裝置的應用,此軌跡顯示應用 surface BufferQueue 的緩衝區計數(01 或 2)。BufferQueue 可幫助您瞭解影象緩衝區在 Android 圖形元件之間切換時的狀態。例如,值 2 表示應用當前處於三重緩衝狀態,這會導致額外的輸入延遲。
如何檢測卡頓
如需在 Android 10 或更低版本上檢測卡頓,請執行以下操作:

1.檢視 Display 中的 Frames 軌跡。紅色幀是要調查的候選物件。

image.png 2. 發現可能存在卡頓的幀後,請按 W,或在按住 Control 鍵的同時滾動滑鼠滾輪,以便進行放大。繼續放大,直到您看到介面執行緒和 RenderThread 中的軌跡事件。 image.png Choreographer#doFrame 顯示了介面執行緒何時呼叫 Choreographer 來協調動畫、檢視佈局、影象繪製和相關程序。DrawFrames 會在 RenderThread 形成並向 GPU 發出實際繪製命令時顯示。
3.如果發現某個軌跡事件特別長,可以進一步放大,以便找出可能導致呈現速度緩慢的原因。下圖顯示了介面執行緒中的 inflate,這意味著應用正在花時間 inflate 佈局。當放大其中一個 inflate 事件時,可以確切瞭解每個介面元件花費的時間

image.png

官方文件還介紹了在 Android 11 及更高版本上檢測卡頓,這裡就不說明了,感興趣的可以去看看。

6 總結

應用的效能問題主要分為兩類:響應慢、不流暢。

  • 響應慢問題常有:應用啟動慢、頁面跳轉慢、列表載入慢、按鈕響應慢等
  • 不流暢問題常有:列表滑動不流暢、頁面滑動不跟手、動畫卡頓等

CPU Profiler 在這些場景中要如何使用呢?基本的思路是:首先就要抓 System Trace,先用System Trace 分析、定位問題,如果不能定位到問題,再借助 Java Method Trace 或 C/C++ Function Trace 進一步分析定位。
Android Studio 中的 CPU Profiler 最大優勢是集成了各種子工具,在一個地方就能操作一切,對應用開發者來說是還是非常方便的。