diff options
Diffstat (limited to 'src')
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',", |