aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java31
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java5
-rw-r--r--src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java3
-rw-r--r--src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java28
4 files changed, 66 insertions, 1 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java
index 96d4fb3e71..e6a1261d92 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java
@@ -1044,6 +1044,9 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
proguardedJar,
mainDexProguardSpec,
proguardOutputMap);
+ } else if (multidexMode == MultidexMode.MANUAL_MAIN_DEX) {
+ mainDexList =
+ transformDexListThroughProguardMapAction(ruleContext, proguardOutputMap, mainDexList);
}
Artifact classesDex = getDxArtifact(ruleContext, "classes.dex.zip");
@@ -1791,6 +1794,34 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
return mainDexList;
}
+ /** Transforms manual main_dex_list through proguard obfuscation map. */
+ static Artifact transformDexListThroughProguardMapAction(
+ RuleContext ruleContext, @Nullable Artifact proguardOutputMap, Artifact mainDexList)
+ throws InterruptedException {
+ if (proguardOutputMap == null
+ || !ruleContext.attributes().get("proguard_generate_mapping", Type.BOOLEAN)) {
+ return mainDexList;
+ }
+ Artifact obfuscatedMainDexList =
+ AndroidBinary.getDxArtifact(ruleContext, "main_dex_list_obfuscated.txt");
+ SpawnAction.Builder actionBuilder =
+ new SpawnAction.Builder()
+ .setMnemonic("MainDexProguardClasses")
+ .setProgressMessage("Obfuscating main dex classes list")
+ .setExecutable(ruleContext.getExecutablePrerequisite("$dex_list_obfuscator", Mode.HOST))
+ .addInput(mainDexList)
+ .addInput(proguardOutputMap)
+ .addOutput(obfuscatedMainDexList)
+ .addCommandLine(
+ CustomCommandLine.builder()
+ .addExecPath("--input", mainDexList)
+ .addExecPath("--output", obfuscatedMainDexList)
+ .addExecPath("--obfuscation_map", proguardOutputMap)
+ .build());
+ ruleContext.registerAction(actionBuilder.build(ruleContext));
+ return obfuscatedMainDexList;
+ }
+
public static Artifact createMainDexProguardSpec(Label label, ActionConstructionContext context) {
return ProguardHelper.getProguardConfigArtifact(label, context, "main_dex");
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java
index 1c5d0116eb..a9264b0c62 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java
@@ -944,6 +944,11 @@ public final class AndroidRuleClasses {
.add(attr("proguard_apply_dictionary", LABEL).legacyAllowAnyFileType())
.add(attr(":extra_proguard_specs", LABEL_LIST).value(JavaSemantics.EXTRA_PROGUARD_SPECS))
.add(
+ attr("$dex_list_obfuscator", LABEL)
+ .cfg(HostTransition.INSTANCE)
+ .exec()
+ .value(env.getToolsLabel("//tools/android:dex_list_obfuscator")))
+ .add(
attr(":bytecode_optimizers", LABEL_LIST)
.cfg(HostTransition.INSTANCE)
.value(JavaSemantics.BYTECODE_OPTIMIZERS))
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java b/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java
index af2220d0f6..3b7579909b 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java
@@ -272,7 +272,8 @@ public final class BazelAnalysisMock extends AnalysisMock {
.add("sh_binary(name = 'instrumentation_test_check', srcs = ['empty.sh'])")
.add("package_group(name = 'android_device_whitelist', packages = ['//...'])")
.add("package_group(name = 'export_deps_whitelist', packages = ['//...'])")
- .add("android_tools_defaults_jar(name = 'android_jar')");
+ .add("android_tools_defaults_jar(name = 'android_jar')")
+ .add("sh_binary(name = 'dex_list_obfuscator', srcs = ['empty.sh'])");
return androidBuildContents.build();
}
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 f894e4d32b..b073452b0e 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
@@ -180,6 +180,34 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase {
}
@Test
+ public void testMainDexListObfuscation() throws Exception {
+ useConfiguration("--noincremental_dexing");
+ scratch.file("/java/a/list.txt");
+ ConfiguredTarget ct =
+ scratchConfiguredTarget(
+ "java/a",
+ "a",
+ "android_binary(",
+ " name = 'a',",
+ " srcs = ['A.java'],",
+ " manifest = 'AndroidManifest.xml',",
+ " multidex = 'manual_main_dex',",
+ " proguard_generate_mapping = 1,",
+ " main_dex_list = 'list.txt')");
+
+ Artifact obfuscatedDexList =
+ artifactByPath(
+ ImmutableList.of(getCompressedUnsignedApk(ct)),
+ ".apk",
+ ".dex.zip",
+ ".dex.zip",
+ "main_dex_list_obfuscated.txt");
+ List<String> args = getGeneratingSpawnActionArgs(obfuscatedDexList);
+ assertThat(args.get(0)).contains("dex_list_obfuscator");
+ MoreAsserts.assertContainsSublist(args, "--input", "java/a/list.txt");
+ }
+
+ @Test
public void testNonLegacyNativeDepsDoesNotPolluteDexSharding() throws Exception {
scratch.file("java/a/BUILD",
"android_binary(name = 'a',",