Utils测试移动端专项目测试

Android内存泄漏检测工具LeakCanary上手指南

2016-06-18  本文已影响1591人  最多想你

LeakCanary官方Demo介绍

在项目中引入LeakCanary

  1. 配置 build.gradle文件,添加后我们点Sync Now ,或者build一下
dependencies {
//debugCompile是设置仅在我们开发Debug的时候,LeakCanary才会帮我们去检测内存泄漏
   debugCompile 'com.squareup.leakcanary:leakcanary-android:1.4-beta2'
// releaseCompile是打包的时候LeakCanary不生效
   releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta2'
   testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta2'
 }
  1. 在项目里添加一个类叫MyApplication 继承自Application ,并在其中“安装” LeakCannary:
public class MyApplication extends Application {

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

完成这些步骤后就已经把环境基本上配置好了,不添加任何代码,LeakCanary会默认帮我们去检测Activity的内存泄漏。

写一个内存泄漏的Demo

  <?xml version="1.0" encoding="utf-8"?>
  <RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"    > 
  <Button        
    android:layout_centerHorizontal="true"
    android:id="@+id/button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="开启异步线程"/>
</RelativeLayout>
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private TextView mTv;
    private Button mButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mButton = (Button) findViewById(R.id.button);
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startAsyncTask();
            }
        });
    }

    public void startAsyncTask(){
        new AsyncTask<Void,Void,Void>(){
            @Override
            protected Void doInBackground(Void... params) {
                Log.v("家俊","doInBackground");
                SystemClock.sleep(10000);
                return null;
            }
        }.execute();
    }

LeakCanary使用方式

  1. 监控 Activity 泄露(默认)
    由于经常把 Activity 当作为 Context 对象使用,在不同场合由各种对象引用 Activity。所以,Activity 泄漏是一个重要的需要检查的内存泄漏之一。

  2. 监控Fragment泄漏
    -使用RefWatcher监控
    此类的对象的获取方式:RefWatcher refWatcher=LeakCanary.install(this);
    可以在刚才自定义的全局MyApplication 中去获取。代码如下:

public class MyApplication extends Application {
    public static RefWatcher refWatcher;

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

然后,在需要检测Fragment回收的地方,加入refWatcher.watch(this);
-代码如下

public abstract class BaseFragment extends Fragment {
    @Override 
    public void onDestroy() {
        super.onDestroy();
        RefWatcher refWatcher = MyApplication.refWatcher;
        refWatcher.watch(this);
    }
}

当 Fragment.ondestroy()被调用之后,如果这个 fragment 实例没有被销毁,那么就会从通知栏和 logcat 里看到相应的泄漏信息。

  1. 监控其他泄漏
  RefWatcher refWatcher = MyApplication.refWatcher;
  refWatcher.watch(someObjNeedGced);

someObjNeedGced标识我们需要监控的对象,当 someObjNeedGced 还在内存中时,就会在 logcat 里看到内存泄漏的提示。

原理

上一篇 下一篇

猜你喜欢

热点阅读