Ensure weakly referenced callback fields are kept

Under certain conditions, R8 can optimize away write-only fields.
However, this isn't safe if the fields are implicitly used as strong
references that keep alive downstream weak references. Add a keep
rule to handle this for various callback field types. Follow-up work
will explore more general ways of avoiding undesirable optimizations
for similiar cases.

Change-Id: I5d21fad848eda7580fa150d03fd838d0b87b96a0
Test: m SystemUI + `dexdump SystemUI.apk | grep mCurrentUserTracker`
Bug: 264686688,234609147
This commit is contained in:
Jared Duke
2023-01-06 21:53:58 +00:00
parent 6651ac5100
commit 1b05e74010

View File

@@ -16,6 +16,18 @@
public <init>();
}
# Needed to ensure callback field references are kept in their respective
# owning classes when the downstream callback registrars only store weak refs.
# TODO(b/264686688): Handle these cases with more targeted annotations.
-keepclassmembers,allowaccessmodification class com.android.systemui.**, com.android.keyguard.** {
private com.android.keyguard.KeyguardUpdateMonitorCallback *;
private com.android.systemui.privacy.PrivacyItemController$Callback *;
private com.android.systemui.settings.UserTracker$Callback *;
private com.android.systemui.statusbar.phone.StatusBarWindowCallback *;
private com.android.systemui.util.service.Observer$Callback *;
private com.android.systemui.util.service.ObservableServiceConnection$Callback *;
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet);
}