Android Studio CPU 性能剖析器可實時檢查應用的 CPU 使用率和線程活動。你還可以檢查方法跟蹤記錄、函數跟蹤記錄和系統跟蹤記錄中的詳細信息。
系統跟蹤數據:捕獲精細的詳細信息,以便檢查應用與系統資源的交互情況。
方法和函數跟蹤數據:對於應用進程中的每個線程,你可以瞭解一段時間內執行了哪些方法 (Java) 或函數 (C/C++),以及每個方法或函數在其執行期間消耗的 CPU 資源。你還可以使用方法和函數跟蹤數據來識別調用方和被調用方。調用方是指調用其他方法或函數的方法或函數,而被調用方是指被其他方法或函數調用的方法或函數。你可以使用此信息來確定哪些方法或函數負責調用常常會消耗大量資源的特定任務,並優化應用的代碼以避免不必要的工作。
記錄方法跟蹤數據時,您可以選擇「sampled」或「instrumented」記錄。記錄函數跟蹤數據時,只能使用「sampled」記錄。
要打開 CPU Profiler,請按以下步驟操作:
當你打開 CPU Profiler 時,它會立即開始顯示應用的 CPU 使用率和線程活動。你會看到類似於下圖的一些內容:
CPU Profiler 的默認視圖包括以下時間軸:
事件時間軸:顯示應用中的 Activity 在其生命週期內不斷轉換而經歷各種不同狀態的過程,並指示用戶與設備的交互,包括屏幕旋轉事件。如需瞭解如何在搭載 Android 7.1(API 級別 25)及更低版本的設備上啓用事件時間軸,請參閱啓用高級分析。
CPU 時間軸:顯示應用的實時 CPU 使用率(以佔總可用 CPU 時間的百分比表示)以及應用當前使用的線程總數。此時間軸還顯示其他進程(如系統進程或其他應用)的 CPU 使用率,以便您可以將其與您應用的使用率進行對比。您可以通過沿時間軸的水平軸移動鼠標來檢查歷史 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 所示。如果要檢查其他線程的跟蹤數據,請從線程活動時間軸上選擇相應線程。
在開始記錄跟蹤信息之前,請爲要捕獲的分析信息選擇適當的記錄配置:
基於採樣的跟蹤存在一個固有的問題,那就是如果應用在捕獲調用堆棧後進入一個方法且在下次捕獲前退出該方法,則分析器不會記錄該方法調用。如果您想要跟蹤生命週期如此短的方法,應使用檢測跟蹤。
請注意,與檢測每個方法關聯的開銷會影響運行時性能,並且可能會影響分析數據;對於生命週期相對較短的方法,這一點更爲明顯。此外,如果應用在短時間內執行大量方法,則分析器可能很快就會超出其文件大小限制,因而不能再記錄更多跟蹤數據。
在內部,此配置使用 simpleperf 跟蹤應用的原生代碼。如果要爲 simpleperf 指定其他選項,如對特定設備 CPU 採樣指定高精度採樣持續時間,您可以從命令行使用 simpleperf。
使用此跟蹤配置時,您可以通過檢測代碼來直觀地標記分析器時間軸上的重要代碼例程。要檢測 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 標籤提供方法跟蹤數據或函數跟蹤數據的圖形表示形式,其中調用的時間段和時間在水平軸上表示,而其被調用方顯示在垂直軸上。對系統 API 的調用顯示爲橙色,對應用自有方法的調用顯示爲綠色,對第三方 API(包括 Java 語言 API)的調用顯示爲藍色。圖 4 顯示了一個調用圖表示例,說明了給定方法或函數的 Self 時間、Children 時間和 Total 時間的概念。如需詳細瞭解這些概念,請參閱有關如何使用 Top Down 和 Bottom Up 檢查跟蹤數據的部分。
圖 4. 一個調用圖表示例,說明了方法 D 的 Self 時間、Children 時間和 Total 時間。
提示:要跳轉到某個方法或函數的源代碼,請右鍵點擊該方法或函數,然後選擇 Jump to Source。從任何跟蹤數據窗格標籤中均可執行此操作。
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 標籤顯示一個調用列表,在該列表中展開方法或函數節點會顯示它的被調用方。圖 8 顯示了圖 4 中調用圖表的自上而下圖。圖中的每個箭頭都從調用方指向被調用方。
如圖 8 所示,在 Top Down 標籤中展開方法 A 的節點會顯示它的被調用方,即方法 B 和 D。在此之後,展開方法 D 的節點會顯示它的被調用方,即方法 B 和 C,依此類推。與 Flame chart 標籤類似,「Top Down」樹也彙總具有相同調用堆棧的完全相同的方法的跟蹤信息。也就是說,Flame chart 標籤提供 Top down 標籤的圖形表示形式。
Top Down 標籤提供以下信息來幫助說明在每個調用上所花的 CPU 時間(時間也可表示爲在選定範圍內佔線程總時間的百分比):
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 標籤查看每個線程上發生的事件的詳細信息。
要查看某個線程的詳細信息,請在 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 時間軸導出跟蹤文件,請執行以下操作:
要從 Sessions 窗格導出跟蹤文件,請執行以下操作:
您可以導入 .trace 文件(使用 Debug API 或 CPU Profiler 創建的)。
要導入跟蹤文件,請點擊分析器中的 Start new profiler session 圖標(加號)(Sessions 窗格中),然後選擇 Load from file。
您可以檢查 CPU Profiler 中導入的跟蹤數據,就像檢查直接在 CPU Profiler 中捕獲的跟蹤數據一樣,但有下面幾點不同:
在線程列表中,選擇相應線程,例如main線程,選中後雙擊展開,這時我們就可以看到詳細的方法調用情況以及耗時詳情了。
如圖:
提示:可以使用鍵盤按鍵」W「放大,使用」S"縮小視圖。
如果我們在特定的方法中開啓、結束檢測,或者我們想分析APP的啓動性能,使用上面的方法顯然不夠準確,我們如何來做呢?
我們可以使用 Debug API 讓您的應用能夠在 CPU Profiler 中開始和停止記錄 CPU 活動。
在記錄使用此 API 觸發的 CPU 活動時,CPU Profiler 會將 Debug API 顯示爲活動的 CPU 記錄配置。
注意:要使用 Debug API 控制 CPU 活動的記錄,請將檢測的應用部署到搭載 Android 8.0(API 級別 26)或更高版本的設備上。
要在應用啓動過程中自動開始記錄 CPU 活動,請執行以下操作:
如圖:
本文介紹了Android Studio CPU profiler性能分析工具的使用,以及如何使用Android Studio CPU profiler解決我們的APP耗時,卡頓等問題。