Android泄漏检测工具Canary - 泄漏的空白活动

5

我收到通知,提示我的活动正在泄露,但实际上我的活动列表为空。

这是追踪信息:

    ApplicationLeak(className=com.bcx.tracker.ui.login.LoginActivity, leakTrace=
    ┬
    ├─ android.app.Activity$1
    │    Leaking: UNKNOWN
    │    Anonymous subclass of android.app.IRequestFinishCallback$Stub
    │    GC Root: Global variable in native code
    │    ↓ Activity$1.this$0
    │                 ~~~~~~
    ╰→ com.bcx.tracker.ui.login.LoginActivity
    ​     Leaking: YES (Activity#mDestroyed is true and ObjectWatcher was watching this)key = fc3d8e13-c51c-4ff8-995f-4e0da90f085b
    ​     watchDurationMillis = 7889retainedDurationMillis = 2886key = b809b94b-fd3c-4d26-bda4-7f175624c3c3
    , retainedHeapByteSize=166095)

我刚刚在build.gradle文件中添加了依赖。

    debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.0-beta-3'

这里有什么遗漏吗?

我已经阅读了这个stackoverflow的链接,但没有帮助。

我的设备:

OnePlus 7,安卓10

模拟器,安卓10


当你说即使我的所有活动都是空的时,你的意思是什么?避免内存泄漏的最佳规则是避免在其他类中持有您的活动或片段的实例。您的类不应该了解您的视图元素。相反,您的活动或片段应该向其Presenter请求其所需的任何内容,以便按预期运行。 - The_Martian
这是一个没有任何额外代码的应用程序。我只是使用默认基本模板创建了两个活动,并没有在任何地方保存任何实例。 - pz64_
仍然存在 OnePlus 7T 泄漏问题,我认为这是 Oxygen OS 上的一个 bug。 - abalta
我遇到了相同的问题,我的三星M01安卓10系统,你找到解决方法了吗? - Bolt UIX
2个回答

14

1
在这个链接中,问题状态已被修复,如何解决它? - Bolt UIX

2
如果您正在尝试在Android Q上完成您的根活动,那么不幸的是,这会导致内存泄漏,正如这个Twitter线程所说。
引入泄漏的原因是添加支持气泡(作为聊天框活动)时。已经报告但是:“我们将推迟考虑此问题。”
这个泄漏发生的原因是因为IRequestFinishCallback$Stub是一个IPC回调,最终被活动管理器进程持有。
如下面所述,解决此问题的方法:
如果活动是任务根并且碎片堆栈为空,则可以通过覆盖Activity.onBackPressed()并调用Activity.finishAfterTransition();而不是super来“修复”此泄漏。
以下是完整建议代码,还要检查是否为根活动和碎片堆栈是否为空:
override fun onBackPressed() {
    if (Build.VERSION.SDK_INT == Build.VERSION_CODES.Q &&
        isTaskRoot &&
        supportFragmentManager.primaryNavigationFragment?.childFragmentManager?.backStackEntryCount ?: 0 == 0 &&
        supportFragmentManager.backStackEntryCount == 0
    ) {
        finishAfterTransition()
    } else {
        super.onBackPressed()
    }
}

在小米A2 - Android Q (android one)上进行了测试

您还可以从Google问题跟踪器这里跟踪问题更新


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接