之前的文章從理論上介紹了Android高性能編碼的幾個優化的方向,下面我們從實戰的角度講述如何優化
Android高性能編碼實戰:App啟動優化
Android高性能編碼實戰:網絡架構優化
Android高性能編碼實戰:修複記憶體洩漏
記憶體洩漏也稱作“存儲滲漏”,用動态儲存配置設定函數動态開辟的空間,在使用完畢後未釋放,結果導緻一直占據該記憶體單元。直到程式結束。(其實說白了就是該記憶體空間使用完畢之後未回收)即所謂記憶體洩漏。
移動裝置記憶體稀缺珍貴,而Android配置設定給虛拟機的記憶體也有限,是以防止記憶體洩漏是性能優化的重點,記憶體洩漏在Android開發中主要發生在activity或者fragment生命周期結束時,該回收的記憶體沒有回收。需要特别注意的有以下幾個地方:
1.和activity生命周期有關的控件,比如handler、AsyncTask,以及需要activity context的控件
handler等控件需要進行異步操作,由于一般是内部類的原因,會持有外部環境的引用,也就是activity的引用,這個時候activity生命周期結束了,由于還存在引用,釋放不掉,如果handler一直不釋放,activity也就不會回收,造成記憶體洩漏。
2.超大圖檔、圖檔相關的緩存架構
超大圖檔,圖檔大小超過8M的大圖檔,需要進行壓縮,ARGB8888改RGB565等操作之後使用,不然會直接造成OOM。
下載下傳圖檔并生成bitmap,一定要做好緩存,釋放bitmap和對應的ImageView,采用第三方圖檔緩存架構進行記憶體管理。
3.activity橫豎屏切換、語言切換
橫豎屏切換、語言切換等操作,activity會重新加載,
android:configChanges="keyboardHidden|orientation|screenSize"
在manifest activity标簽中添加,可以防止activity重新建立。
下面介紹一個檢查記憶體洩漏的工具
1.Android studio 自帶monitors

一般大的記憶體洩漏直接觀察Allocated的大小就能發現
2.開源工具LeakCanary
LeakCanary是square的開源項目,定位記憶體洩漏神器,配置很簡單
在gradle中配置
dependencies {
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5.1'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.1'
testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.1'
}
在Application中配置
public class ExampleApplication extends Application {
@Override public void onCreate() {
super.onCreate();
if (LeakCanary.isInAnalyzerProcess(this)) {
// This process is dedicated to LeakCanary for heap analysis.
// You should not init your app in this process.
return;
}
LeakCanary.install(this);
// Normal app init code...
}
}
然後操作你的APP,每個頁面和功能都使用一遍,LeakCanary會自動檢查記憶體洩漏,生成記憶體洩漏報告
LeakCanary可以發現很細微的記憶體洩漏,具體到類檔案,非常友善。
3.adb環境下輸入以下指令
adb shell dumpsys meminfo [應用包名]
這個指令可以檢查整個process程序的記憶體變化情況,不但可以檢查虛拟機的記憶體,還可以檢查native層的洩漏