RELNOTES: None

PiperOrigin-RevId: 153545346
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 3cfa842..cece137 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
@@ -514,6 +514,14 @@
     )
     public boolean includeLibraryResourceJars;
 
+    @Option(name = "experimental_android_use_nocompress_extensions_on_apk",
+        defaultValue = "false",
+        optionUsageRestrictions = OptionUsageRestrictions.UNDOCUMENTED,
+        implicitRequirements = "--use_singlejar_apkbuilder",
+        help = "Use the value of nocompress_extensions attribute with the SingleJar "
+            + "--nocompress_suffixes flag when building the APK.")
+    public boolean useNocompressExtensionsOnApk;
+
     @Override
     public void addAllLabels(Multimap<String, Label> labelMap) {
       if (androidCrosstoolTop != null) {
@@ -599,6 +607,7 @@
   private final boolean useSingleJarForProguardLibraryJars;
   private final boolean compressJavaResources;
   private final boolean includeLibraryResourceJars;
+  private final boolean useNocompressExtensionsOnApk;
 
   AndroidConfiguration(Options options, Label androidSdk) throws InvalidConfigurationException {
     this.sdk = androidSdk;
@@ -631,6 +640,7 @@
     this.resourceFilter = options.resourceFilter;
     this.compressJavaResources = options.compressJavaResources;
     this.includeLibraryResourceJars = options.includeLibraryResourceJars;
+    this.useNocompressExtensionsOnApk = options.useNocompressExtensionsOnApk;
 
     if (!dexoptsSupportedInIncrementalDexing.contains("--no-locals")) {
       // TODO(bazel-team): Still needed? See DexArchiveAspect
@@ -747,6 +757,10 @@
     return includeLibraryResourceJars;
   }
 
+  boolean useNocompressExtensionsOnApk() {
+    return useNocompressExtensionsOnApk;
+  }
+
   @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 5ce97b1..96ed11b 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
@@ -13,6 +13,7 @@
 // limitations under the License.
 package com.google.devtools.build.lib.rules.android;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.analysis.RuleContext;
@@ -358,6 +359,18 @@
       }
     }
 
+    ImmutableList<String> noCompressExtensions =
+        ruleContext.getTokenizedStringListAttr("nocompress_extensions");
+    if (ruleContext.getFragment(AndroidConfiguration.class).useNocompressExtensionsOnApk()
+        && !noCompressExtensions.isEmpty()) {
+      compressedApkActionBuilder
+          .addArgument("--nocompress_suffixes")
+          .addArguments(noCompressExtensions);
+      singleJarActionBuilder
+          .addArgument("--nocompress_suffixes")
+          .addArguments(noCompressExtensions);
+    }
+
     ruleContext.registerAction(compressedApkActionBuilder.build(ruleContext));
     ruleContext.registerAction(singleJarActionBuilder.build(ruleContext));
   }
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java
index 6b366b4..d6f10dd 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java
@@ -2738,4 +2738,50 @@
     assertThat(action.getFileContents())
         .isEqualTo("//java/com/foo:flag1: on\n//java/com/foo:flag2: off");
   }
+
+  @Test
+  public void testNocompressExtensions() throws Exception {
+    scratch.file(
+        "java/r/android/BUILD",
+        "android_binary(",
+        "  name = 'r',",
+        "  srcs = ['Foo.java'],",
+        "  manifest = 'AndroidManifest.xml',",
+        "  resource_files = ['res/raw/foo.apk'],",
+        "  nocompress_extensions = ['.apk', '.so'],",
+        ")");
+    ConfiguredTarget binary = getConfiguredTarget("//java/r/android:r");
+    ResourceContainer resource = getResourceContainer(binary);
+    List<String> args = resourceArguments(resource);
+    Artifact inputManifest =
+        getFirstArtifactEndingWith(
+            getGeneratingSpawnAction(resource.getManifest()).getInputs(), "AndroidManifest.xml");
+    assertContainsSublist(
+        args,
+        ImmutableList.of(
+            "--primaryData", "java/r/android/res::" + inputManifest.getExecPathString()));
+    assertThat(args).contains("--uncompressedExtensions");
+    assertThat(args.get(args.indexOf("--uncompressedExtensions") + 1)).isEqualTo(".apk,.so");
+  }
+
+  @Test
+  public void testNocompressExtensions_useNocompressExtensionsOnApk() throws Exception {
+    scratch.file(
+        "java/r/android/BUILD",
+        "android_binary(",
+        "  name = 'r',",
+        "  srcs = ['Foo.java'],",
+        "  manifest = 'AndroidManifest.xml',",
+        "  resource_files = ['res/raw/foo.apk'],",
+        "  nocompress_extensions = ['.apk', '.so'],",
+        ")");
+    useConfiguration("--experimental_android_use_nocompress_extensions_on_apk");
+    ConfiguredTarget binary = getConfiguredTarget("//java/r/android:r");
+    assertThat(getCompressedUnsignedApkAction(binary).getArguments())
+        .containsAllOf("--nocompress_suffixes", ".apk", ".so")
+        .inOrder();
+    assertThat(getFinalUnsignedApkAction(binary).getArguments())
+        .containsAllOf("--nocompress_suffixes", ".apk", ".so")
+        .inOrder();
+  }
 }