返回

内存管理利器升级——LeakCanary 2.0 新增 RootView、Service 泄漏自动检测功能

Android

LeakCanary 是一个用于检测 Android 应用内存泄漏的库,它能够自动检测和报告泄漏的根源,帮助开发人员快速找到并修复内存泄漏问题。最近,LeakCanary 的代码中加入了对 RootView(一般为 DecorView)、Service 泄漏自动检测的功能,本文来分析下这两个功能的实现思路。

一、RootView 泄漏检测

要实现 RootView 的检测,我们只需要在 RootView detached 的时候 watch RootView 的 gc,如果在一定时间内 RootView 没有被回收,则认为 RootView 发生泄漏。LeakCanary 通过 Hook ViewRootImpl 的 detach 方法来实现 RootView 泄漏的检测。

@Override
public void detach() {
    super.detach();
    leakDetector.watchViewRoot(this);
}

当 ViewRootImpl 被 detach 的时候,LeakCanary 会将 RootView 加入到一个 watch list 中,并在一定时间内(默认是 5 秒)检查 RootView 是否被回收。如果在 5 秒内 RootView 没有被回收,则认为 RootView 发生泄漏,并将其报告给 LeakCanary。

二、Service 泄漏检测

Service 泄漏的检测与 RootView 泄漏的检测类似,都是通过 Hook Service 的 onDestroy 方法来实现的。当 Service 的 onDestroy 方法被调用时,LeakCanary 会将 Service 加入到一个 watch list 中,并在一定时间内(默认是 5 秒)检查 Service 是否被回收。如果在 5 秒内 Service 没有被回收,则认为 Service 发生泄漏,并将其报告给 LeakCanary。

@Override
public void onDestroy() {
    super.onDestroy();
    leakDetector.watchService(this);
}

三、使用 LeakCanary 2.0

要使用 LeakCanary 2.0,只需要在你的项目中添加 LeakCanary 库的依赖即可。

dependencies {
    debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.0.0'
    releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:2.0.0'
}

然后在你的 Application 的 onCreate 方法中初始化 LeakCanary。

public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        LeakCanary.config = LeakCanary.config.newBuilder()
                .build();
    }
}

这样,LeakCanary 就会在你的应用中运行,并自动检测内存泄漏问题。

四、总结

LeakCanary 2.0 新增的 RootView、Service 泄漏自动检测功能,可以帮助开发人员快速找到并修复内存泄漏问题,提高应用的稳定性。