Android 應用的性能分析,優化,需要檢查分析內存使用情況和方法調用情況。本文給出進行這兩方面分析的工具和方法。
內存使用分析
1. 分析內存使用
雖然Android系統的Dalvik虛擬機有垃圾回收機制,但因手機內存使用存在不同于普通PC的更大的限制,內存使用方面的問題,我們更應多加注意。
-
一些內存使用問題會非常明顯,比如內存耗盡(不足)時觸發的
OutOfMemoryError
可能會使App直接崩潰。 -
另有一些內存問題則表現得不那么明顯,但他們會讓你的App以及系統變得越來越慢。
當有以上兩種情況之一時,就得看看內存的使用情況了,是否存在:
- 過大的對象,占用內存
- 有些對象一直被創建,從未被釋放。
2. 工具
在Android的ADT中,提供了兩種工具可以用來分析內存使用
-
對象分配相關:DDMS中的Allocation Tracker。借助這個工具可以查看對象的生成和分配情況, 可了解到對象在何時被創建,但無法了解整個App的對象分配情況。
-
Heap使用情況相關:
- DDMS中的Heap工具。
- hprof導出工具,在DDMS中導出hprof文件,在 Memory Analyzer 中查看。
hprof文件是Java 虛擬機的Heap快照
3. 查看Heap實時情況
- 打開DDMS,選中應用,點擊Update Heap按鈕
- 右側Heap標簽頁,顯示了Heap使用情況
- 操作應用,看哪些操作將導致內存用量增大
4. Memeory Analyzer分析內存使用情況
根據實時的Heap使用情情況,我們可以大致判斷哪些操作,哪些頁面可能存在內存是一共問題,但是具體的問題的需要更進一步的數據。
Allocation Tracker提供了對象分配和被引用的詳細的信息
另外,還提供了一個報告,為我們分析提供參考
請在此處下載: Memeory Analyzer
我們可以通過DDMS導出hprof文件,在Memeory Analyzer中分析, 如下:
-
打開DDMS, 選中應用,點擊
Dump HPROF file
, 等待一段時間, 10幾秒甚至更長,保存hprof文件。 -
導出的文件為Dalvik虛擬機格式的,需要轉成J2SE虛擬機格式的,否則Memeory Analyzer無法打開
在windows中,cmd:
cd /d D:\android\adt\adk\tools hprof-conv.exe D:\tmp\com.srain.cube.sample.hprof D:\tmp\com.srain.cube.sample-conv.hprof
- 在Memeory Analyzer 中打開文件 打開文件分析的過程中,會提示是否生成分析報告,分析報告會指出哪些對象是可疑的占用內存的對象。
界面展示大致如下:
點擊Histogram:
各對象在列表中,可排序:
- Shallow Heap: 占用的真正的內存大小
- Retained Heap: 對象自身的大小 + 所維護的引用的大小
選中某個對象,List Objects -> with incoming reference / with outcoming reference 可查看引用和被應用的情況。 根據這些,加上搜索,可判斷未釋放的或者過大的有問題的對象的位置。
Memeory Analyzer功能強大, 更多用法,點擊這里
方法調用分析
App不流暢卡頓,和方法執行速度有更直接的關系。 主UI線程上的耗時操作,超過5s,系統就會提示用戶,是否終止程序。 在ListView中的
getView()
方法,一個耗時10ms的操作就足夠把你的列表卡頓得慘不忍睹。
Android框架Debug類提供了方法,記錄方法調用的執行數據到一個trace文件,在代碼中:
// 開始 trace文件位置: /sdcard/cube.trace
Debug.startMethodTracing("cube");
// ...
// 其他的代碼
// 停止
Debug.stopMethodTracing();
在模擬器或者沒SDK的真機上調試時,直接使用 /sdcard下的路徑可能會有Permission deny錯誤,改用機身內部存儲試試。
生成的trace文件,通過adb pull存到本地。
adb pull /sdcard/cube.trace D:\tmp\cube.trace
直接在ADT的eclipse中打開:
上圖中:
-
上部區域(Timeline Panel)為各線程的時間線上的概況
- 在區域1,鼠標為左右箭頭狀,在放大之后,可拖動縮小尺寸
- 鼠標放在各線程時間軸區域,比如主線程的2區域,鼠標成十字狀,左右拖動可以選擇關注區域,選擇合適的關注區域,松開鼠標,區域將放大。
-
下部區域(Profile Panel)為方法調用情況, 幾個參數介紹如下:
- cpu time,方法執行的真正的時間
- real time, cpu time + 其他時間(IO wait, Thread wait)
- Inc xxx Time, Inc 為 inclusive 縮寫,本方法調用時間以及本方法內部所調用的方法(子方法)的總和
- Excl xxx Time, Excl 為exclusive 的縮寫,指的除去子方法,該方法本身執行時間
- Calls + RecurCalls/Total, 顯示父子方法調用次數占比
- 選中一個方法,在時間線圖中會有突出顯示。放大時間線圖,可直觀看出方法執行時間長度;看調用圖,可找出該方法被調用的層次關系。
- 查看Excl Time 和Inc Time,分析調用關系,可找出真正耗時的方法,找出性能瓶頸。
上圖中,Excl Time 排名第二的方法
bytesToHexString
很可能是有性能問題的。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
