Android泄漏金丝雀-泄漏空活动

我的活动被泄漏,但我收到了通知,即使活动全部为空。

这是跟踪:

    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 = 7889
    ​     retainedDurationmillis = 2886
    ​     key = b809b94b-fd3c-4d26-bda4-7f175624c3c3,retainedHeapByteSize=166095)

我刚刚在build.gradle

中添加了依赖项
    debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.0-beta-3'

这里有什么我想念的吗?。

我经历了this stackoverflow link,但没有帮助。

我的设备:

OnePlus 7,Android 10

模拟器,Android 10

giftedhappy 回答:Android泄漏金丝雀-泄漏空活动

这是Android 10中的Android框架中的已知泄漏:https://issuetracker.google.com/issues/139738913

,

如果您在 Android 处于 Q 状态时尝试完成根 Activity,很遗憾,这会泄漏您的内存,正如 twitter thread 所说

在添加对气泡(作为聊天头活动)的支持时引入了泄漏。正确报告,但:“我们已推迟此问题以在未来版本中考虑。”

发生这种泄漏是因为 IRequestFinishCallback$Stub 是一个 IPC 回调,最终被活动管理器进程持有

如所述的解决此问题的方法

您可以通过覆盖 Activity.onBackPressed() 并调用 Activity.finishAfterTransition() 来“修复”此泄漏;如果 Activity 是任务根且片段堆栈为空,则代替 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 问题跟踪器 here

跟踪问题更新
本文链接:https://www.f2er.com/3145144.html

大家都在问