[Android] LeakCanary 檢測記憶體洩漏的工具

在 Android 開發的過程中,時常會遇到某些狀況(通常是網路或資料庫存取),導致物件要作的事情完成了,但沒有正確被回收掉。此時,這個沒被回收的孤兒,就會佔用記憶體,造成記憶體洩漏,也就是一般常說的 Memory Leak。發生 Memory Leak,會發生效能問題導致 Out of Memory、造成 Force Close、甚至可能造成安全問題。

過去在 Eclipse IDE 時代,Eclipse 有推出一個叫做 MAT 的記憶體分析外掛,搭配 Android DDMS 來檢測記憶體洩漏的問題。

在 Android Studio 的時代,Square 這間公司(沒錯,就是推出 okhttpRetrofitPicasso 等一系列知名函式庫,也是大神 Jake Wharton 任職的公司)推出了 LeakCanary 套件,直接安裝在 App 上,藉由在測試環境,以 debug 模式來找出程式中記憶體洩漏的問題。

首先,在 build.gradle 引入下面三個套件,它會藉由 Gradle 的特性,在不同的建置方式,會抓不同的套件。這樣就可以,只在 debug 時正常安裝 LeakCanary 套件,而在 release 到正式環境時,安裝另一個不執行 LeakCanary 檢測的套件。
dependencies {
   debugCompile 'com.squareup.leakcanary:leakcanary-android:1.4-beta2'
   releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta2'
   testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta2'
 }

然後在 Application 加上一行程式碼。就這樣,夠簡單吧!
public class ExampleApplication extends Application {

  @Override public void onCreate() {
    super.onCreate();
    LeakCanary.install(this);
  }
}

因為 LeakCanary 只在 debug 模式下執行,因此只能在模擬器執行,要在實績執行的話,則要用 Android Studio 包裝不含 sign 的 debug apk 檔,然後手動安裝到實績上。

將 App 安裝在模擬器之後,LeakCanary 會自動安裝一個叫做 Leak 的 App 在模擬器上,之後,在手動測試 App 的過程中,如果 LeakCanary 檢測到記憶體洩漏,除了會以通知方式呈現之外,也會將檢測結果紀錄在這個 App 上。

如果 LeakCanary 檢測到記憶體洩漏,會如下畫面以圖形方式將結果呈現(圖片取自官網)。

正常來說,LeakCanary 只會在 debug 模式下執行。因此要將 App release 上架,可以放心的使用 release 來建置 apk。如果還是擔心 LeakCanary 會在正式環境執行,造成用戶困擾的話,也可以在建置之前先把相關程式移除,反正只有一行程式碼。

關於 Leak Canary 的教學與說明,可觀賞 用 LeakCanary 检测内存泄漏 影片(內附中文翻譯)




相關文章

如何將電腦畫面經由 Chromecast 投放到電視螢幕上

Chrome 的檔案續傳功能

隱私權政策產生器 Privacy Policy Generator

使用 Vysor 在電腦上控制 Android 裝置