Tune R8 shrinking defaults for system_server

Disable R8 shrinking by default if there are additional
SYSTEM_SERVER_JARS that may be downstream from services.jar, or if
the jar ordering is unreliable.

The longer term solution will be to feed R8 the SYSTEM_SERVER_JARS
explicitly during the shrinking phase, but for now this avoids
potential issues with such dowstream jars. Note that specific
products or targets can still opt-in explicitly even if there may be
ordering issues in SYSTEM_SERVER_JARS.

Bug: 240588226,235484969
Test: m + lunch various Arc/Wear/Auto targets
Change-Id: I1d824e1e61de65604123b65b25b192a8a32fd0c1
diff --git a/core/android_soong_config_vars.mk b/core/android_soong_config_vars.mk
index 6e52195..022c3ed 100644
--- a/core/android_soong_config_vars.mk
+++ b/core/android_soong_config_vars.mk
@@ -97,7 +97,20 @@
 # TODO(b/203088572): Remove when Java optimizations enabled by default for
 # SystemUI.
 $(call add_soong_config_var,ANDROID,SYSTEMUI_OPTIMIZE_JAVA)
-# Enable by default unless explicitly set or overridden.
-# See frameworks/base/services/Android.bp for additional notes on side effects.
-SYSTEM_OPTIMIZE_JAVA ?= true
+
+# Enable system_server optimizations by default unless explicitly set or if
+# there may be dependent runtime jars.
+# TODO(b/240588226): Remove the off-by-default exceptions after handling
+# system_server jars automatically w/ R8.
+ifeq (true,$(PRODUCT_BROKEN_SUBOPTIMAL_ORDER_OF_SYSTEM_SERVER_JARS))
+  # If system_server jar ordering is broken, don't assume services.jar can be
+  # safely optimized in isolation, as there may be dependent jars.
+  SYSTEM_OPTIMIZE_JAVA ?= false
+else ifneq (platform:services,$(lastword $(PRODUCT_SYSTEM_SERVER_JARS)))
+  # If services is not the final jar in the dependency ordering, don't assume
+  # it can be safely optimized in isolation, as there may be dependent jars.
+  SYSTEM_OPTIMIZE_JAVA ?= false
+else
+  SYSTEM_OPTIMIZE_JAVA ?= true
+endif
 $(call add_soong_config_var,ANDROID,SYSTEM_OPTIMIZE_JAVA)