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

Posted

技术标签:

【中文标题】Android泄漏金丝雀 - 泄漏空活动【英文标题】:Android leak canary - leaking empty activity 【发布时间】:2019-11-07 11:46:33 【问题描述】:

当我的活动被泄露时,我会收到通知,即使活动都是空的。

这是踪迹:

    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 *** link 没有帮助。

我的设备:

一加 7,安卓 10

模拟器,安卓10

【问题讨论】:

即使我所有的活动都是空的,你是什么意思?避免内存泄漏的最佳规则是避免在其他类中保存您的活动或片段的实例。你的类应该对你的视图元素一无所知。相反,您的 Activity 或 Fragment 应该向它的演示者询问它需要按需要运行的任何内容。 这是一个完全没有额外代码的应用程序。我刚刚使用默认基本模板制作了两个活动,并且没有在任何地方保存任何实例。 一加 7T 中仍然存在泄漏,我认为这是 Oxygen OS 的一个错误。 我遇到了同样的问题三星 m01 android 10,你有解决办法吗? 【参考方案1】:

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

【讨论】:

此链接问题状态已修复,如何修复?【参考方案2】:

如果你试图在你的 Android 是 Q 时完成你的根活动,不幸的是,这会泄露你的记忆,正如这条推特 thread 所说的那样

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

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

上述问题的解决方法

您可以通过覆盖 Activity.onBackPressed() 并调用 Activity.finishAfterTransition(); 来“修复”此泄漏。如果活动是任务根并且片段堆栈为空,则不是超级。

这里是完整的建议代码,还可以检查作为根活动的部分和片段堆栈是否为空

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()
    

在 Mi A2 - Android Q (android one) 上测试

您还可以从谷歌问题跟踪器here跟踪问题更新

【讨论】:

以上是关于Android泄漏金丝雀 - 泄漏空活动的主要内容,如果未能解决你的问题,请参考以下文章

android 内存泄漏检测工具 LeakCanary 泄漏金丝雀

Android泄漏金丝雀日志

使用泄漏金丝雀构建错误

SearchView在Android应用中泄漏内存

泄漏金丝雀,Recyclerview 泄漏 mAdapter

如何解决框架布局中的内存泄漏问题?