Add flag to compress all Java resources before bundling them into the APK.

RELNOTES: Add --experimental_android_compress_java_resources flag to store java
resources as compressed inside the APK.

PiperOrigin-RevId: 151825809
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java
index 2cd2cee..1f45101 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java
@@ -438,6 +438,13 @@
         help = "Use SingleJar to combine all ProGuard library jars.")
     public boolean useSingleJarForProguardLibraryJars;
 
+    @Option(name = "experimental_android_compress_java_resources",
+        defaultValue = "false",
+        category = "undocumented",
+        implicitRequirements = "--use_singlejar_apkbuilder",
+        help = "Compress Java resources in APKs")
+    public boolean compressJavaResources;
+
     @Override
     public void addAllLabels(Multimap<String, Label> labelMap) {
       if (androidCrosstoolTop != null) {
@@ -521,6 +528,7 @@
   private final boolean useSingleJarForMultidex;
   private final ResourceFilter resourceFilter;
   private final boolean useSingleJarForProguardLibraryJars;
+  private final boolean compressJavaResources;
 
   AndroidConfiguration(Options options, Label androidSdk) {
     this.sdk = androidSdk;
@@ -552,6 +560,7 @@
     this.useSingleJarForProguardLibraryJars = options.useSingleJarForProguardLibraryJars;
     this.useRexToCompressDexFiles = options.useRexToCompressDexFiles;
     this.resourceFilter = options.resourceFilter;
+    this.compressJavaResources = options.compressJavaResources;
   }
 
   public String getCpu() {
@@ -663,6 +672,10 @@
     return useSingleJarForProguardLibraryJars;
   }
 
+  boolean compressJavaResources() {
+    return compressJavaResources;
+  }
+
   @Override
   public void addGlobalMakeVariables(ImmutableMap.Builder<String, String> globalMakeEnvBuilder) {
     globalMakeEnvBuilder.put("ANDROID_CPU", cpu);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ApkActionsBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/ApkActionsBuilder.java
index c552a5f..5ce97b1 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/ApkActionsBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/ApkActionsBuilder.java
@@ -298,8 +298,6 @@
       }
     }
 
-    ruleContext.registerAction(compressedApkActionBuilder.build(ruleContext));
-
     SpawnAction.Builder singleJarActionBuilder = new SpawnAction.Builder()
         .setMnemonic("ApkBuilder")
         .setProgressMessage(message)
@@ -325,9 +323,15 @@
           .addOutputArgument(extractedJavaResourceZip)
           .build(ruleContext));
 
-      singleJarActionBuilder
-          .addArgument("--sources")
-          .addInputArgument(extractedJavaResourceZip);
+      if (ruleContext.getFragment(AndroidConfiguration.class).compressJavaResources()) {
+        compressedApkActionBuilder
+            .addArgument("--sources")
+            .addInputArgument(extractedJavaResourceZip);
+      } else {
+        singleJarActionBuilder
+            .addArgument("--sources")
+            .addInputArgument(extractedJavaResourceZip);
+      }
     }
 
     if (nativeLibs.getName() != null) {
@@ -354,6 +358,7 @@
       }
     }
 
+    ruleContext.registerAction(compressedApkActionBuilder.build(ruleContext));
     ruleContext.registerAction(singleJarActionBuilder.build(ruleContext));
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBuildViewTestCase.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBuildViewTestCase.java
index fe53a86..2811cb6 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBuildViewTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBuildViewTestCase.java
@@ -104,6 +104,10 @@
         target.getProvider(FileProvider.class).getFilesToBuild(), "_unsigned.apk");
   }
 
+  protected SpawnAction getFinalUnsignedApkAction(ConfiguredTarget target) {
+    return getGeneratingSpawnAction(getFinalUnsignedApk(target));
+  }
+
   protected Artifact getResourceApk(ConfiguredTarget target) {
     Artifact resourceApk =
         getFirstArtifactEndingWith(