summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Jared Duke <jdduke@google.com> 2023-01-06 21:53:58 +0000
committer Jared Duke <jdduke@google.com> 2023-01-09 09:18:46 -0800
commit1b05e74010108cdc7a5669bf4089788530a662cc (patch)
tree95ae1b80daa6546458cb6edb918630907233d9fa
parent6651ac510076c2d18131210ab5bca4b8010eef6c (diff)
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
-rw-r--r--packages/SystemUI/proguard.flags12
1 files changed, 12 insertions, 0 deletions
diff --git a/packages/SystemUI/proguard.flags b/packages/SystemUI/proguard.flags
index f96644fbd667..030eaa660c9f 100644
--- a/packages/SystemUI/proguard.flags
+++ b/packages/SystemUI/proguard.flags
@@ -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);
}