使用Android Profile作性能分析及優化

前言

作Android開發五年,開發工具從最初的eclipse+ADT插件到AndroidStduio。Google更是在新版的AndroidStudio中集成了Android應用性能分析利器——Profilerlinux

本文基於AndroidStudio 3.2.1 正式版進行分析並定位問題緣由。附上下載地址:android

  1. Windows版下載
  2. Mac版下載
  3. Linux版下載

概覽

AndroidStudiorun項目,便可在底部選項卡中找到Profiler,打開後會默認顯示當前run的應用的信息。能夠點擊Profiler頁面右上加號選擇鏈接的設備以及其餘能夠調試的應用進程。git

圖中能夠看出,Profiler能夠監控選擇的應用的 CPU、內存、網絡、電量使用狀況並經過波形圖、柱形圖、折線圖實時的展現出來。github

點擊左上角的紅色方形或者在監控的會話中右鍵彈出選項框結束當前應用的監控或刪除監控會話。算法

頂部工具欄依次是:windows

  1. 添加須要監控的進程。
  2. 結束當前監控會話。
  3. 顯示/隱藏側邊欄。
  4. 縮小監控視圖。
  5. 放大監控視圖。
  6. 重置監控視圖。
  7. 顯示採集區間。

CPU分析

在概覽圖中,點擊CPU模塊,進入CPU使用分析頁面。android-studio

圖中三個菜單依次是:緩存

  1. 可切換至內存、網絡、電量監控。
  2. 切換不一樣監控目標。分別是Sampled JavaInstrumented JavaSampled JavaSystem Trace
  3. Record 按鍵,點擊開始採集CPU使用信息。

點擊Record按鈕開始採集CPU使用數據,點擊Stop按鈕中止採集數據。採集完成以後的樣子如圖,網絡

圖中深色部分表示採集區間,能夠放大監控視圖,而後縮小記錄區間,選擇一個線程,能夠詳細看見線程中執行的方法。app

Profiler支持四種方式顯示執行的方法。

  1. Call Chart:經過執行的順序顯示,見上圖。
  2. Flame Chart:經過火焰圖顯示。
  3. Top Down:自頂向下調用顯示。
  4. Bottom Up:自底向上調用顯示。

經過分析CPU使用的視圖,能夠大體定位下面的問題。

  1. 採集五六分鐘的CPU使用信息,縮放視圖至最小,全局觀察CPU在監控過程當中的使用狀況。
  2. Profiler會同步記錄用戶的觸摸事件及頁面跳轉等事件。對比CPU的瞬時使用狀況找出問題代碼。
  3. 選擇記錄一段時間片,重點分析這段時間片中各線程中的方法執行狀況。

上圖展現了ImageLoader加載圖片所使用的CPU資源。可以得出的結論是,ImageLoader相關的代碼被反覆執行,自己就是一件異常的狀況。

宏觀分析觀察CPU使用狀況的波形圖,發現存在週期性的CPU使用峯值。

再附上優化後的CPU使用狀況波形圖,已消除CPU使用峯值。

出現峯值的緣由,單憑監控線程的方法調用不容易定位問題,除非在特別熟悉代碼的狀況下。一般還須要結合內存使用和網絡使用狀況綜合分析,進而定位問題。

內存分析

切換至內存分析頁面。

圖中三個菜單依次是:

  1. 可切換至CPU、網絡、電量監控。
  2. 手動執行GC,釋放內存。
  3. dump內存使用數據,可保存至文本數據。

內存使用,一樣能夠從宏觀和微觀的角度分析。Profiler將不一樣類型的數據佔用的內存用不一樣顏色表示。有:JavaNativeGraphicsStackCodeOthers

如圖,內存持續增加,直至系統釋放內存資源,所以宏觀內存波形圖呈鋸齒狀。並且能夠看出主要是Native空間佔用的內存持續增長。

從微觀上看,放大顯示區間,點擊dump按鍵開始記錄,選擇分析區間,查看內存中,各種型數據所佔用的空間。

  1. 區分兩種內存分配。Live AllocationHeap Dump
  2. 支持查看四種heap的內存分配。image heapzygote heapapp heapJNI heap
  3. 支持三種類的實例查看排序:Arrange by classArrange by packageArrange by callstack

圖中是優化後的內存監控圖,內存佔用已經趨於平穩。

網絡分析

網絡分析工具比較簡單,圖中折線圖一個峯值表示一次網絡鏈接。

經過選中一次網絡鏈接能夠查看到鏈接請求地址以及發送和接收的數據。

最後附上優化後的網絡監控。

耗電監控

耗電監控,一般檢測不到任何問題,通常只是用來衡量應用的耗電狀況。遇到耗電異常的應用,在CPU、內存、網絡監控中都能發現問題。如:網絡鏈接過程發送和接收數據須要使用網卡模塊、推送功能須要保持的長鏈接、GC內存、定位功能都須要電量支持。附上圖中優化先後的對比,注意看Light基線中電量使用的柱形圖。應用耗電問題獲得明顯改善。

總結

上面只是大概介紹了內存分析工具四個模塊的簡單使用。可能讀者對優化先後的對比處於懵懂的狀態。下面解讀下,筆者待測試應用中存在的問題。

應用詳情:

  1. 測試應用中使用了圖片輪播模塊,每2~3s顯示一張圖片。
  2. 使用ImageLoader加載圖片。

正常狀況下,ImageLoader支持三級緩存,根據LRU算法,輪播圖片應該會保存在內存中,而且複用。不會出髮網絡鏈接以及內存的持續增加。

問題詳情:

  1. 輪播圖一共兩張圖片,其中一張圖片資源是空。所以ImageLoader每次都會嘗試發起網絡鏈接下載此圖片。
  2. ImageLoader初始化時,使用了禁止內存緩存的配置以及全局內存緩存空間只有2M。然後管配置的圖片加載在內存中須要3M的空間,導致內存緩存失效。

綜上,被測試應用總會發起網絡請求以及內存資源佔用持續增加致使出發系統GC。間接的致使了應用耗電。有興趣的童鞋能夠驗證下,耗電峯值、網絡鏈接、內存GC和CPU使用峯值之間的關聯。他們四者之間的關係很微妙喲。

考慮到篇幅,暫時介紹至這裏。後續可能會針對四個模塊精講。敬請期待。

以爲有用?那打賞一個唄。我要打賞

此處是廣告Flueky的技術小站

相關文章
相關標籤/搜索