From 06fcabde6a3625f4080ac6b71fce894948eee955 Mon Sep 17 00:00:00 2001 From: Jared Duke Date: Tue, 25 Jun 2024 16:13:59 +0000 Subject: Clean up reflection-related services keep rules Prefer using annotations (@UsesReflection + @UsedByReflection) for various classes that are instantiated via reflection in system server. The auto-generated keep rules are comparable to the existing ones, but are easier to maintain and more targeted. Test: m + diff services.jar for equivalent output Bug: 210510433 (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:5123eb381d98efcd93a8bd775e1107809efb1075) Merged-In: I306b4533f723ee7fafba1de12d7fe446544f8ce7 Change-Id: I306b4533f723ee7fafba1de12d7fe446544f8ce7 --- apex/jobscheduler/service/Android.bp | 1 + .../com/android/server/usage/AppStandbyController.java | 4 ++++ services/Android.bp | 1 + services/core/Android.bp | 1 + .../com/android/server/notification/RankingHelper.java | 12 +++++++++++- .../server/wallpaper/WallpaperManagerService.java | 10 ++++++++++ .../java/com/android/server/wm/DisplayAreaPolicy.java | 11 +++++++++++ services/proguard.flags | 16 ---------------- 8 files changed, 39 insertions(+), 17 deletions(-) diff --git a/apex/jobscheduler/service/Android.bp b/apex/jobscheduler/service/Android.bp index ace56d42ddd1..06c7d64d1708 100644 --- a/apex/jobscheduler/service/Android.bp +++ b/apex/jobscheduler/service/Android.bp @@ -24,6 +24,7 @@ java_library { "app-compat-annotations", "error_prone_annotations", "framework", + "keepanno-annotations", "services.core", "unsupportedappusage", ], diff --git a/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java b/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java index 19bc7160e16a..613678bedf8a 100644 --- a/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java +++ b/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java @@ -130,6 +130,8 @@ import com.android.server.AppSchedulingModuleThread; import com.android.server.LocalServices; import com.android.server.pm.pkg.AndroidPackage; import com.android.server.usage.AppIdleHistory.AppUsageHistory; +import com.android.tools.r8.keepanno.annotations.KeepItemKind; +import com.android.tools.r8.keepanno.annotations.UsedByReflection; import libcore.util.EmptyArray; @@ -588,6 +590,8 @@ public class AppStandbyController } } + // This constructor is reflectively invoked from framework code in AppStandbyInternal. + @UsedByReflection(kind = KeepItemKind.CLASS_AND_METHODS) public AppStandbyController(Context context) { this(new Injector(context, AppSchedulingModuleThread.get().getLooper())); } diff --git a/services/Android.bp b/services/Android.bp index 0fbbd16b1ed9..a0d345430a4a 100644 --- a/services/Android.bp +++ b/services/Android.bp @@ -239,6 +239,7 @@ java_library { libs: [ "android.hidl.manager-V1.0-java", "framework-tethering.stubs.module_lib", + "keepanno-annotations", "service-art.stubs.system_server", "service-permission.stubs.system_server", "service-rkp.stubs.system_server", diff --git a/services/core/Android.bp b/services/core/Android.bp index 7fb22500d295..6a3de4668fcc 100644 --- a/services/core/Android.bp +++ b/services/core/Android.bp @@ -182,6 +182,7 @@ java_library_static { "android.hardware.vibrator-V2-java", "app-compat-annotations", "framework-tethering.stubs.module_lib", + "keepanno-annotations", "service-art.stubs.system_server", "service-permission.stubs.system_server", "service-rkp.stubs.system_server", diff --git a/services/core/java/com/android/server/notification/RankingHelper.java b/services/core/java/com/android/server/notification/RankingHelper.java index 773d10b1f076..478868ba6a73 100644 --- a/services/core/java/com/android/server/notification/RankingHelper.java +++ b/services/core/java/com/android/server/notification/RankingHelper.java @@ -25,6 +25,10 @@ import android.util.ArrayMap; import android.util.Slog; import android.util.proto.ProtoOutputStream; +import com.android.tools.r8.keepanno.annotations.KeepItemKind; +import com.android.tools.r8.keepanno.annotations.KeepTarget; +import com.android.tools.r8.keepanno.annotations.UsesReflection; + import java.io.PrintWriter; import java.util.ArrayList; import java.util.Collections; @@ -41,7 +45,13 @@ public class RankingHelper { private final Context mContext; private final RankingHandler mRankingHandler; - + @UsesReflection( + value = { + @KeepTarget( + kind = KeepItemKind.CLASS_AND_MEMBERS, + instanceOfClassConstantExclusive = NotificationSignalExtractor.class, + methodName = "") + }) public RankingHelper(Context context, RankingHandler rankingHandler, RankingConfig config, ZenModeHelper zenHelper, NotificationUsageStats usageStats, String[] extractorNames) { mContext = context; diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java index 45ea2db3fde8..2f2512d6edca 100644 --- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java +++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java @@ -131,6 +131,9 @@ import com.android.server.utils.TimingsTraceAndSlog; import com.android.server.wallpaper.WallpaperData.BindSource; import com.android.server.wm.ActivityTaskManagerInternal; import com.android.server.wm.WindowManagerInternal; +import com.android.tools.r8.keepanno.annotations.KeepItemKind; +import com.android.tools.r8.keepanno.annotations.KeepTarget; +import com.android.tools.r8.keepanno.annotations.UsesReflection; import org.xmlpull.v1.XmlPullParserException; @@ -166,6 +169,13 @@ public class WallpaperManagerService extends IWallpaperManager.Stub } @Override + @UsesReflection( + value = { + @KeepTarget( + kind = KeepItemKind.CLASS_AND_MEMBERS, + instanceOfClassConstantExclusive = IWallpaperManagerService.class, + methodName = "") + }) public void onStart() { try { final Class klass = diff --git a/services/core/java/com/android/server/wm/DisplayAreaPolicy.java b/services/core/java/com/android/server/wm/DisplayAreaPolicy.java index c18377d76cb7..3a4d02f17efb 100644 --- a/services/core/java/com/android/server/wm/DisplayAreaPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayAreaPolicy.java @@ -40,6 +40,10 @@ import android.content.res.Resources; import android.os.Bundle; import android.text.TextUtils; +import com.android.tools.r8.keepanno.annotations.KeepItemKind; +import com.android.tools.r8.keepanno.annotations.KeepTarget; +import com.android.tools.r8.keepanno.annotations.UsesReflection; + import java.util.ArrayList; import java.util.List; @@ -179,6 +183,13 @@ public abstract class DisplayAreaPolicy { /** * Instantiates the device-specific {@link Provider}. */ + @UsesReflection( + value = { + @KeepTarget( + kind = KeepItemKind.CLASS_AND_MEMBERS, + instanceOfClassConstantExclusive = Provider.class, + methodName = "") + }) static Provider fromResources(Resources res) { String name = res.getString( com.android.internal.R.string.config_deviceSpecificDisplayAreaPolicyProvider); diff --git a/services/proguard.flags b/services/proguard.flags index a01e7dc16147..f84eff79bb15 100644 --- a/services/proguard.flags +++ b/services/proguard.flags @@ -33,12 +33,6 @@ -keep,allowoptimization,allowaccessmodification class * extends com.android.server.SystemService { public ; } --keep,allowoptimization,allowaccessmodification class * extends com.android.server.devicepolicy.BaseIDevicePolicyManager { - public (...); -} --keep,allowoptimization,allowaccessmodification class com.android.server.wallpaper.WallpaperManagerService { - public (...); -} # Accessed from com.android.compos APEX -keep,allowoptimization,allowaccessmodification class com.android.internal.art.ArtStatsLog { @@ -68,13 +62,6 @@ -keep public class android.hidl.manager.** { *; } -keep public class com.android.server.wm.WindowManagerInternal { *; } -# Notification extractors -# TODO(b/210510433): Revisit and consider generating from frameworks/base/core/res/res/values/config.xml. --keep,allowoptimization,allowaccessmodification public class com.android.server.notification.** implements com.android.server.notification.NotificationSignalExtractor - -# OEM provided DisplayAreaPolicy.Provider defined in frameworks/base/core/res/res/values/config.xml. --keep,allowoptimization,allowaccessmodification class com.android.server.wm.** implements com.android.server.wm.DisplayAreaPolicy$Provider - # JNI keep rules # The global keep rule for native methods allows stripping of such methods if they're unreferenced # in Java. However, because system_server explicitly registers these methods from native code, @@ -118,9 +105,6 @@ # Miscellaneous reflection keep rules # TODO(b/210510433): Revisit and fix with @Keep. --keep,allowoptimization,allowaccessmodification class com.android.server.usage.AppStandbyController { - public (...); -} -keep,allowoptimization,allowaccessmodification class android.hardware.usb.gadget.** { *; } # Needed when optimizations enabled -- cgit v1.2.3-59-g8ed1b