Android Studio 3.0 利用 Android Profiler 測量應用性能

Android Studio 3.0 採用全新的 Android Profiler 窗口取代 Android Monitor 工具。 這些全新的分析工具可以提供關於應用 CPU內存網絡活動的實時數據。html

您能夠執行基於樣本的函數跟蹤來記錄代碼執行時間、採集堆轉儲數據、查看內存分配,以及查看網絡傳輸文件的詳情。java

Android Profiler 的使用方法

Android Profiler 的打開步驟

要打開 Android Profiler 窗口,請按如下步驟操做:android

  1. 點擊 View > Tool Windows > Android Profiler(也能夠點擊工具欄中的 Android Profiler )。
  2. 從 Android Profiler 工具欄中選擇您想要分析的設備和應用進程。 若是您經過 USB 鏈接了某個設備但該設備未在設備列表中列出,請確保您已啓用 USB 調試(若是您使用的是 Android Emulator 或已取得 root 權限的設備,Android Profiler 將列出全部正在運行的進程,即便這些進程可能沒法調試。 當您發佈可調試應用時,將會默認選擇此進程)。
  3. Android Profiler 窗口頂部(以下圖所示),選擇您想要分析的設備和應用進程。

Android Profiler 共享時間線的視圖顯示以下圖所示: git

Android Profiler 目前可顯示共享時間線視圖,能夠在按鈕①的位置選擇設備,經過按鈕②的位置選擇想要的app進程,工具最底部顯示了一個時間軸,其中包含了CPU、內存和網絡使用的實時圖。該窗口還包括時間軸縮放控制按鈕③,一個跳轉到實時更新的按鈕④,以及顯示活動狀態、用戶輸入事件和屏幕旋轉事件⑤的事件時間軸。

當您啓動 Android Profiler 後,它會持續收集分析數據,直至您斷開設備鏈接或點擊 Close github

此共享時間線視圖只顯示時間線圖表。 要使用詳細分析工具,請點擊與您想查看的性能數據對應的圖表。 例如,要使用工具查看堆數據和跟蹤內存分配,可點擊 MEMORY 圖表。shell

但並非全部分析數據均默承認見。 若是您看到一條消息,顯示「Advanced profiling is unavailable for the selected process」,則需在運行配置中啓用高級分析編程

啓用高級分析

要顯示高級分析數據,Android Studio 必須在您編譯後的應用中插入監控邏輯。高級分析工具提供的功能包括:緩存

  • Event 時間線(全部分析器窗口中均有)
  • 分配對象數量(Memory Profiler 中)
  • 垃圾回收 Event(Memory Profiler 中)
  • 有關全部傳輸的文件的詳情(Network Profiler 中)

要啓用高級分析,請按如下步驟操做:網絡

  1. 選擇 Run > Edit Configurations
  2. 在左側窗格中選擇您的應用模塊。
  3. 點擊 Profiling 標籤,而後勾選 Enable advanced profiling

如今從新構建並運行您的應用,便可獲取完整的分析功能。但請注意,高級分析會減緩您的構建速度,因此僅當您想要開始分析應用時才啓用此功能。oracle

注:對於原生代碼,不可以使用高級分析功能。 若是您的應用是純原生應用(不含 Java Activity 類),則不可以使用高級分析功能。 若是您的應用使用了 JNI,則可以使用部分高級分析功能,例如 Event 時間線、GC Event、Java 分配對象和基於 Java 的網絡活動,但不能檢測基於原生的分配和網絡活動。

使用 CPU Profiler 檢查 CPU 活動 和函數跟蹤

使用 CPU Profiler 檢查 CPU 活動 和函數跟蹤 CPU Profiler 可幫助您實時檢查應用的 CPU 使用率和線程活動,並記錄函數跟蹤,以便您能夠優化和調試您的應用代碼。點擊 Android Profiler 窗口中的 CPU 時間線中的任意位置便可打開 CPU Profiler

爲何要分析 CPU 使用率

最大限度減小應用的 CPU 使用率具備許多優點,如提供更快更順暢的用戶體驗,以及延長設備電池續航時間。 它還可幫助應用在各類新舊設備上保持良好性能。 與應用交互時,您可使用 CPU Profiler 監控 CPU 使用率和線程活動。 不過,如需瞭解應用如何執行其代碼的詳細信息,您應記錄和檢查函數跟蹤

對於應用進程中的每一個線程,您能夠查看一段時間內執行了哪些函數,以及在其執行期間每一個函數消耗的 CPU 資源。 您還可使用函數跟蹤來識別調用方和被調用方。 調用方指調用其餘函數的函數,而被調用方是指被其餘函數調用的函數。 您可使用此信息肯定哪些函數負責調用經常會消耗大量特定資源的任務,並嘗試優化應用代碼以免沒必要要的工做。

若是您想收集可幫助您檢查原生系統進程的詳細系統級數據,並解決掉幀引發的界面卡頓,您應使用 systrace

或者,若是您想導出您使用 Debug 類捕獲的 .trace 文件,您應使用 Traceview

CPU Profiler 概覽

當您打開 CPU Profiler 時,它將當即開始顯示應用的 CPU 使用率和線程活動。CPU Profiler 的默認視圖以下圖所示:

CPU Profiler

如圖所示,CPU Profiler 的默認視圖包括如下內容:

  1. Event 時間線: 顯示應用中在其生命週期不一樣狀態間轉換的活動,並代表用戶與設備的交互,包括屏幕旋轉 Event。 如需瞭解有關 Event 時間線的更多信息,包括如何啓用它,請閱讀 啓用高級分析
  2. CPU 時間線: 顯示應用的實時 CPU 使用率(以佔總可用 CPU 時間的百分比表示)以及應用使用的總線程數。 此時間線還顯示其餘進程的 CPU 使用率(如系統進程或其餘應用),以便您能夠將其與您的應用使用率進行對比。 經過沿時間線的水平軸移動鼠標,您還能夠檢查歷史 CPU 使用率數據。
  3. 線程活動時間線: 列出屬於應用進程的每一個線程並使用下面列出的顏色沿時間線標示它們的活動。 在您記錄一個函數跟蹤後,您能夠今後時間線中選擇一個線程以在跟蹤窗格中檢查其數據。
  • 綠色: 表示線程處於活動狀態或準備使用 CPU。 即,它正在「運行中」或處於「可運行」狀態。
  • 黃色: 表示線程處於活動狀態,但它正在等待一個 I/O 操做(如磁盤或網絡 I/O),而後才能完成它的工做。
  • 灰色: 表示線程正在休眠且沒有消耗任何 CPU 時間。當線程須要訪問尚不可用的資源時偶爾會發生這種狀況。線程進入自主休眠或內核將此線程置於休眠狀態,直到所需的資源可用。
  1. 記錄配置: 容許您選擇如下選項之一以肯定分析器記錄函數跟蹤的方式。
  • Sampled: 一個默認配置,在應用執行期間頻繁捕獲應用的調用堆棧。 分析器比較捕獲的數據集以推導與應用代碼執行有關的時間和資源使用信息。 基於「Sampled」的跟蹤的固有問題是,若是應用在捕獲調用堆棧後進入一個函數並在下一次捕獲前退出該函數,則分析器不會記錄該函數調用。 若是您對此類生命週期很短的跟蹤函數感興趣,您應使用「Instrumented」跟蹤。
  • Instrumented: 一個默認配置,在運行時設置應用以在每一個函數調用的開始和結束時記錄時間戳。 它收集時間戳並進行比較,以生成函數跟蹤數據,包括時間信息和 CPU 使用率。 請注意,與設置每一個函數關聯的開銷會影響運行時性能,並可能會影響分析數據,對於生命週期相對較短的函數,這一點更爲明顯。 此外,若是應用短期內執行大量函數,則分析器可能會迅速超出它的文件大小限制,且不能再記錄更多跟蹤數據。
  • Edit configurations: 容許您更改上述「Sampled」和「Instrumented」記錄配置的某些默認值,並將它們另存爲自定義配置。 如需瞭解更多信息,請轉到建立記錄配置部分。
  1. 記錄按鈕: 用於開始和中止記錄函數跟蹤。 如需瞭解更多信息,請轉到記錄和檢查函數跟蹤部分。

注: 分析器還會報告 Android Studio 和 Android 平臺添加到您的應用進程(如 JDWP、Profile Saver、Studio:VMStats、Studio:Perfa 以及 Studio:Heartbeat,儘管它們在線程活動時間線中顯示的確切名稱可能有所不一樣)的線程 CPU 使用率。 這表示 CPU 時間線中應用的 CPU 使用率還可反映這些線程使用的 CPU 時間。 您能夠在線程活動時間線中查看其中的一些線程並監控其活動。 (不過,因爲分析器線程執行原生代碼,所以,您沒法爲它們記錄函數跟蹤數據。)Android Studio 將報告此數據,以便當線程活動及 CPU 使用率其實是由應用代碼引起時,您能夠輕鬆識別。

記錄和檢查函數跟蹤

要開始記錄函數跟蹤,從下拉菜單中選擇 SampledInstrumented 記錄配置,或選擇您建立的自定義記錄配置,而後點擊 Record 。 與應用交互並在完成後點擊 Stop recording 。 分析器將自動選擇記錄的時間範圍,並在函數跟蹤窗格中顯示其跟蹤信息。若是您想檢查另外一個線程的函數跟蹤,只需從線程活動時間線中選中它。 記錄函數跟蹤後的 CPU Profiler 視圖,以下圖所示:

CPU Profiler
如圖所示,記錄函數跟蹤後的 CPU Profiler 視圖包括如下內容:

  1. 選擇時間範圍: 用於肯定您要在跟蹤窗格中檢查所記錄時間範圍的哪一部分。 當您首次記錄函數跟蹤時,CPU Profiler 將在 CPU 時間線中自動選擇您的記錄的完整長度。 若是您想僅檢查所記錄時間範圍一小部分的函數跟蹤數據,您能夠點擊並拖動突出顯示的區域邊緣以修改其長度。
  2. 時間戳: 用於表示所記錄函數跟蹤的開始和結束時間(相對於分析器從設備開始收集 CPU 使用率信息的時間)。 在選擇時間範圍時,您能夠點擊時間戳以自動選擇完整記錄,若是您有多個要進行切換的記錄,則此作法尤爲有用。
  3. 跟蹤窗格: 用於顯示您所選的時間範圍和線程的函數跟蹤數據。 僅在您至少記錄一個函數跟蹤後此窗格纔會顯示。 在此窗格中,您能夠選擇想如何查看每一個堆疊追蹤(使用跟蹤標籤),以及如何測量執行時間(使用時間引用下拉菜單)。
  4. 選擇後,可經過 Top Down 樹、Bottom Up 樹、調用圖表火焰圖的形式顯示您的函數跟蹤。 您能夠在下文中瞭解每一個跟蹤窗格標籤的更多信息。
  5. 從下拉菜單中選擇如下選項之一,以肯定如何測量每一個函數調用的時間信息:
  • Wall clock time: 壁鐘時間信息表示實際通過的時間。
  • Thread time: 線程時間信息表示實際通過的時間減去線程沒有消耗 CPU 資源的任意時間部分。對於任何給定函數,其線程時間始終少於或等於其壁鐘時間。 使用線程時間可讓您更好地瞭解線程的實際 CPU 使用率中有多少是給定函數消耗的。

使用 Memory Profiler 查看 Java 堆和內存分配

Memory Profiler 是 Android Profiler 中的一個組件,可幫助您識別致使應用卡頓、凍結甚至崩潰的內存泄漏和流失。 它顯示一個應用內存使用量的實時圖表,讓您能夠捕獲堆轉儲、強制執行垃圾回收以及跟蹤內存分配。點擊 Android Profiler 窗口中的 MEMORY 時間線中的任意位置便可打開 Memory Profiler。或者,您能夠在命令行中使用 dumpsys 檢查您的應用內存,同時查看 logcat 中的 GC Event

爲何應分析您的應用內存

Android 提供一個託管內存環境—當它肯定您的應用再也不使用某些對象時,垃圾回收器會將未使用的內存釋放回堆中。 雖然 Android 查找未使用內存的方式在不斷改進,但對於全部 Android 版本,系統都必須在某個時間點短暫地暫停您的代碼。 大多數狀況下,這些暫停難以察覺。 不過,若是您的應用分配內存的速度比系統回收內存的速度快,則當收集器釋放足夠的內存以知足您的分配須要時,您的應用可能會延遲。 此延遲可能會致使您的應用跳幀,並使系統明顯變慢。

儘管您的應用不會表現出變慢,但若是存在內存泄漏,則即便應用在後臺運行也會保留該內存。 此行爲會強制執行沒必要要的垃圾回收 Event,於是拖慢系統的內存性能。 最後,系統被迫終止您的應用進程以回收內存。 而後,當用戶返回您的應用時,它必須徹底重啓。

爲幫助防止這些問題,您應使用 Memory Profiler 執行如下操做:

  • 在時間線中查找可能會致使性能問題的不理想的內存分配模式。
  • 轉儲 Java 堆以查看在任何給定時間哪些對象耗盡了使用內存。長時間進行多個堆轉儲可幫助識別內存泄漏。
  • 記錄正經常使用戶交互和極端用戶交互期間的內存分配以準確識別您的代碼在何處短期分配了過多對象,或分配了泄漏的對象。

如需瞭解可減小應用內存使用的編程作法,請閱讀管理您的應用內存

Memory Profiler 概覽

當您首次打開 Memory Profiler 時,您將看到一條表示應用內存使用量的詳細時間線,並可訪問用於強制執行垃圾回收、捕捉堆轉儲和記錄內存分配的各類工具。Memory Profiler 的默認視圖以下圖所示:

Memory Profiler

如圖所示,Memory Profiler 的默認視圖包括如下各項:

  1. 用於強制執行垃圾回收 Event 的按鈕。
  2. 用於捕獲堆轉儲的按鈕
  3. 用於記錄內存分配狀況的按鈕。 此按鈕僅在鏈接至運行 Android 7.1 或更低版本的設備時纔會顯示。
  4. 用於放大/縮小時間線的按鈕。
  5. 用於跳轉至實時內存數據的按鈕。
  6. Event 時間線,其顯示活動狀態、用戶輸入 Event 和屏幕旋轉 Event。
  7. 內存使用量時間線,其包含如下內容:
  • 一個顯示每一個內存類別使用多少內存的堆疊圖表,如左側的 y 軸以及頂部的彩色鍵所示。
  • 虛線表示分配的對象數,如右側的 y 軸所示。
  • 用於表示每一個垃圾回收 Event 的圖標。

不過,若是您使用的是運行 Android 7.1 或更低版本的設備,則默認狀況下,並非全部分析數據都可見。 若是您看到一條消息,其顯示「Advanced profiling is unavailable for the selected process」,則須要啓用高級分析以查看下列內容:

  • Event 時間線
  • 分配的對象數
  • 垃圾回收 Event

在 Android 8.0 及更高版本上,始終爲可調試應用啓用高級分析。

如何計算內存

您在 Memory Profiler 頂部看到的數字取決於您的應用根據 Android 系統機制所提交的全部私有內存頁面數。 此計數不包含與系統或其餘應用共享的頁面。 Memory Profiler 頂部的內存計數圖例,以下圖所示:

Memory Profiler Counts

內存計數中的類別以下所示:

  • Java: 從 Java 或 Kotlin 代碼分配的對象內存。
  • Native: 從 C 或 C++ 代碼分配的對象內存。

即便您的應用中不使用 C++,您也可能會看到此處使用的一些原生內存,由於 Android 框架使用原生內存表明您處理各類任務,如處理圖像資源和其餘圖形時,即便您編寫的代碼採用 Java 或 Kotlin 語言。

  • Graphics: 圖形緩衝區隊列向屏幕顯示像素(包括 GL 表面、GL 紋理等等)所使用的內存。(請注意,這是與 CPU 共享的內存,不是 GPU 專用內存。)
  • Stack: 您的應用中的原生堆棧和 Java 堆棧使用的內存。 這一般與您的應用運行多少線程有關。
  • Code: 您的應用用於處理代碼和資源(如 dex 字節碼、已優化或已編譯的 dex 碼、.so 庫和字體)的內存。
  • Other: 您的應用使用的系統不肯定如何分類的內存。
  • Allocated: 您的應用分配的 Java/Kotlin 對象數。 它沒有計入 C 或 C++ 中分配的對象。

當鏈接至運行 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 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 及更高版本中,則沒有實際的限制。)

要檢查分配記錄,請按如下步驟操做:

  1. 瀏覽列表以查找堆計數異常大且可能存在泄漏的對象。 爲幫助查找已知類,點擊 Class Name 列標題以按字母順序排序。 而後點擊一個類名稱。 此時在右側將出現 Instance View 窗格,顯示該類的每一個實例,以下圖中所示。
  2. Instance View 窗格中,點擊一個實例。 此時下方將出現 Call Stack 標籤,顯示該實例被分配到何處以及哪一個線程中。
  3. Call Stack 標籤中,點擊任意行以在編輯器中跳轉到該代碼。 有關每一個已分配對象的詳情在右側的 Instance View 中的顯示,以下圖所示:
    Memory Profiler Allocations Detail

默認狀況下,左側的分配列表按類名稱排列。在列表頂部,您可使用右側的下拉列表在如下排列方式之間進行切換:

  • Arrange by class: 基於類名稱對全部分配進行分組。
  • Arrange by package: 基於軟件包名稱對全部分配進行分組。
  • Arrange by callstack: 將全部分配分組到其對應的調用堆棧。

捕獲堆轉儲

堆轉儲顯示在您捕獲堆轉儲時您的應用中哪些對象正在使用內存。 特別是在長時間的用戶會話後,堆轉儲會顯示您認爲不該再位於內存中卻仍在內存中的對象,從而幫助識別內存泄漏。 在捕獲堆轉儲後,您能夠查看如下信息:

  • 您的應用已分配哪些類型的對象,以及每一個類型分配多少。
  • 每一個對象正在使用多少內存。
  • 在代碼中的何處仍在引用每一個對象。
  • 對象所分配到的調用堆棧(目前,若是您在記錄分配時捕獲堆轉儲,則只有在 Android 7.1 及更低版本中,堆轉儲才能使用調用堆棧)。

要捕獲堆轉儲,在 Memory Profiler 工具欄中點擊 Dump Java heap 。 在轉儲堆期間,Java 內存量可能會暫時增長。 這很正常,由於堆轉儲與您的應用發生在同一進程中,並須要一些內存來收集數據。

堆轉儲顯示在內存時間線下,顯示堆中的全部類類型,以下圖所示:

Memory Profiler Dump

注:若是您須要更精確地瞭解轉儲的建立時間,能夠經過調用 dumpHprofData() 在應用代碼的關鍵點建立堆轉儲。

要檢查您的堆,請按如下步驟操做:

  1. 瀏覽列表以查找堆計數異常大且可能存在泄漏的對象。 爲幫助查找已知類,點擊 Class Name 列標題以按字母順序排序。 而後點擊一個類名稱。此時在右側將出現 Instance View 窗格,顯示該類的每一個實例,以下圖中所示。
  2. Instance View 窗格中,點擊一個實例。此時下方將出現 References,顯示該對象的每一個引用。 或者,點擊實例名稱旁的箭頭以查看其全部字段,而後點擊一個字段名稱查看其全部引用。 若是您要查看某個字段的實例詳情,右鍵點擊該字段並選擇 Go to Instance
  3. References 標籤中,若是您發現某個引用可能在泄漏內存,則右鍵點擊它並選擇 Go to Instance。 這將從堆轉儲中選擇對應的實例,顯示您本身的實例數據。

默認狀況下,堆轉儲不會向您顯示每一個已分配對象的堆疊追蹤。 要獲取堆疊追蹤,在點擊 Dump Java heap 以前,您必須先開始記錄內存分配。而後,您能夠在 Instance View 中選擇一個實例,並查看 Call Stack 標籤以及 References 標籤,以下圖所示。不過,在您開始記錄分配以前,可能已分配一些對象,所以,調用堆棧不能用於這些對象。包含調用堆棧的實例在圖標 上用一個「堆棧」標誌表示。(遺憾的是,因爲堆疊追蹤須要您執行分配記錄,所以,您目前沒法在 Android 8.0 上查看堆轉儲的堆疊追蹤。)

默認狀況下,堆轉儲不會向您顯示每一個已分配對象的堆疊追蹤。 要獲取堆疊追蹤,在點擊 Dump Java heap 以前,您必須先開始記錄內存分配。而後,您能夠在 Instance View 中選擇一個實例,並查看 Call Stack 標籤以及 References 標籤,以下圖所示。不過,在您開始記錄分配以前,可能已分配一些對象,所以,調用堆棧不能用於這些對象。包含調用堆棧的實例在圖標 上用一個「堆棧」標誌表示。(遺憾的是,因爲堆疊追蹤須要您執行分配記錄,所以,您目前沒法在 Android 8.0 上查看堆轉儲的堆疊追蹤。)

在您的堆轉儲中,請注意由下列任意狀況引發的內存泄漏:

  • 長時間引用 Activity、Context、View、Drawable 和其餘對象,可能會保持對 Activity 或 Context 容器的引用。
  • 能夠保持 Activity 實例的非靜態內部類,如 Runnable。
  • 對象保持時間超出所需時間的緩存。

捕獲堆轉儲須要的持續時間標示在時間線中,以下圖所示:

Memory Profiler Dump Stacktrace

在類列表中,您能夠查看如下信息:

  • Heap Count: 堆中的實例數。
  • Shallow Size: 此堆中全部實例的總大小(以字節爲單位)。
  • Retained Size: 爲此類的全部實例而保留的內存總大小(以字節爲單位)。

在類列表頂部,您可使用左側下拉列表在如下堆轉儲之間進行切換:

  • Default heap: 系統未指定堆時。
  • App heap: 您的應用在其中分配內存的主堆。
  • Image heap: 系統啓動映像,包含啓動期間預加載的類。 此處的分配保證毫不會移動或消失。
  • Zygote heap: 寫時複製堆,其中的應用進程是從 Android 系統中派生的。

默認狀況下,此堆中的對象列表按類名稱排列。 您可使用其餘下拉列表在如下排列方式之間進行切換:

  • Arrange by class: 基於類名稱對全部分配進行分組。
  • Arrange by package: 基於軟件包名稱對全部分配進行分組。
  • Arrange by callstack: 將全部分配分組到其對應的調用堆棧。此選項僅在記錄分配期間捕獲堆轉儲時纔有效。即便如此,堆中的對象也極可能是在您開始記錄以前分配的,所以這些分配會首先顯示,且只按類名稱列出。

默認狀況下,此列表按 Retained Size 列排序。 您能夠點擊任意列標題以更改列表的排序方式。

在 Instance View 中,每一個實例都包含如下信息:

  • Depth: 從任意 GC 根到所選實例的最短 hop 數。
  • Shallow Size: 此實例的大小。
  • Retained Size: 此實例支配的內存大小(根據 dominator 樹)。

將堆轉儲另存爲 HPROF

在捕獲堆轉儲後,僅當分析器運行時才能在 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 時,您應對應用代碼施加壓力並嘗試強制內存泄漏。 在應用中引起內存泄漏的一種方式是,先讓其運行一段時間,而後再檢查堆。 泄漏在堆中可能逐漸匯聚到分配頂部。 不過,泄漏越小,您越須要運行更長時間的應用才能看到泄漏。

您還能夠經過如下方式之一觸發內存泄漏:

  • 將設備從縱向旋轉爲橫向,而後在不一樣的 Activity 狀態下反覆操做屢次。 旋轉設備常常會致使應用泄漏 ActivityContextView 對象,由於系統會從新建立 Activity,而若是您的應用在其餘地方保持對這些對象之一的引用,系統將沒法對其進行垃圾回收。
  • 處於不一樣的 Activity 狀態時,在您的應用與另外一個應用之間切換(導航到主屏幕,而後返回到您的應用)。

提示: 您還可使用 monkeyrunner 測試框架執行上述步驟。

利用 Network Profiler 檢查網絡流量

Network Profiler 可以在時間線上顯示實時網絡活動,包括髮送和接收的數據以及當前的鏈接數。 這便於您查看應用傳輸數據的方式和時間,並據此對底層代碼進行適當優化。點擊 Android Profiler 窗口中的 NETWORK 時間線中的任意位置便可打開 Network Profiler

爲何應分析應用的網絡活動

當您的應用向網絡發出請求時,設備必須使用高功耗的移動或 WLAN 無線裝置來收發數據包。無線裝置不只要消耗電力來傳輸數據,還須要消耗額外的電力來開啓而且不鎖定屏幕。

使用 Network Profiler,您能夠查找頻繁出現的短時網絡活動峯值,這意味着您的應用須要常常打開無線裝置,或須要長時間不鎖定屏幕以處理集中出現的大量短時請求。這種模式說明您能夠經過批量處理網絡請求,減小必須開啓無線裝置來發送或接收數據的次數,從而優化應用,改善電池續航表現。這種方式還能讓無線裝置調整到低能耗模式,延長批量處理請求之間的間隔時間,節省能耗。

要詳細瞭解優化應用網絡活動 的相關技巧,請參閱減小網絡耗電量

Network Profiler 概覽

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 目前只支持 HttpURLConnectionOkHttp 網絡鏈接庫。若是您的應用使用的是其餘網絡鏈接庫,則可能沒法在 Network Profiler 中查看網絡活動。 若是您收到這條錯誤消息,但您的應用確實使用了 HttpURLConnection 或 OkHttp,請報告錯誤搜索 Issue Tracker,在與您的問題有關的現有報告中加入您的反饋。 此外,您還能夠利用如下資源請求提供關於其餘庫的支持。

致謝

利用 Android Profiler 測量應用性能

Measure app performance with Android Profiler

相關文章
相關標籤/搜索