Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android性能優化實戰前篇

android性能優化實戰前篇

編輯:關於Android編程

前言:

最近因為某項目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上作者對每個功能的詳細介紹吧。

 

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

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved