在智能手機App競爭越來越激烈的今天,Android App各項性能如CPU、內存消耗等都是我們在開發測試中需要關注的指標,如何將App打造得更加「優雅」是我們需要不斷追求探索的方向,下面我們從內存和流暢度兩個緯度來說說如何對Android App進行評測和調優。
一、內存
內存不是無限使用的,如果內存過大或泄漏會出現OOM(Out Of Memory)、UI不流暢等問題,因此內存也是一個稀缺資源,我們應該保證沒有內存泄漏且對不需要使用的內存及時釋放。一般內存測試或分析內存問題可以分為下面幾步:
編譯代碼
選定測試場景(來自於經驗&開發)
測試場景轉換成用例
跑起工具Run用例
結合代碼,分析,分析…
1. 內存測試通用的方法
測試分析內存有以下幾種方法:
DDMS(Heap&Allocation Tracker)
Heap查看堆的分配情況:
主要關注兩項數據:
1)Heap Size堆的大小,當資源增加,當前堆的空餘空間不夠時,系統會增加堆的大小。
2)Allocated堆中已分配的大小,這是應用程序實際佔用的內存大小,資源回收后,此項數據會變小。
註:如果進行反覆操作,或堆的大小一直增加,則有內存泄漏的隱患。
Allocation Tracker跟蹤內存分配情況:
MAT(Memory Analyzer)
Leak Suspects:內存泄露報告
Top Components:吃貨報告
Histogram:每個Class佔用內存
Dominator Tree:列出哪些對象佔用內存最多以及誰hold住這些對象
2. Android常見的內存問題
Android常見的內存問題有:
萬惡的Static通常見到在單例模式
下面就是一個例子,static變數佔用過大的內存比例(7.1M),這裡碰到該情況需要具體分析裡面數據是否都是需要常駐的,不要把很多不相干的變數設為static屬性。
多線程生命周期過長hold住本該釋放資源
這裡需要自己搜索代碼查看是哪裡一直hold住了資源導致沒有釋放。
大胖子Bitmap
圖上可以看到Bitmap佔用內存很大(5.7M),利用MAT來找到他的outgoing和incoming引用:
可以找到這塊內存的引用關係,然後找代碼。
在遇到圖片資源佔用過大的情況,建議:
1)及時的銷毀;
2)設置一定的採樣率;
3)巧妙的運用軟引用(SoftRefrence)。
Cursor
Cursor用完記得關掉,如果實在不確定Cursor是否關閉,可以在onDestroy中關了。
總的來說,沒有嚴格意義上泄露只是你hold太久。