Fixed
Status Update
Comments
cu...@google.com <cu...@google.com>
ap...@google.com <ap...@google.com> #2
Project: platform/frameworks/support
Branch: androidx-main
commit c46d3e79b2ea8b839358f0215b0a432ef8fad7a2
Author: Clara Fok <clarafok@google.com>
Date: Fri Nov 04 15:23:25 2022
Convert androidx.activity.Cancellable to kotlin
Test: ./gradlew activity:activity:cC
Bug: 257291701
Change-Id: I057f3e54811e7399e40083ef5e3915adc4fa425d
M activity/activity/src/main/java/androidx/activity/Cancellable.kt
https://android-review.googlesource.com/2288554
Branch: androidx-main
commit c46d3e79b2ea8b839358f0215b0a432ef8fad7a2
Author: Clara Fok <clarafok@google.com>
Date: Fri Nov 04 15:23:25 2022
Convert androidx.activity.Cancellable to kotlin
Test: ./gradlew activity:activity:cC
Bug: 257291701
Change-Id: I057f3e54811e7399e40083ef5e3915adc4fa425d
M activity/activity/src/main/java/androidx/activity/Cancellable.kt
Description
While this version and 1.1.0-alpha01 solved many issues using ViewModels and LiveData, leaks are still happening.
In particular, the culprit seems to be FingerprintManager which holds a strong reference to the activity context.
Tested on BUILD INFO
STEPS TO REPRODUCE
NUMBER OF TIMES YOU WERE ABLE TO REPRODUCE - 10/10
Tracking the references to the context (LoginActivity) i found that FingerprintManager eventually receives the value through the BiometricManager.from(Context) method when BiometricManager.canAuthenticate(Int) is invoked, so i tried to use applicationContext to try and resolve the leak, but it happened anyway (file: LoginActivity.kt:190).
Eventually I found out that the possible cause may be the BiometricFragment class, specifically the BiometricFragment.authenticate(BiometricPromp.PromptInfo, BiometricPrompt.CryptoObject) method. The BiometricFragment instance uses the same method in the authenticate function, which gets the parent activity using getActivity() and then passes the value that will eventually reach FingerprintManager.
I don't believe there are any other places in the code where i pass an activity context, and I know that the value passed to create the BiometricPrompt object (file: LoginActivity.kt:195) is only used to get a BiometricViewModel instance and the FragmentActivity is never used again.
Leak results: