Может ли эта утечка быть вызвана Android 11 DP2 - PullRequest
0 голосов
/ 25 марта 2020

Я использую Android 11 DP2 на Pixel 4 XL, и с тех пор я часто получаю эту утечку. Я подозреваю, что это вызвано предварительным просмотром разработчика, но я не совсем уверен.

Я пытался найти эту утечку в Интернете, но я не нашел ничего связанного.

Что делать ты думаешь?

┬───
│ 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```

1 Ответ

0 голосов
/ 26 марта 2020

Да, это, скорее всего, утечка Android. Понятия не имею, если это новое, но я не видел его раньше. Делаете ли вы что-то особенное с автозаполнением?

Вы должны сообщить об этом на баг-трекер Android, в идеале с примером проекта для его воспроизведения. Если вы не можете легко воспроизвести, по крайней мере, предоставление ссылки на дамп кучи поможет расследовать.

На основании имен, участвующих в утечке, если ApplicationPackageManager имеет область приложения (и, следовательно, не утечка), тогда ContextImpl.mAutofillClient слишком долго удерживает ссылку на действие.

Поле определено здесь: https://android.googlesource.com/platform/frameworks/base/+blame/master/core/java/android/app/ContextImpl.java#235

Я не нашел каких-либо недавних изменений в автозаполнение, которое объясняет эту утечку. Мы можем видеть в исходном коде Activity, что когда действие присоединяет свой базовый контекст, оно устанавливает себя в качестве клиента автозаполнения для этого базового контекста: https://android.googlesource.com/platform/frameworks/base/+blame/master/core/java/android/app/Activity.java#1124

Оно никогда не отменяет себя так что либо это ошибка, либо ожидается, что базовый контекст будет иметь ту же область действия, что и действие.

Еще одна вещь, которую я нахожу странной, это static ApplicationPackageManager.mHasSystemFeatureCache, что означает, что ApplicationPackageManager имеет заполненные поля c который начинается с m (поле члена). Это странное имя, обычно ошибка, которая не встречается в источниках android. И действительно, я не могу найти его: https://android.googlesource.com/platform/frameworks/base/+blame/master/core/java/android/app/ApplicationPackageManager.java но, возможно, они еще не поделились обновленными источниками? На каком устройстве вы используете это?

...