首页 > 系统 > Android > 正文

LeakCanary——直白的展现Android中的内存泄露

2019-11-09 15:17:49
字体:
来源:转载
供稿:网友

之前碰到的OOM问题,终于很直白的呈现在我的眼前:我尝试了MAT,但是发现不怎么会用。直到今天终于发现了这个新工具:

当我们的App中存在内存泄露时会在通知栏弹出通知:

这里写图片描述

当点击该通知时,会跳转到具体的页面,展示出Leak的引用路径,如下图所示:

这里写图片描述

LeakCanary 可以用更加直白的方式将内存泄露展现在我们的面前。

以下是我找到的学习资料,写的非常棒: 1、LeakCanary: 让内存泄露无所遁形 2、LeakCanary 中文使用说明

AndroidStudio (官方)上使用LeakCanary 请移步: https://github.com/square/leakcanary

Eclipse 上使用LeakCanary 请移步我的: https://github.com/SOFTPOWER1991/LeakcanarySample-Eclipse

Android studio (自己弄的)上使用LeakCanary也可以看这个:

leakcanarySample_androidStudio

工程包括:

LeakCanary库代码LeakCanaryDemo示例代码

使用步骤:

将LeakCanary import 入自己的工程

添加依赖:

compile PRoject(':leakcanary')

application中进行配置

public class ExampleApplication extends Application { ...... //在自己的Application中添加如下代码public static RefWatcher getRefWatcher(Context context) { ExampleApplication application = (ExampleApplication) context .getApplicationContext(); return application.refWatcher;} //在自己的Application中添加如下代码private RefWatcher refWatcher;@Overridepublic void onCreate() { super.onCreate(); ...... //在自己的Application中添加如下代码 refWatcher = LeakCanary.install(this); ......}.....}12345678910111213141516171819202122232425

在Activity中进行配置

public class MainActivity extends AppCompatActivity { ...... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //在自己的应用初始Activity中加入如下两行代码 RefWatcher refWatcher = ExampleApplication.getRefWatcher(this); refWatcher.watch(this); textView = (TextView) findViewById(R.id.tv); textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startAsyncTask(); } }); } private void async() { startAsyncTask(); } private void startAsyncTask() { // This async task is an anonymous class and therefore has a hidden reference to the outer // class MainActivity. If the activity gets destroyed before the task finishes (e.g. rotation), // the activity instance will leak. new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(Void... params) { // Do some slow work in background SystemClock.sleep(20000); return null; } }.execute(); }}12345678910111213141516171819202122232425262728293031323334353637383940414243在AndroidMainfest.xml 中进行配置,添加如下代码 <service android:name="com.squareup.leakcanary.internal.HeapAnalyzerService" android:enabled="false" android:process=":leakcanary" /> <service android:name="com.squareup.leakcanary.DisplayLeakService" android:enabled="false" /> <activity android:name="com.squareup.leakcanary.internal.DisplayLeakActivity" android:enabled="false" android:icon="@drawable/__leak_canary_icon" android:label="@string/__leak_canary_display_activity_label" android:taskAffinity="com.squareup.leakcanary" android:theme="@style/__LeakCanary.Base" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表