Android Studio 3.0 採用全新的 Android Profiler
窗口取代 Android Monitor
工具。 這些全新的分析工具可以提供關於應用 CPU
、內存
和網絡活動
的實時數據。html
您能夠執行基於樣本的函數跟蹤來記錄代碼執行時間、採集堆轉儲數據、查看內存分配,以及查看網絡傳輸文件的詳情。java
要打開 Android Profiler 窗口,請按如下步驟操做:android
Android Profiler 共享時間線的視圖顯示以下圖所示: git
Android Profiler 目前可顯示共享時間線視圖,能夠在按鈕①的位置選擇設備,經過按鈕②的位置選擇想要的app進程,工具最底部顯示了一個時間軸,其中包含了CPU、內存和網絡使用的實時圖。該窗口還包括時間軸縮放控制按鈕③,一個跳轉到實時更新的按鈕④,以及顯示活動狀態、用戶輸入事件和屏幕旋轉事件⑤的事件時間軸。當您啓動 Android Profiler 後,它會持續收集分析數據,直至您斷開設備鏈接或點擊 Close 。github
此共享時間線視圖只顯示時間線圖表。 要使用詳細分析工具,請點擊與您想查看的性能數據對應的圖表。 例如,要使用工具查看堆數據和跟蹤內存分配,可點擊 MEMORY 圖表。shell
但並非全部分析數據均默承認見。 若是您看到一條消息,顯示「Advanced profiling is unavailable for the selected process」,則需在運行配置中啓用高級分析。編程
要顯示高級分析數據,Android Studio 必須在您編譯後的應用中插入監控邏輯。高級分析工具提供的功能包括:緩存
要啓用高級分析,請按如下步驟操做:網絡
如今從新構建並運行您的應用,便可獲取完整的分析功能。但請注意,高級分析會減緩您的構建速度,因此僅當您想要開始分析應用時才啓用此功能。oracle
注:對於原生代碼,不可以使用高級分析功能。 若是您的應用是純原生應用(不含 Java
Activity
類),則不可以使用高級分析功能。 若是您的應用使用了 JNI,則可以使用部分高級分析功能,例如 Event 時間線、GC Event、Java 分配對象和基於 Java 的網絡活動,但不能檢測基於原生的分配和網絡活動。
使用 CPU Profiler 檢查 CPU 活動 和函數跟蹤 CPU Profiler 可幫助您實時檢查應用的 CPU 使用率和線程活動,並記錄函數跟蹤,以便您能夠優化和調試您的應用代碼。點擊 Android Profiler 窗口中的 CPU 時間線中的任意位置便可打開 CPU Profiler。
最大限度減小應用的 CPU 使用率具備許多優點,如提供更快更順暢的用戶體驗,以及延長設備電池續航時間。 它還可幫助應用在各類新舊設備上保持良好性能。 與應用交互時,您可使用 CPU Profiler 監控 CPU 使用率和線程活動。 不過,如需瞭解應用如何執行其代碼的詳細信息,您應記錄和檢查函數跟蹤。
對於應用進程中的每一個線程,您能夠查看一段時間內執行了哪些函數,以及在其執行期間每一個函數消耗的 CPU 資源。 您還可使用函數跟蹤來識別調用方和被調用方。 調用方指調用其餘函數的函數,而被調用方是指被其餘函數調用的函數。 您可使用此信息肯定哪些函數負責調用經常會消耗大量特定資源的任務,並嘗試優化應用代碼以免沒必要要的工做。
若是您想收集可幫助您檢查原生系統進程的詳細系統級數據,並解決掉幀引發的界面卡頓,您應使用 systrace。
或者,若是您想導出您使用 Debug 類捕獲的 .trace
文件,您應使用 Traceview。
當您打開 CPU Profiler 時,它將當即開始顯示應用的 CPU 使用率和線程活動。CPU Profiler 的默認視圖以下圖所示:
如圖所示,CPU Profiler 的默認視圖包括如下內容:
- 綠色: 表示線程處於活動狀態或準備使用 CPU。 即,它正在「運行中」或處於「可運行」狀態。
- 黃色: 表示線程處於活動狀態,但它正在等待一個 I/O 操做(如磁盤或網絡 I/O),而後才能完成它的工做。
- 灰色: 表示線程正在休眠且沒有消耗任何 CPU 時間。當線程須要訪問尚不可用的資源時偶爾會發生這種狀況。線程進入自主休眠或內核將此線程置於休眠狀態,直到所需的資源可用。
- Sampled: 一個默認配置,在應用執行期間頻繁捕獲應用的調用堆棧。 分析器比較捕獲的數據集以推導與應用代碼執行有關的時間和資源使用信息。 基於「Sampled」的跟蹤的固有問題是,若是應用在捕獲調用堆棧後進入一個函數並在下一次捕獲前退出該函數,則分析器不會記錄該函數調用。 若是您對此類生命週期很短的跟蹤函數感興趣,您應使用「Instrumented」跟蹤。
- Instrumented: 一個默認配置,在運行時設置應用以在每一個函數調用的開始和結束時記錄時間戳。 它收集時間戳並進行比較,以生成函數跟蹤數據,包括時間信息和 CPU 使用率。 請注意,與設置每一個函數關聯的開銷會影響運行時性能,並可能會影響分析數據,對於生命週期相對較短的函數,這一點更爲明顯。 此外,若是應用短期內執行大量函數,則分析器可能會迅速超出它的文件大小限制,且不能再記錄更多跟蹤數據。
- Edit configurations: 容許您更改上述「Sampled」和「Instrumented」記錄配置的某些默認值,並將它們另存爲自定義配置。 如需瞭解更多信息,請轉到建立記錄配置部分。
注: 分析器還會報告 Android Studio 和 Android 平臺添加到您的應用進程(如 JDWP、Profile Saver、Studio:VMStats、Studio:Perfa 以及 Studio:Heartbeat,儘管它們在線程活動時間線中顯示的確切名稱可能有所不一樣)的線程 CPU 使用率。 這表示 CPU 時間線中應用的 CPU 使用率還可反映這些線程使用的 CPU 時間。 您能夠在線程活動時間線中查看其中的一些線程並監控其活動。 (不過,因爲分析器線程執行原生代碼,所以,您沒法爲它們記錄函數跟蹤數據。)Android Studio 將報告此數據,以便當線程活動及 CPU 使用率其實是由應用代碼引起時,您能夠輕鬆識別。
要開始記錄函數跟蹤,從下拉菜單中選擇 Sampled 或 Instrumented 記錄配置,或選擇您建立的自定義記錄配置,而後點擊 Record 。 與應用交互並在完成後點擊 Stop recording 。 分析器將自動選擇記錄的時間範圍,並在函數跟蹤窗格中顯示其跟蹤信息。若是您想檢查另外一個線程的函數跟蹤,只需從線程活動時間線中選中它。 記錄函數跟蹤後的 CPU Profiler 視圖,以下圖所示:
如圖所示,記錄函數跟蹤後的 CPU Profiler 視圖包括如下內容:
- Wall clock time: 壁鐘時間信息表示實際通過的時間。
- Thread time: 線程時間信息表示實際通過的時間減去線程沒有消耗 CPU 資源的任意時間部分。對於任何給定函數,其線程時間始終少於或等於其壁鐘時間。 使用線程時間可讓您更好地瞭解線程的實際 CPU 使用率中有多少是給定函數消耗的。
Memory Profiler 是 Android Profiler 中的一個組件,可幫助您識別致使應用卡頓、凍結甚至崩潰的內存泄漏和流失。 它顯示一個應用內存使用量的實時圖表,讓您能夠捕獲堆轉儲、強制執行垃圾回收以及跟蹤內存分配。點擊 Android Profiler 窗口中的 MEMORY 時間線中的任意位置便可打開 Memory Profiler。或者,您能夠在命令行中使用 dumpsys 檢查您的應用內存,同時查看 logcat 中的 GC Event。
Android 提供一個託管內存環境—當它肯定您的應用再也不使用某些對象時,垃圾回收器會將未使用的內存釋放回堆中。 雖然 Android 查找未使用內存的方式在不斷改進,但對於全部 Android 版本,系統都必須在某個時間點短暫地暫停您的代碼。 大多數狀況下,這些暫停難以察覺。 不過,若是您的應用分配內存的速度比系統回收內存的速度快,則當收集器釋放足夠的內存以知足您的分配須要時,您的應用可能會延遲。 此延遲可能會致使您的應用跳幀,並使系統明顯變慢。
儘管您的應用不會表現出變慢,但若是存在內存泄漏,則即便應用在後臺運行也會保留該內存。 此行爲會強制執行沒必要要的垃圾回收 Event,於是拖慢系統的內存性能。 最後,系統被迫終止您的應用進程以回收內存。 而後,當用戶返回您的應用時,它必須徹底重啓。
爲幫助防止這些問題,您應使用 Memory Profiler 執行如下操做:
如需瞭解可減小應用內存使用的編程作法,請閱讀管理您的應用內存。
當您首次打開 Memory Profiler 時,您將看到一條表示應用內存使用量的詳細時間線,並可訪問用於強制執行垃圾回收、捕捉堆轉儲和記錄內存分配的各類工具。Memory Profiler 的默認視圖以下圖所示:
如圖所示,Memory Profiler 的默認視圖包括如下各項:
- 一個顯示每一個內存類別使用多少內存的堆疊圖表,如左側的 y 軸以及頂部的彩色鍵所示。
- 虛線表示分配的對象數,如右側的 y 軸所示。
- 用於表示每一個垃圾回收 Event 的圖標。
不過,若是您使用的是運行 Android 7.1 或更低版本的設備,則默認狀況下,並非全部分析數據都可見。 若是您看到一條消息,其顯示「Advanced profiling is unavailable for the selected process」,則須要啓用高級分析以查看下列內容:
在 Android 8.0 及更高版本上,始終爲可調試應用啓用高級分析。
您在 Memory Profiler 頂部看到的數字取決於您的應用根據 Android 系統機制所提交的全部私有內存頁面數。 此計數不包含與系統或其餘應用共享的頁面。 Memory Profiler 頂部的內存計數圖例,以下圖所示:
內存計數中的類別以下所示:
即便您的應用中不使用 C++,您也可能會看到此處使用的一些原生內存,由於 Android 框架使用原生內存表明您處理各類任務,如處理圖像資源和其餘圖形時,即便您編寫的代碼採用 Java 或 Kotlin 語言。
當鏈接至運行 Android 7.1 及更低版本的設備時,此分配僅在 Memory Profiler 鏈接至您運行的應用時纔開始計數。 所以,您開始分析以前分配的任何對象都不會被計入。 不過,Android 8.0 附帶一個設備內置分析工具,該工具可記錄全部分配,所以,在 Android 8.0 及更高版本上,此數字始終表示您的應用中待處理的 Java 對象總數。
與之前的 Android Monitor 工具中的內存計數相比,新的 Memory Profiler 以不一樣的方式記錄您的內存,所以,您的內存使用量如今看上去可能會更高些。 Memory Profiler 監控的類別更多,這會增長總的內存使用量,但若是您僅關心 Java 堆內存,則「Java」項的數字應與之前工具中的數值類似。
然而,Java 數字可能與您在 Android Monitor 中看到的數字並不是徹底相同,這是由於應用的 Java 堆是從 Zygote 啓動的,而新數字則計入了爲它分配的全部物理內存頁面。 所以,它能夠準確反映您的應用實際使用了多少物理內存。
注:目前,Memory Profiler 還會顯示應用中的一些誤報的原生內存使用量,而這些內存其實是分析工具使用的。 對於大約 100000 個對象,最多會使報告的內存使用量增長 10MB。 在這些工具的將來版本中,這些數字將從您的數據中過濾掉。
內存分配顯示內存中每一個對象是如何分配的。 具體而言,Memory Profiler 可爲您顯示有關對象分配的如下信息:
若是您的設備運行 Android 8.0 或更高版本,您能夠隨時按照下述方法查看您的對象分配: 只需點擊並按住時間線,並拖動選擇您想要查看分配的區域。 不須要開始記錄會話,由於 Android 8.0 及更高版本附帶設備內置分析工具,可持續跟蹤您的應用分配。以下如所示:
若是您的設備運行 Android 7.1 或更低版本,則在 Memory Profiler 工具欄中點擊 Record memory allocations 。 記錄時,Android Monitor 將跟蹤您的應用中進行的全部分配。 操做完成後,點擊 Stop recording (同一個按鈕)以查看分配。以下如所示:
在選擇一個時間線區域後(或當您使用運行 Android 7.1 或更低版本的設備完成記錄會話時),已分配對象的列表將顯示在時間線下方,按類名稱進行分組,並按其堆計數排序。
注:在 Android 7.1 及更低版本上,您最多能夠記錄 65535 個分配。 若是您的記錄會話超出此限值,則記錄中僅保存最新的 65535 個分配。 (在 Android 8.0 及更高版本中,則沒有實際的限制。)
要檢查分配記錄,請按如下步驟操做:
默認狀況下,左側的分配列表按類名稱排列。在列表頂部,您可使用右側的下拉列表在如下排列方式之間進行切換:
堆轉儲顯示在您捕獲堆轉儲時您的應用中哪些對象正在使用內存。 特別是在長時間的用戶會話後,堆轉儲會顯示您認爲不該再位於內存中卻仍在內存中的對象,從而幫助識別內存泄漏。 在捕獲堆轉儲後,您能夠查看如下信息:
要捕獲堆轉儲,在 Memory Profiler 工具欄中點擊 Dump Java heap 。 在轉儲堆期間,Java 內存量可能會暫時增長。 這很正常,由於堆轉儲與您的應用發生在同一進程中,並須要一些內存來收集數據。
堆轉儲顯示在內存時間線下,顯示堆中的全部類類型,以下圖所示:
注:若是您須要更精確地瞭解轉儲的建立時間,能夠經過調用 dumpHprofData() 在應用代碼的關鍵點建立堆轉儲。
要檢查您的堆,請按如下步驟操做:
默認狀況下,堆轉儲不會向您顯示每一個已分配對象的堆疊追蹤。 要獲取堆疊追蹤,在點擊 Dump Java heap 以前,您必須先開始記錄內存分配。而後,您能夠在 Instance View 中選擇一個實例,並查看 Call Stack 標籤以及 References 標籤,以下圖所示。不過,在您開始記錄分配以前,可能已分配一些對象,所以,調用堆棧不能用於這些對象。包含調用堆棧的實例在圖標 上用一個「堆棧」標誌表示。(遺憾的是,因爲堆疊追蹤須要您執行分配記錄,所以,您目前沒法在 Android 8.0 上查看堆轉儲的堆疊追蹤。)
默認狀況下,堆轉儲不會向您顯示每一個已分配對象的堆疊追蹤。 要獲取堆疊追蹤,在點擊 Dump Java heap 以前,您必須先開始記錄內存分配。而後,您能夠在 Instance View 中選擇一個實例,並查看 Call Stack 標籤以及 References 標籤,以下圖所示。不過,在您開始記錄分配以前,可能已分配一些對象,所以,調用堆棧不能用於這些對象。包含調用堆棧的實例在圖標 上用一個「堆棧」標誌表示。(遺憾的是,因爲堆疊追蹤須要您執行分配記錄,所以,您目前沒法在 Android 8.0 上查看堆轉儲的堆疊追蹤。)
在您的堆轉儲中,請注意由下列任意狀況引發的內存泄漏:
捕獲堆轉儲須要的持續時間標示在時間線中,以下圖所示:
在類列表中,您能夠查看如下信息:
在類列表頂部,您可使用左側下拉列表在如下堆轉儲之間進行切換:
默認狀況下,此堆中的對象列表按類名稱排列。 您可使用其餘下拉列表在如下排列方式之間進行切換:
默認狀況下,此列表按 Retained Size 列排序。 您能夠點擊任意列標題以更改列表的排序方式。
在 Instance View 中,每一個實例都包含如下信息:
在捕獲堆轉儲後,僅當分析器運行時才能在 Memory Profiler 中查看數據。 當您退出分析會話時,您將丟失堆轉儲。 所以,若是您要保存堆轉儲以供往後查看,可經過點擊時間線下方工具欄中的 Export heap dump as HPROF file ,將堆轉儲導出到一個 HPROF 文件中。 在顯示的對話框中,確保使用 .hprof
後綴保存文件。
而後,經過將此文件拖到一個空的編輯器窗口(或將其拖到文件標籤欄中),您能夠在 Android Studio 中從新打開該文件。
要使用其餘 HPROF 分析器(如 jhat),您須要將 HPROF 文件從 Android 格式轉換爲 Java SE HPROF 格式。 您可使用 android_sdk/platform-tools/
目錄中提供的 hprof-conv
工具執行此操做。 運行包括如下兩個參數的 hprof-conv
命令:原始 HPROF 文件和轉換後 HPROF 文件的寫入位置。 例如:
hprof-conv heap-original.hprof heap-converted.hprof
複製代碼
使用 Memory Profiler 時,您應對應用代碼施加壓力並嘗試強制內存泄漏。 在應用中引起內存泄漏的一種方式是,先讓其運行一段時間,而後再檢查堆。 泄漏在堆中可能逐漸匯聚到分配頂部。 不過,泄漏越小,您越須要運行更長時間的應用才能看到泄漏。
您還能夠經過如下方式之一觸發內存泄漏:
提示: 您還可使用 monkeyrunner 測試框架執行上述步驟。
Network Profiler 可以在時間線上顯示實時網絡活動,包括髮送和接收的數據以及當前的鏈接數。 這便於您查看應用傳輸數據的方式和時間,並據此對底層代碼進行適當優化。點擊 Android Profiler 窗口中的 NETWORK 時間線中的任意位置便可打開 Network Profiler。
當您的應用向網絡發出請求時,設備必須使用高功耗的移動或 WLAN 無線裝置來收發數據包。無線裝置不只要消耗電力來傳輸數據,還須要消耗額外的電力來開啓而且不鎖定屏幕。
使用 Network Profiler,您能夠查找頻繁出現的短時網絡活動峯值,這意味着您的應用須要常常打開無線裝置,或須要長時間不鎖定屏幕以處理集中出現的大量短時請求。這種模式說明您能夠經過批量處理網絡請求,減小必須開啓無線裝置來發送或接收數據的次數,從而優化應用,改善電池續航表現。這種方式還能讓無線裝置調整到低能耗模式,延長批量處理請求之間的間隔時間,節省能耗。
要詳細瞭解優化應用網絡活動 的相關技巧,請參閱減小網絡耗電量。
Network Profiler 的默認視圖以下圖所示:
窗口的頂部的①處,能夠看見wifi無線信號的強弱,在時間線上能夠在②處點擊和拖動一部分的時間線來檢測流量,而後在窗口③中會顯示所選時間段內收發的文件,包括文件名,大小,類型,狀態和花費時間,你能夠對窗口③的列表根據列來進行排序。還能夠查看所選時間段的詳細拆分,拆分的timeline能夠顯示文件是何時收發的,點擊窗口3的其中一個文件,能夠在窗口④中查看文件的詳細信息。經過切換窗口④上方標籤能夠查看響應數據、標題信息和調用堆棧。注: 必須啓用高級分析才能從時間線中選擇要檢查的片斷,查看發送和接收的文件列表,或查看有關所發送或接收的選定文件的詳細信息。 要啓用高級分析,請參閱啓用高級分析。
若是 Network Profiler 檢測到流量值,但沒法識別任何受支持的網絡請求,您會收到如下錯誤消息:
"Network Profiling Data Unavailable: There is no information for the network traffic you've selected."
Network Profiler 目前只支持 HttpURLConnection 和 OkHttp 網絡鏈接庫。若是您的應用使用的是其餘網絡鏈接庫,則可能沒法在 Network Profiler 中查看網絡活動。 若是您收到這條錯誤消息,但您的應用確實使用了 HttpURLConnection 或 OkHttp,請報告錯誤或搜索 Issue Tracker,在與您的問題有關的現有報告中加入您的反饋。 此外,您還能夠利用如下資源請求提供關於其餘庫的支持。