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();
+ }
}