1. 程式人生 > >android效能優化實戰前篇

android效能優化實戰前篇

本文地址:http://blog.csdn.net/iamws/article/details/51629160

前言:

        最近因為某專案cpu,記憶體的使用率實在讓人不敢恭維;手機發燙,電量下降已經讓使用者無法忍受;頻繁快速迭代發版導致各種效能問題突出;由於之前產品不考慮低端手機情況,低端手機直接跑到崩潰,直接體現的是DAU的急速下降;最終在競品的對比資料下,開始重視這塊事情了,也給了我們半個月時間去優化效能。

目標:

       效能達到並且低於競品的消耗值,並且能讓低配使用者也能玩起來。

這就是這篇文章的來源了,算作這一階段優化後的個人總結吧,切入正題:我們都知道在短時間大改動的產品迭代期,效能問題會比較突出,特別是敏捷新功能開發,由於每個開發者都有自己的思維,最終如果在沒有好的框架約束下,問題就會越來越多,滾雪球般,體現最明顯的就是記憶體洩漏,佈局層次過深,measure計算過多,動畫繪製問題,io,自定義控制元件的draw裡面物件建立,執行緒濫用,handler裡面丟了個外部物件不清除,內部類與匿名類問題等,所以實戰的第一步就是定位問題,而定位問題,最好的就是使用各種成熟工具:

首先介紹一下常用工具:

1、android studio/intellij裡面的記憶體,cpu監控器

2、DDMS裡面那一排的功能

3、MAT

4、手機的開發者模式下的各種選項

5、fiddle/wireshark等一些抓包的代理工具

6、其他輔助工具等

相信這些工具網上一搜一大把教程,不過這裡我還是囉嗦下,畢竟用好工具是最重要的一步(因為解決大多效能問題就要靠技術積累去了解並改動程式碼實現了):

ps:下面只是簡單介紹各個工具的功能,不會涉及過多工具的使用方法,如果需要檢視使用方法的話麻煩大家google一下,如果對這些工具都比較熟悉的就可以不用看下面了,等接下來後續的例項分析和總結吧(┬_┬)

第一個,直接用IDE的cpu,記憶體監視器,也就是下圖的這些monitor

啟動方法:



通過執行app的過程中觀察整個圖表變化,如果有效能問題的可以很明顯的看到線的走勢圖會出現異常,這個是最簡單的檢視器。

可用於檢視:GC過程,記憶體分配,cpu使用real time等

  • Show a graph of available and allocated Java memory over time.
  • Show garbage collection (GC) events over time.
  • Initiate garbage collection events.
  • Quickly test whether app slowness might be related to excessive garbage collection events.
  • Quickly test whether app crashes may be related to running out of memory

具體使用方法可見官方文件:

https://developer.android.com/studio/profile/am-memory.html

https://developer.android.com/studio/profile/am-cpu.html

第二個:DDMS(重點)

啟動方法:



這個裡面功能很全,debug,抓佈局,截圖,執行緒,抓效能資料,GPU樣樣都有,基本也是優化過程中用的最多的工具了

1、debug開關

2、在13(heap viewer)中顯示當前記憶體狀況

3、抓取當前時刻程序中記憶體資料,是dump下來hprof檔案,這個檔案就是要結合後面重點的MAT工具用來分析記憶體用的(重點)

4、垃圾回收,立即GC

5、在12(thread viewer)當中顯示當前程序裡面所有執行緒的執行狀態(重點)

6、可以抓取一段時間內整體cpu使用狀況(Traceview),用來分析方法在cpu的消耗情況(重點)

7、停止

8、截圖

9、獲取當前手機佈局整體的緯度,用來分析UI巢狀繪製樹(重點)

10、這個工具需要積累一定的系統知識才能用的好,特別是要知道那些方法是處理介面UI,那些是處理資源排程什麼的,因為這是對系統整體的綜合追蹤,開啟過程中可以自己過濾一些分析物件,最終會生成一個網頁檔案,通過瀏覽器可以看到裡面的圖表結構,我主要是用這個分析webview的效能和vsync下UI卡頓原因的,這個vsync是什麼後面會講


11、分析GPU的繪製(硬解碼好東東,分擔cpu的)

12、執行緒展示框

13、記憶體展示框

14、物件分配展示框

15、網路使用框

16、檔案瀏覽框

17、模擬機avd控制器

18、整體系統狀態餅狀圖(CPU,記憶體,frame)

第三個MAT工具:

圖示長的像eclipse的傢伙,以前用eclipse可以直接從裡面開啟,好像這個工具就是eclipse這邊搞的(錯了勿噴哈)

工具官方地址:http://www.eclipse.org/mat/

這個工具作用很重要,分析記憶體洩漏,還有整體記憶體狀態就靠它了

開啟上面我們用DDMS第三個功能dump下來的hprof檔案後如下圖樣子:(原諒我從官網偷的圖,注意ddms抓的hprof檔案要用到android sdk的tools下面的hprof-conv.exe轉換一下才行)


從這個工具裡面我們可以看到當時應用中有哪些物件,而且用這個工具可以跟蹤整個物件在GC root下整體引用過程,這塊知識需要用到java的GC原理,用這個工具主要是用來找記憶體洩漏的,也就是通過這個工具,我可以知道應該要被回收的物件,為什麼沒有被回收,它的引用樹是什麼樣的,這樣就能去程式碼中定位問題所在了,還有可以用這個工具看看物件記憶體的使用情況,分析哪些物件可以用物件池,哪些物件new的數目特別多等


第四個:安卓手機裡面的開發者模式

這個工具可以直接很直觀的看過度繪製,cpu記憶體使用情況,各個佈局的邊界,surface更新閃爍,不保留活動等,主要用來直觀的看出APP的執行狀況,還有home回首頁後的activity除錯,重點主要還是分析過度繪製

下面給出開啟了過度繪製驗證時候的介面顏色分析圖吧:

ps:無色還有可能是用了surfaceview這種另外的window層


第五個:抓包工具:

這個主要是針對webview,還有各種網路通訊的時候使用,用來分析包的情況還有資料請求情況,可以發現很多請求是否必要或者能夠減少請求頻率,減少回覆大小,達到減少解析或者壓縮的cpu損失

fiddle工具如圖:左側為請求區,右側為協議內部內容,這個主要是對http和https的


第六個:其他工具

先說一個:電量統計battery-historian

地址:https://github.com/google/battery-historian

這個工具依賴萬能的adb,其他工具實際上也就是都利用adb的,只不過更檢視可視化了,如果adb用的溜,那確實可以直接在命令列中就可以看很多資料了

這裡就舉例說下效能除錯中對電量使用獲取的方法吧:

先初始化

adb shell dumpsys batterystats --enable full-wake-history
shell dumpsys batterystats --reset

然後執行app一段時間後利用bugreport日誌可以匯出

adb bugreport > bugreport.txt

開啟txt可以找到這段話


這個就是可以看出電量使用情況了,但是既然說了上面有個工具,那肯定要用上啦,

使用上面的工具轉換成html可以更方便檢視(ps:上面的工具是python的,需要配置下python環境)

python historian.py -a bugreport.txt > batteryhistory.html

原諒我盜用了作者的圖,裡面可以統計很多資訊:

具體要分析什麼,大家可以看github上作者對每個功能的詳細介紹吧。

好了,效能分析前篇準備工作就是熟悉工具,以及會使用工具抓分析資料,接下來就是一些理論和實戰的東西了,工具分析就到這了,如果大家需要我出一套工具的詳細使用方法那就多留言吧,我爭取可以抽時間出來針對每一個工具都做個詳細分析~

author:[email protected]

轉載必須註明出處:本文地址:http://blog.csdn.net/iamws/article/details/51629160