Add support for optimized resource shrinking flag in compiledump

Bug: b/380222890
Change-Id: Ibcc9a960d8a9856ac7328af62e4c6d7cd9561e63
diff --git a/src/main/java/com/android/tools/r8/R8Command.java b/src/main/java/com/android/tools/r8/R8Command.java
index 489f9e0..f2197c4 100644
--- a/src/main/java/com/android/tools/r8/R8Command.java
+++ b/src/main/java/com/android/tools/r8/R8Command.java
@@ -1526,6 +1526,11 @@
         .applyIf(
             featureSplitConfiguration != null,
             b -> b.setIsolatedSplits(featureSplitConfiguration.isIsolatedSplitsEnabled()))
+        .applyIf(
+            resourceShrinkerConfiguration != null,
+            b ->
+                b.setOptimizedResourceShrinking(
+                    resourceShrinkerConfiguration.isOptimizedShrinking()))
         .build();
   }
 
diff --git a/src/main/java/com/android/tools/r8/dump/DumpOptions.java b/src/main/java/com/android/tools/r8/dump/DumpOptions.java
index f2beb28..052a6de 100644
--- a/src/main/java/com/android/tools/r8/dump/DumpOptions.java
+++ b/src/main/java/com/android/tools/r8/dump/DumpOptions.java
@@ -47,6 +47,7 @@
   private static final String INTERMEDIATE_KEY = "intermediate";
   private static final String INCLUDE_DATA_RESOURCES_KEY = "include-data-resources";
   private static final String ISOLATED_SPLITS_KEY = "isolated-splits";
+  private static final String OPTIMIZED_RESOURCE_SHRINKING = "optimized-resource-shrinking";
   private static final String TREE_SHAKING_KEY = "tree-shaking";
   private static final String MINIFICATION_KEY = "minification";
   private static final String FORCE_PROGUARD_COMPATIBILITY_KEY = "force-proguard-compatibility";
@@ -66,6 +67,7 @@
   private final Optional<Boolean> intermediate;
   private final Optional<Boolean> includeDataResources;
   private final Optional<Boolean> isolatedSplits;
+  private final Optional<Boolean> optimizedResourceShrinking;
   private final Optional<Boolean> treeShaking;
   private final Optional<Boolean> minification;
   private final Optional<Boolean> forceProguardCompatibility;
@@ -113,7 +115,8 @@
       Map<String, String> systemProperties,
       boolean dumpInputToFile,
       String traceReferencesConsumer,
-      AndroidResourceProvider androidResourceProvider) {
+      AndroidResourceProvider androidResourceProvider,
+      Optional<Boolean> optimizedResourceShrinking) {
     this.backend = backend;
     this.tool = tool;
     this.compilationMode = compilationMode;
@@ -125,6 +128,7 @@
     this.intermediate = intermediate;
     this.includeDataResources = includeDataResources;
     this.isolatedSplits = isolatedSplits;
+    this.optimizedResourceShrinking = optimizedResourceShrinking;
     this.treeShaking = treeShaking;
     this.minification = minification;
     this.forceProguardCompatibility = forceProguardCompatibility;
@@ -173,9 +177,12 @@
       addOptionalDumpEntry(buildProperties, INTERMEDIATE_KEY, intermediate);
       addOptionalDumpEntry(buildProperties, INCLUDE_DATA_RESOURCES_KEY, includeDataResources);
       addOptionalDumpEntry(buildProperties, ISOLATED_SPLITS_KEY, isolatedSplits);
+      addOptionalDumpEntry(buildProperties, OPTIMIZED_RESOURCE_SHRINKING, isolatedSplits);
       addOptionalDumpEntry(buildProperties, TREE_SHAKING_KEY, treeShaking);
       addOptionalDumpEntry(
           buildProperties, FORCE_PROGUARD_COMPATIBILITY_KEY, forceProguardCompatibility);
+      addOptionalDumpEntry(
+          buildProperties, OPTIMIZED_RESOURCE_SHRINKING, optimizedResourceShrinking);
     } else {
       addDumpEntry(buildProperties, TRACE_REFERENCES_CONSUMER, traceReferencesConsumer);
     }
@@ -251,6 +258,9 @@
       case ISOLATED_SPLITS_KEY:
         builder.setIsolatedSplits(Boolean.parseBoolean(value));
         return;
+      case OPTIMIZED_RESOURCE_SHRINKING:
+        builder.setOptimizedResourceShrinking(Boolean.parseBoolean(value));
+        return;
       case TREE_SHAKING_KEY:
         builder.setTreeShaking(Boolean.parseBoolean(value));
         return;
@@ -391,6 +401,7 @@
     private Collection<ArtProfileProvider> artProfileProviders;
     private Collection<StartupProfileProvider> startupProfileProviders;
     private AndroidResourceProvider androidResourceProvider;
+    private Optional<Boolean> optimizedResourceShrinking = Optional.empty();
 
     private boolean enableMissingLibraryApiModeling = false;
     private boolean isAndroidPlatformBuild = false;
@@ -472,6 +483,10 @@
       return this;
     }
 
+    public void setOptimizedResourceShrinking(boolean optimizedResourceShrinking) {
+      this.optimizedResourceShrinking = Optional.of(optimizedResourceShrinking);
+    }
+
     public Builder setForceProguardCompatibility(boolean forceProguardCompatibility) {
       this.forceProguardCompatibility = Optional.of(forceProguardCompatibility);
       return this;
@@ -581,7 +596,8 @@
           systemProperties,
           dumpInputToFile,
           traceReferencesConsumer,
-          androidResourceProvider);
+          androidResourceProvider,
+          optimizedResourceShrinking);
     }
 
     public AndroidResourceProvider getAndroidResourceProvider() {
diff --git a/src/main/java/com/android/tools/r8/utils/CompileDumpCompatR8.java b/src/main/java/com/android/tools/r8/utils/CompileDumpCompatR8.java
index 3e484d4..ab542a4 100644
--- a/src/main/java/com/android/tools/r8/utils/CompileDumpCompatR8.java
+++ b/src/main/java/com/android/tools/r8/utils/CompileDumpCompatR8.java
@@ -49,6 +49,7 @@
           "--release",
           "--enable-missing-library-api-modeling",
           "--android-platform-build",
+          "--optimized-resource-shrinking",
           ISOLATED_SPLITS_FLAG);
 
   private static final List<String> VALID_OPTIONS_WITH_SINGLE_OPERAND =
@@ -120,6 +121,7 @@
     int threads = -1;
     BooleanBox enableMissingLibraryApiModeling = new BooleanBox(false);
     BooleanBox androidPlatformBuild = new BooleanBox(false);
+    BooleanBox optimizedResourceShrinking = new BooleanBox(false);
     BooleanBox isolatedSplits = new BooleanBox(false);
     for (int i = 0; i < args.length; i++) {
       String option = args[i];
@@ -151,6 +153,9 @@
           case "--android-platform-build":
             androidPlatformBuild.set(true);
             break;
+          case "--optimized-resource-shrinking":
+            optimizedResourceShrinking.set(true);
+            break;
           case ISOLATED_SPLITS_FLAG:
             isolatedSplits.set(true);
             break;
@@ -302,6 +307,11 @@
               ResourceShrinkerDumpUtils.setupBaseResourceShrinking(
                   finalAndroidResourcesInput, finalAndroidResourcesOutput, commandBuilder),
           "Failed initializing resource shrinker.");
+      runIgnoreMissing(
+          () ->
+              ResourceShrinkerDumpUtils.setOptimziedResourceShrinking(
+                  optimizedResourceShrinking.get(), commandBuilder),
+          "Failed setting optimized resource shrinking flag.");
     }
     if (desugaredLibKeepRuleConsumer != null) {
       commandBuilder.setDesugaredLibraryKeepRuleConsumer(desugaredLibKeepRuleConsumer);
diff --git a/src/main/java/com/android/tools/r8/utils/compiledump/ResourceShrinkerDumpUtils.java b/src/main/java/com/android/tools/r8/utils/compiledump/ResourceShrinkerDumpUtils.java
index 8ab1c93..c4964c1 100644
--- a/src/main/java/com/android/tools/r8/utils/compiledump/ResourceShrinkerDumpUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/compiledump/ResourceShrinkerDumpUtils.java
@@ -22,4 +22,8 @@
     builder.setAndroidResourceProvider(new ArchiveProtoAndroidResourceProvider(input));
     builder.setAndroidResourceConsumer(new ArchiveProtoAndroidResourceConsumer(output));
   }
+
+  public static void setOptimziedResourceShrinking(boolean value, R8Command.Builder builder) {
+    builder.setResourceShrinkerConfiguration(b -> b.enableOptimizedShrinkingWithR8().build());
+  }
 }
diff --git a/tools/compiledump.py b/tools/compiledump.py
index 43267ef..c27fcf8 100755
--- a/tools/compiledump.py
+++ b/tools/compiledump.py
@@ -150,6 +150,10 @@
                         help='Run as a platform build',
                         default=False,
                         action='store_true')
+    parser.add_argument('--optimized-resource-shrinking',
+                        help='Use optimized resource shrinking',
+                        default=False,
+                        action='store_true')
     parser.add_argument('--compilation-mode',
                         '--compilation_mode',
                         help='Run compilation in specified mode',
@@ -427,6 +431,10 @@
         return True
     return build_properties.get('android-platform-build') == 'true'
 
+def determine_optimized_resource_shrinking(args, build_properties):
+    if args.optimized_resource_shrinking:
+        return True
+    return build_properties.get('optimized-resource-shrinking') == 'true'
 
 def determine_enable_missing_library_api_modeling(args, build_properties):
     if args.enable_missing_library_api_modeling:
@@ -600,6 +608,8 @@
         classfile = determine_class_file(args, build_properties)
         android_platform_build = determine_android_platform_build(
             args, build_properties)
+        optimized_resource_shrinking = determine_optimized_resource_shrinking(
+            args, build_properties)
         enable_missing_library_api_modeling = determine_enable_missing_library_api_modeling(
             args, build_properties)
         mode = determine_compilation_mode(args, build_properties)
@@ -715,6 +725,8 @@
             cmd.extend(['--classfile'])
         if android_platform_build:
             cmd.extend(['--android-platform-build'])
+        if optimized_resource_shrinking:
+            cmd.extend(['--optimized-resource-shrinking'])
         if enable_missing_library_api_modeling:
             cmd.extend(['--enable-missing-library-api-modeling'])
         if args.threads: