Android Studio CPU profiler性能分析工具介紹和使用詳解

Android Studio CPU profiler性能分析工具介紹和使用詳解


CPU profiler介紹

Android Studio CPU 性能剖析器可實時檢查應用的 CPU 使用率和線程活動。你還可以檢查方法跟蹤記錄、函數跟蹤記錄和系統跟蹤記錄中的詳細信息。

使用CPU profiler來解決哪些性能問題

  1. 我們可以使用CPU profiler來分析CPU耗時問題,解決由於CPU資源消耗而產生的性能問題。
  2. 我們可以使用CPU profiler來查看主線程中每個方法的耗時情況,以及每個方法的調用棧,可以很方便的分析卡頓產生的原因,以及定位到具體的代碼方法。
  3. 我們可以使用它來進行啓動優化分析,查看APP啓動時的耗時問題。
  4. 我們可以使用它來查看線程的執行情況,定位線程的CPU資源佔用等問題。

CPU Profiler可以記錄和顯示以下性能數據:

  • 系統跟蹤數據:捕獲精細的詳細信息,以便檢查應用與系統資源的交互情況。

  • 方法和函數跟蹤數據:對於應用進程中的每個線程,你可以瞭解一段時間內執行了哪些方法 (Java) 或函數 (C/C++),以及每個方法或函數在其執行期間消耗的 CPU 資源。你還可以使用方法和函數跟蹤數據來識別調用方和被調用方。調用方是指調用其他方法或函數的方法或函數,而被調用方是指被其他方法或函數調用的方法或函數。你可以使用此信息來確定哪些方法或函數負責調用常常會消耗大量資源的特定任務,並優化應用的代碼以避免不必要的工作。

記錄方法跟蹤數據時,您可以選擇「sampled」或「instrumented」記錄。記錄函數跟蹤數據時,只能使用「sampled」記錄。

CPU profiler的使用

打開CPU profiler

要打開 CPU Profiler,請按以下步驟操作:

  1. 連接真機或虛機設備,確保可以進行ADB調試,依次選擇 View > Tool Windows > Profiler 或點擊工具欄中的 Profile 圖標。
  2. 當APP運行起來後,點擊 CPU 時間軸上的任意位置以打開 CPU Profiler。

CPU Profiler視圖介紹

當你打開 CPU Profiler 時,它會立即開始顯示應用的 CPU 使用率和線程活動。你會看到類似於下圖的一些內容:
在這裏插入圖片描述

CPU Profiler 的默認視圖包括以下時間軸:

  1. 事件時間軸:顯示應用中的 Activity 在其生命週期內不斷轉換而經歷各種不同狀態的過程,並指示用戶與設備的交互,包括屏幕旋轉事件。如需瞭解如何在搭載 Android 7.1(API 級別 25)及更低版本的設備上啓用事件時間軸,請參閱啓用高級分析

  2. CPU 時間軸:顯示應用的實時 CPU 使用率(以佔總可用 CPU 時間的百分比表示)以及應用當前使用的線程總數。此時間軸還顯示其他進程(如系統進程或其他應用)的 CPU 使用率,以便您可以將其與您應用的使用率進行對比。您可以通過沿時間軸的水平軸移動鼠標來檢查歷史 CPU 使用率數據。

  3. 線程活動時間軸:列出屬於應用進程的每個線程,並使用下面列出的顏色在時間軸上指示它們的活動。記錄跟蹤數據後,您可以從此時間軸上選擇一個線程,以在跟蹤數據窗格中檢查其數據。

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

CPU Profiler 還會報告 Android Studio 和 Android 平臺添加到應用進程的線程的 CPU 使用率,這些線程包括 JDWP、Profile Saver、Studio:VMStats、Studio:Perfa 和 Studio:Heartbeat 等(然而,它們在線程活動時間軸上顯示的確切名稱可能有所不同)。Android Studio 將報告此數據,以便您確定線程活動和 CPU 使用率實際在何時是由您的應用的代碼引發。

記錄跟蹤數據

要開始記錄跟蹤數據,請從 CPU Profiler 頂部的下拉菜單中選擇記錄配置,然後點擊 Record。

在這裏插入圖片描述

如圖,CPU Profiler 顯示了正在進行的記錄的狀態、持續時間和類型:

在這裏插入圖片描述

與您的應用交互,然後在完成時點擊 Stop。分析器將自動選擇記錄的時間範圍,並在跟蹤數據窗格中顯示其跟蹤信息,如圖 3 所示。如果要檢查其他線程的跟蹤數據,請從線程活動時間軸上選擇相應線程。
在這裏插入圖片描述

  1. 選定範圍:確定要在跟蹤數據窗格中檢查所記錄時間的哪一部分。當您首次記錄跟蹤數據時,CPU Profiler 會自動在 CPU 時間軸上選擇記錄的完整長度。要僅檢查所記錄時間範圍的一部分的跟蹤數據,請拖動突出顯示區域的邊緣。
  2. 時間戳:指示所記錄跟蹤數據的開始和結束時間(相對於分析器開始收集 CPU 使用率信息的時間)。要選擇完整的記錄,請點擊時間戳。
  3. 跟蹤數據窗格:顯示您選擇的時間範圍和線程的跟蹤數據。只有在您至少記錄一條跟蹤數據後,纔會顯示此窗格。在此窗格中,您可以選擇如何查看每個堆棧軌跡(使用跟蹤數據標籤),以及如何測量執行時間(使用時間參考下拉菜單)。
  4. 跟蹤數據窗格標籤:選擇如何顯示跟蹤數據詳細信息。
  5. 時間參考菜單:選擇以下選項之一,以確定如何測量每次調用的時間信息:
    • Wall clock time:時間信息表示實際經過的時間。
    • Thread time:時間信息表示實際經過的時間減去線程在該時間內沒有消耗 CPU 資源的所有部分。對於任何給定的調用,其線程時間始終小於或等於其掛鐘時間。使用線程時間可以讓您更好地瞭解線程的實際 CPU 使用率中有多少是給定方法或函數消耗的。
  6. 過濾器:按函數、方法、類或軟件包名稱過濾跟蹤數據。例如,如果您要快速識別與特定調用相關的跟蹤數據,請點擊 Filter 圖標或按 Ctrl + F(在 Mac 上,按 Command + F 鍵),然後在搜索字段中輸入相應的名稱。在 Call chart 和 Flame chart 標籤中,會突出顯示包含符合搜索查詢條件的調用、軟件包或類的調用堆棧。在 Top down 和 Bottom up 標籤中,這些調用堆棧優先於其他跟蹤結果。您還可以通過勾選搜索字段旁邊的相應框來啓用以下選項:
    • Regex:要在您的搜索中包含正則表達式,請使用此選項。
    • Match case:如果您的搜索區分大小寫,請使用此選項。

選擇記錄配置

在開始記錄跟蹤信息之前,請爲要捕獲的分析信息選擇適當的記錄配置:

  • 對 Java 方法採樣:在應用的 Java 代碼執行期間,頻繁捕獲應用的調用堆棧。分析器會比較捕獲的數據集,以推導與應用的 Java 代碼執行有關的時間和資源使用信息。

基於採樣的跟蹤存在一個固有的問題,那就是如果應用在捕獲調用堆棧後進入一個方法且在下次捕獲前退出該方法,則分析器不會記錄該方法調用。如果您想要跟蹤生命週期如此短的方法,應使用檢測跟蹤。

  • 跟蹤 Java 方法:在運行時檢測應用,以在每個方法調用開始和結束時記錄一個時間戳。系統會收集並比較這些時間戳,以生成方法跟蹤數據,包括時間信息和 CPU 使用率。

請注意,與檢測每個方法關聯的開銷會影響運行時性能,並且可能會影響分析數據;對於生命週期相對較短的方法,這一點更爲明顯。此外,如果應用在短時間內執行大量方法,則分析器可能很快就會超出其文件大小限制,因而不能再記錄更多跟蹤數據。

  • 對 C/C++ 函數採樣:捕獲應用的原生線程的採樣跟蹤數據。要使用此配置,您必須將應用部署到搭載 Android 8.0(API 級別 26)或更高版本的設備上。

在內部,此配置使用 simpleperf 跟蹤應用的原生代碼。如果要爲 simpleperf 指定其他選項,如對特定設備 CPU 採樣指定高精度採樣持續時間,您可以從命令行使用 simpleperf。

  • 跟蹤系統調用:捕獲精細的詳細信息,以便您檢查應用與系統資源的交互情況。您可以檢查線程狀態的確切時間和持續時間、直觀地查看所有核心的 CPU 瓶頸在何處,並添加要分析的自定義跟蹤事件。當您排查性能問題時,此類信息至關重要。要使用此配置,您必須將應用部署到搭載 Android 7.0(API 級別 24)或更高版本的設備上。

使用此跟蹤配置時,您可以通過檢測代碼來直觀地標記分析器時間軸上的重要代碼例程。要檢測 C/C++ 代碼,請使用原生跟蹤 API(由 trace.h 提供)。要檢測 Java 代碼,請使用 Trace 類。

此跟蹤配置在 systrace 的基礎上構建而成。您可以使用 systrace 命令行實用程序指定 CPU Profiler 中提供的選項以外的其他選項。systrace 提供的其他系統級數據可幫助您檢查原生系統進程並排查丟幀或幀延遲問題。

分析跟蹤數據

CPU Profiler 中的跟蹤數據窗格提供多個標籤,供您選擇如何查看所記錄跟蹤數據的信息。

對於方法跟蹤數據和函數跟蹤數據,您可以從 Call Chart、Flame Chart、Top Down 和 Bottom Up 標籤中進行選擇。對於系統跟蹤數據,您可以從 Trace Events、Flame Chart、Top Down 和 Bottom Up 標籤中進行選擇。

使用「Call Chart」標籤檢查跟蹤數據

Call Chart 標籤提供方法跟蹤數據或函數跟蹤數據的圖形表示形式,其中調用的時間段和時間在水平軸上表示,而其被調用方顯示在垂直軸上。對系統 API 的調用顯示爲橙色,對應用自有方法的調用顯示爲綠色,對第三方 API(包括 Java 語言 API)的調用顯示爲藍色。圖 4 顯示了一個調用圖表示例,說明了給定方法或函數的 Self 時間、Children 時間和 Total 時間的概念。如需詳細瞭解這些概念,請參閱有關如何使用 Top Down 和 Bottom Up 檢查跟蹤數據的部分。
在這裏插入圖片描述

圖 4. 一個調用圖表示例,說明了方法 D 的 Self 時間、Children 時間和 Total 時間。

提示:要跳轉到某個方法或函數的源代碼,請右鍵點擊該方法或函數,然後選擇 Jump to Source。從任何跟蹤數據窗格標籤中均可執行此操作。

使用「Flame Chart」標籤檢查跟蹤數據

Flame Chart 標籤提供一個倒置的調用圖表,用來彙總完全相同的調用堆棧。也就是說,將具有相同調用方順序的完全相同的方法或函數收集起來,並在火焰圖中將它們表示爲一個較長的橫條(而不是將它們顯示爲多個較短的橫條,如調用圖表中所示)。這樣更方便您查看哪些方法或函數消耗的時間最多。不過,這也意味着,水平軸不代表時間軸,而是表示執行每個方法或函數所需的相對時間量。

爲幫助說明此概念,不妨考慮圖 5 中的調用圖表。請注意,方法 D 多次調用 B(B1、B2 和 B3),其中一些對 B 的調用也調用了 C(C1 和 C3)。

在這裏插入圖片描述

圖 5. 一個調用圖表,其中的多個方法調用有着共同的調用方順序。

由於 B1、B2 和 B3 具有相同的調用方順序 (A → D → B),因此將它們彙總在一起,如圖 6 所示。同樣,也將 C1 和 C3 彙總在一起,因爲它們也具有相同的調用方順序 (A → D → B → C)。請注意,C2 不包括在內,因爲它具有不同的調用方順序 (A → D → C)。
在這裏插入圖片描述

圖 6. 彙總具有相同調用堆棧的完全相同的方法。

彙總的調用用於創建火焰圖,如圖 7 所示。請注意,對於火焰圖中的任何給定調用,先顯示的是消耗最多 CPU 時間的被調用方。

在這裏插入圖片描述

圖 7. 圖 5 中所示調用圖表的火焰圖表示形式。

使用「Top Down」和「Bottom Up」檢查跟蹤數據

Top Down 標籤顯示一個調用列表,在該列表中展開方法或函數節點會顯示它的被調用方。圖 8 顯示了圖 4 中調用圖表的自上而下圖。圖中的每個箭頭都從調用方指向被調用方。

如圖 8 所示,在 Top Down 標籤中展開方法 A 的節點會顯示它的被調用方,即方法 B 和 D。在此之後,展開方法 D 的節點會顯示它的被調用方,即方法 B 和 C,依此類推。與 Flame chart 標籤類似,「Top Down」樹也彙總具有相同調用堆棧的完全相同的方法的跟蹤信息。也就是說,Flame chart 標籤提供 Top down 標籤的圖形表示形式。

Top Down 標籤提供以下信息來幫助說明在每個調用上所花的 CPU 時間(時間也可表示爲在選定範圍內佔線程總時間的百分比):

  • Self:方法或函數調用在執行自己的代碼(而非被調用方的代碼)上所花的時間,如圖 4 中的方法 D 所示。
  • Children:方法或函數調用在執行它的被調用方(而非自己的代碼)上所花的時間,如圖 4 中的方法 D 所示。
  • Total:方法的 Self 時間和 Children 時間的總和。這表示應用在執行調用上所花的總時間,如圖 4 中的方法 D 所示。
    在這裏插入圖片描述

Bottom Up 標籤顯示一個調用列表,在該列表中展開函數或方法節點會顯示它的調用方。沿用圖 8 中所示的跟蹤數據示例,圖 9 提供了方法 C 的「Bottom Up」樹。在「Bottom Up」樹中打開方法 C 的節點會顯示它獨有的各個調用方,即方法 B 和 D。請注意,儘管 B 調用 C 兩次,但在「Bottom Up」樹中展開方法 C 的節點時,B 僅顯示一次。在此之後,展開 B 的節點會顯示它的調用方,即方法 A 和 D。

Bottom Up 標籤用於按照消耗的 CPU 時間由多到少(或由少到多)的排序對方法或函數排序。您可以檢查每個節點以確定哪些調用方在調用這些方法或函數上所花的 CPU 時間最多。與「Top Down」樹相比,「Bottom Up」樹中每個方法或函數的時間信息參照的是每個樹頂部的方法(頂部節點)。CPU 時間也可表示爲在該記錄期間佔線程總時間的百分比。下表有助於說明如何解釋頂部節點及其調用方(子節點)的時間信息。
在這裏插入圖片描述

注意:對於給定的記錄,當分析器達到文件大小限制時,Android Studio 會停止收集新數據(不過,不會停止記錄)。在執行檢測跟蹤時,這種情況通常發生得更快,因爲與採樣跟蹤相比,此類跟蹤會在更短的時間內收集更多的數據。如果您將檢查時間範圍延長至達到限制後的記錄期間,則跟蹤數據窗格中的時間數據不會發生變化(因爲沒有新數據可用)。此外,當您僅選擇沒有數據可用的記錄部分時,對於時間信息,跟蹤數據窗格將顯示 NaN。

使用「Trace Events」標籤檢查系統跟蹤數據

檢查系統跟蹤數據時,您可以使用 Trace Events 標籤查看每個線程上發生的事件的詳細信息。

要查看某個線程的詳細信息,請在 Threads 窗格中選擇該線程。這樣將在 Kernel 窗格中突出顯示該線程在每個 CPU 核心上的活動,並在 Trace Events 標籤中顯示該線程的事件。在 Trace Events 標籤中將鼠標指針懸停在某個事件上可查看該事件的名稱以及在每種狀態下所花的時間。

例如,在圖 10 中,在 Threads 窗格中選擇了 RenderThread,在 Kernel 窗格中突出顯示了該線程在 CPU 0 和 CPU 1 上的活動,並在 Trace Events 標籤中顯示了在特定事件上所花的時間。
在這裏插入圖片描述

圖 10. 查看渲染線程的 CPU 活動和跟蹤事件。

如需詳細瞭解如何檢查系統跟蹤信息,請參閱 systrace 文檔的調查界面性能問題部分。

檢查幀渲染數據

您可以檢查應用在主線程和 RenderThread 上渲染每個幀所用的時間,以調查導致界面卡頓和幀速率較低的瓶頸。

要查看幀渲染數據,請使用可讓您跟蹤系統調用的配置記錄跟蹤記錄。記錄跟蹤數據後,在名爲 FRAMES 的部分下查找有關每個幀的信息,如圖 11 所示。
在這裏插入圖片描述

圖 11. 每個所用時間超過 16 毫秒的幀都以紅色顯示。

性能數據的導出和導入

導出跟蹤數據

使用 CPU Profiler 記錄 CPU 活動後,您可以將相應數據導出爲 .trace 文件,以便與他人共享或日後進行檢查。

要從 CPU 時間軸導出跟蹤文件,請執行以下操作:

  1. 在 CPU 時間軸上,右鍵點擊要導出的記錄的方法跟蹤數據或系統跟蹤數據。
  2. 從菜單中選擇 Export trace。
  3. 瀏覽到要將文件保存到的位置,指定文件名,然後點擊 OK。

要從 Sessions 窗格導出跟蹤文件,請執行以下操作:

  1. 在 Sessions 窗格中,右鍵點擊要導出的記錄的跟蹤數據。
  2. 點擊會話條目右側的 Export method trace 或 Export system trace 按鈕。
  3. 瀏覽到要將文件保存到的位置,指定文件名,然後點擊 OK。

導入跟蹤數據

您可以導入 .trace 文件(使用 Debug API 或 CPU Profiler 創建的)。

要導入跟蹤文件,請點擊分析器中的 Start new profiler session 圖標(加號)(Sessions 窗格中),然後選擇 Load from file。

您可以檢查 CPU Profiler 中導入的跟蹤數據,就像檢查直接在 CPU Profiler 中捕獲的跟蹤數據一樣,但有下面幾點不同:

  1. CPU 活動未顯示在 CPU 時間軸上。
  2. 線程活動時間軸僅指明瞭可在哪裏獲取各線程的跟蹤數據,而未指明實際線程狀態(如運行中、等待中或休眠中)。

如何準確的定位到方法

在線程列表中,選擇相應線程,例如main線程,選中後雙擊展開,這時我們就可以看到詳細的方法調用情況以及耗時詳情了。

如圖:

在這裏插入圖片描述

提示:可以使用鍵盤按鍵」W「放大,使用」S"縮小視圖。

其他技巧

如果我們在特定的方法中開啓、結束檢測,或者我們想分析APP的啓動性能,使用上面的方法顯然不夠準確,我們如何來做呢?

使用 Debug API 記錄

我們可以使用 Debug API 讓您的應用能夠在 CPU Profiler 中開始和停止記錄 CPU 活動。

  1. 在想要開啓監控的地方調用startMethodTracing(String tracePath) 時,CPU Profiler 將開始記錄;
  2. 在想要結束監控的地方調用stopMethodTracing() 時,CPU Profiler 將停止記錄。

在記錄使用此 API 觸發的 CPU 活動時,CPU Profiler 會將 Debug API 顯示爲活動的 CPU 記錄配置。

注意:要使用 Debug API 控制 CPU 活動的記錄,請將檢測的應用部署到搭載 Android 8.0(API 級別 26)或更高版本的設備上。

在應用啓動過程中記錄 CPU 活動

要在應用啓動過程中自動開始記錄 CPU 活動,請執行以下操作:

  1. 依次選擇 Run > Edit Configurations。
  2. 在 Profiling 標籤中,勾選 Start recording a method trace on startup 旁邊的複選框。
  3. 從菜單中選擇 CPU 記錄配置。
  4. 點擊 Apply。
  5. 依次選擇 Run > Profile,將您的應用部署到搭載 Android 8.0(API 級別 26)或更高版本的設備上。

如圖:

在這裏插入圖片描述

總結


本文介紹了Android Studio CPU profiler性能分析工具的使用,以及如何使用Android Studio CPU profiler解決我們的APP耗時,卡頓等問題。

ps:如果你喜歡本文,請隨手點個贊吧😁~