leakcanary - 此泄漏是否是由 Android 11 DP2 引起的
问题描述
我在 Pixel 4 XL 上使用 Android 11 DP2,从那以后,我经常遇到这种泄漏。我怀疑它是由开发人员预览引起的,但我并不完全确定。
我试图在网上搜索这个泄漏,但我没有找到任何相关的东西。
你怎么看?
┬───
│ GC Root: System class
│
├─ android.app.ApplicationPackageManager class
│ Leaking: NO (a class is never leaking)
│ ↓ static ApplicationPackageManager.mHasSystemFeatureCache
│ ~~~~~~~~~~~~~~~~~~~~~~
├─ android.app.ApplicationPackageManager$1 instance
│ Leaking: UNKNOWN
│ Anonymous subclass of android.app.PropertyInvalidatedCache
│ ↓ ApplicationPackageManager$1.mCache
│ ~~~~~~
├─ android.app.PropertyInvalidatedCache$1 instance
│ Leaking: UNKNOWN
│ Anonymous subclass of java.util.LinkedHashMap
│ ↓ PropertyInvalidatedCache$1.tail
│ ~~~~
├─ java.util.LinkedHashMap$LinkedHashMapEntry instance
│ Leaking: UNKNOWN
│ ↓ LinkedHashMap$LinkedHashMapEntry.key
│ ~~~
├─ android.app.ApplicationPackageManager$HasSystemFeatureQuery instance
│ Leaking: UNKNOWN
│ ↓ ApplicationPackageManager$HasSystemFeatureQuery.this$0
│ ~~~~~~
├─ android.app.ApplicationPackageManager instance
│ Leaking: UNKNOWN
│ ↓ ApplicationPackageManager.mContext
│ ~~~~~~~~
├─ android.app.ContextImpl instance
│ Leaking: UNKNOWN
│ ↓ ContextImpl.mAutofillClient
│ ~~~~~~~~~~~~~~~
╰→ com.example.app.ui.activities.SplashActivity instance
Leaking: YES (ObjectWatcher was watching this because com.example.app.ui.activities.SplashActivity received Activity#onDestroy() callback and Activity#mDestroyed is true)
key = 6a69a2a3-1d38-4d27-8c4c-cae915bea1b1
watchDurationMillis = 15093
retainedDurationMillis = 10089
METADATA
Build.VERSION.SDK_INT: 29
Build.MANUFACTURER: Google
LeakCanary version: 2.2
App process name: com.example.app
Analysis duration: 4326 ms```
解决方案
是的,这很可能是 Android 漏洞。不知道它是不是新的,但我以前没见过。你对自动填充有什么特别的吗?
您应该在 Android 错误跟踪器上报告它,最好使用示例项目来重现它。如果您不能轻松重现,至少提供指向堆转储的链接将有助于调查。
根据泄漏跟踪中涉及的名称,如果 ApplicationPackageManager 具有应用程序范围(因此没有泄漏),则 ContextImpl.mAutofillClient 持有活动引用的时间过长。
我还没有发现自动填充的任何最新变化可以解释这种泄漏。我们可以在 Activity 的源代码中看到,当一个 Activity 附加了它的基本上下文时,它会将自己设置为该基本上下文的自动填充客户端:https ://android.googlesource.com/platform/frameworks/base/+blame/ master/core/java/android/app/Activity.java#1124
它永远不会自行取消设置,因此要么这是错误,要么基础上下文应该与活动具有相同的范围。
我觉得奇怪的另一件事是static ApplicationPackageManager.mHasSystemFeatureCache
,这意味着 ApplicationPackageManager 有一个以 m 开头的静态字段(成员字段)。这是一个奇怪的名字,通常是在 android 源代码中不会发生的错误。事实上我找不到它:https ://android.googlesource.com/platform/frameworks/base/+blame/master/core/java/android/app/ApplicationPackageManager.java但也许他们没有分享更新来源呢?你在什么设备上使用这个?
推荐阅读
- python - $mount_container/usr/bin/python3 :没有这样的文件或目录(buildah)
- ios - 仅在 iOS 中加载几秒钟后 React Native APP 崩溃
- imap - 获取大于的 UIDS 时的 Imap 奇怪行为
- c# - 如何在 Dropbox 中添加子项
- android - Android Firebase:在嵌套数组数据中更新/添加记录
- python - 为什么要使用 model.add(conv2D) 两次
- python - 使用 ImageJ 运行带参数的 Python 脚本
- c - 如何比较二维字符串数组元素以找到重复的元素?
- python - Python 的多处理池完成后未释放内存
- flutter - Flutter 在 List 中查找 Widget