天天看點

Android Studio CPU profiler性能分析工具介紹和使用詳解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 使用率和線程活動。你會看到類似于下圖的一些内容:

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

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。

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

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

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

與您的應用互動,然後在完成時點選 Stop。分析器将自動選擇記錄的時間範圍,并在跟蹤資料窗格中顯示其跟蹤資訊,如圖 3 所示。如果要檢查其他線程的跟蹤資料,請從線程活動時間軸上選擇相應線程。

Android Studio CPU profiler性能分析工具介紹和使用詳解Android Studio CPU profiler性能分析工具介紹和使用詳解總結
  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 檢查跟蹤資料的部分。

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

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

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

使用“Flame Chart”标簽檢查跟蹤資料

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

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

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

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

由于 B1、B2 和 B3 具有相同的調用方順序 (A → D → B),是以将它們彙總在一起,如圖 6 所示。同樣,也将 C1 和 C3 彙總在一起,因為它們也具有相同的調用方順序 (A → D → B → C)。請注意,C2 不包括在内,因為它具有不同的調用方順序 (A → D → C)。

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

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

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

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

圖 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 所示。
    Android Studio CPU profiler性能分析工具介紹和使用詳解Android Studio CPU profiler性能分析工具介紹和使用詳解總結

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 CPU profiler性能分析工具介紹和使用詳解Android Studio CPU profiler性能分析工具介紹和使用詳解總結

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

使用“Trace Events”标簽檢查系統跟蹤資料

檢查系統跟蹤資料時,您可以使用 Trace Events 标簽檢視每個線程上發生的事件的詳細資訊。

要檢視某個線程的詳細資訊,請在 Threads 窗格中選擇該線程。這樣将在 Kernel 窗格中突出顯示該線程在每個 CPU 核心上的活動,并在 Trace Events 标簽中顯示該線程的事件。在 Trace Events 标簽中将滑鼠指針懸停在某個事件上可檢視該事件的名稱以及在每種狀态下所花的時間。

例如,在圖 10 中,在 Threads 窗格中選擇了 RenderThread,在 Kernel 窗格中突出顯示了該線程在 CPU 0 和 CPU 1 上的活動,并在 Trace Events 标簽中顯示了在特定事件上所花的時間。

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

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

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

檢查幀渲染資料

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

要檢視幀渲染資料,請使用可讓您跟蹤系統調用的配置記錄跟蹤記錄。記錄跟蹤資料後,在名為 FRAMES 的部分下查找有關每個幀的資訊,如圖 11 所示。

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

圖 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線程,選中後輕按兩下展開,這時我們就可以看到詳細的方法調用情況以及耗時詳情了。

如圖:

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

提示:可以使用鍵盤按鍵”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性能分析工具介紹和使用詳解總結

總結

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

PS:性能優化專欄:《Android性能》持續更新中……