此泄漏可能是由 Android 11 DP2 引起的吗

Could this leak be caused by the 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 instance
│    Leaking: UNKNOWN
│    Anonymous subclass of android.app.PropertyInvalidatedCache
│    ↓ ApplicationPackageManager.mCache
│                                  ~~~~~~
├─ android.app.PropertyInvalidatedCache instance
│    Leaking: UNKNOWN
│    Anonymous subclass of java.util.LinkedHashMap
│    ↓ PropertyInvalidatedCache.tail
│                                 ~~~~
├─ java.util.LinkedHashMap$LinkedHashMapEntry instance
│    Leaking: UNKNOWN
│    ↓ LinkedHashMap$LinkedHashMapEntry.key
│                                       ~~~
├─ android.app.ApplicationPackageManager$HasSystemFeatureQuery instance
│    Leaking: UNKNOWN
│    ↓ ApplicationPackageManager$HasSystemFeatureQuery.this[=11=]
│                                                      ~~~~~~
├─ 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 错误跟踪器上报告它,最好使用示例项目来重现它。如果您无法轻松重现,至少向堆转储提供 link 将有助于调查。

根据泄漏跟踪中涉及的名称,如果 ApplicationPackageManager 具有应用程序范围(因此没有泄漏),则 ContextImpl.mAutofillClient 持有 activity 引用的时间过长。

字段定义在这里:https://android.googlesource.com/platform/frameworks/base/+blame/master/core/java/android/app/ContextImpl.java#235

我没有发现任何最近的自动填充更改可以解释此泄漏。我们可以在 Activity 的源代码中看到,当 activity 附加其基本上下文时,它会将自己设置为该基本上下文的自动填充客户端:https://android.googlesource.com/platform/frameworks/base/+blame/master/core/java/android/app/Activity.java#1124

它永远不会自行取消设置,所以要么是错误,要么基础上下文应该与 activity 具有相同的范围。

我觉得奇怪的另一件事是 static ApplicationPackageManager.mHasSystemFeatureCache,这意味着 ApplicationPackageManager 有一个以 m 开头的静态字段(成员字段)。这是一个奇怪的名字,通常是 android 来源中不会发生的错误。事实上我找不到它:https://android.googlesource.com/platform/frameworks/base/+blame/master/core/java/android/app/ApplicationPackageManager.java 但也许他们还没有共享更新的资源?您在什么设备上使用它?