我的活动被泄漏,但我收到了通知,即使活动全部为空。
这是跟踪:
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
答案 0 :(得分:1)
这是Android 10中的Android框架中的已知泄漏:https://issuetracker.google.com/issues/139738913
答案 1 :(得分:0)
如果您在 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
跟踪问题更新