天天看點

Android記憶體優化8 記憶體檢測工具2 LeakCanary——直白的展現Android中的記憶體洩露

之前碰到的OOM問題,終于很直白的呈現在我的眼前:我嘗試了MAT,但是發現不怎麼會用。直到今天終于發現了這個新工具:

當我們的App中存在記憶體洩露時會在通知欄彈出通知:

Android記憶體優化8 記憶體檢測工具2 LeakCanary——直白的展現Android中的記憶體洩露

當點選該通知時,會跳轉到具體的頁面,展示出Leak的引用路徑,如下圖所示:

Android記憶體優化8 記憶體檢測工具2 LeakCanary——直白的展現Android中的記憶體洩露

LeakCanary 可以用更加直白的方式将記憶體洩露展現在我們的面前。

以下是我找到的學習資料,寫的非常棒: 

AndroidStudio (官方)上使用LeakCanary 請移步: 

<a href="https://github.com/square/leakcanary">https://github.com/square/leakcanary</a>

Eclipse 上使用LeakCanary 請移步我的: 

<a href="https://github.com/SOFTPOWER1991/LeakcanarySample-Eclipse">https://github.com/SOFTPOWER1991/LeakcanarySample-Eclipse</a>

<a href="https://github.com/SOFTPOWER1991/leakcanarySample_androidStudio">leakcanarySample_androidStudio</a>

工程包括:

LeakCanary庫代碼

LeakCanaryDemo示例代碼

使用步驟:

将LeakCanary import 入自己的工程

添加依賴:

<code>compile project(':leakcanary')</code>

在Application中進行配置

在Activity中進行配置

在AndroidMainfest.xml 中進行配置,添加如下代碼

5、測試結果

a、Toast顯示(大概10秒左右顯示)

Android記憶體優化8 記憶體檢測工具2 LeakCanary——直白的展現Android中的記憶體洩露

b、通知顯示

Android記憶體優化8 記憶體檢測工具2 LeakCanary——直白的展現Android中的記憶體洩露

c、桌面自動添加的圖表

Android記憶體優化8 記憶體檢測工具2 LeakCanary——直白的展現Android中的記憶體洩露

d、記憶體洩露清單

Android記憶體優化8 記憶體檢測工具2 LeakCanary——直白的展現Android中的記憶體洩露

e、記憶體洩露詳細

Android記憶體優化8 記憶體檢測工具2 LeakCanary——直白的展現Android中的記憶體洩露

LogCat可以看到日志日下(hprof檔案可以用MAT打開進行分析):

01-04 11:49:41.815 12967-13004/com.micky.leakcanarysamples I/dalvikvm: hprof: dumping heap strings to "/storage/emulated/0/Download/leakcanary/suspected_leak_heapdump.hprof".  

01-04 11:49:42.020 12967-13004/com.micky.leakcanarysamples I/dalvikvm: hprof: heap dump completed (28850KB)  

檢視自動生成的AndroidManifest檔案,LeakCanarySamples/app/build/intermediates/manifests/full/debug/AndroidManifest.xml

&lt;?xml version="1.0" encoding="utf-8"?&gt;  

&lt;manifest xmlns:android="http://schemas.android.com/apk/res/android"  

    package="com.micky.leakcanarysamples"  

    android:versionCode="1"  

    android:versionName="1.0" &gt;  

    &lt;uses-sdk  

        android:minSdkVersion="10"  

        android:targetSdkVersion="23" /&gt;  

    &lt;!-- To store the heap dumps and leak analysis results. --&gt;  

    &lt;uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /&gt;  

    &lt;android:uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /&gt;  

    &lt;application  

        android:name="com.micky.leakcanarysamples.BaseApplication"  

        android:allowBackup="true"  

        android:icon="@mipmap/ic_launcher"  

        android:label="@string/app_name"  

        android:supportsRtl="true"  

        android:theme="@style/AppTheme" &gt;  

        &lt;activity  

            android:name="com.micky.leakcanarysamples.MainActivity"  

            android:label="@string/app_name"  

            android:theme="@style/AppTheme.NoActionBar" &gt;  

            &lt;intent-filter&gt;  

                &lt;action android:name="android.intent.action.MAIN" /&gt;  

                &lt;category android:name="android.intent.category.LAUNCHER" /&gt;  

            &lt;/intent-filter&gt;  

        &lt;/activity&gt;  

        &lt;activity android:name="com.micky.leakcanarysamples.TestActivity" /&gt;  

        &lt;service  

            android:name="com.squareup.leakcanary.internal.HeapAnalyzerService"  

            android:enabled="false"  

            android:process=":leakcanary" /&gt;  

            android:name="com.squareup.leakcanary.DisplayLeakService"  

            android:enabled="false" /&gt;  

            android:name="com.squareup.leakcanary.internal.DisplayLeakActivity"  

            android:icon="@drawable/__leak_canary_icon"  

            android:label="@string/__leak_canary_display_activity_label"  

            android:taskAffinity="com.squareup.leakcanary"  

            android:theme="@style/__LeakCanary.Base" &gt;  

    &lt;/application&gt;  

&lt;/manifest&gt;  

如上所示LeakCanary給我們自動添加了兩個Service和一個Activity,并添加了對SD卡的讀寫權限

注: 

1、如果在Release模式下請使用RefWatcher.DISABLED

 2、在Activity或Fragment 的 Destroy方法中添加檢測(很好了解,就是判斷一個Activity或Fragment想要被銷毀的時候,是否還有其他對象持有其引用導緻Activity或Fragment不能被回收,進而導緻記憶體洩露)

    本文轉自 一點點征服   部落格園部落格,原文連結:http://www.cnblogs.com/ldq2016/p/8472721.html,如需轉載請自行聯系原作者

繼續閱讀