diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java | 58 | ||||
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java | 12 |
2 files changed, 58 insertions, 12 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 21984932a9..d207aa89a9 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 @@ -64,9 +64,12 @@ import com.google.devtools.build.lib.rules.java.JavaCommon; import com.google.devtools.build.lib.rules.java.JavaCompilationArgsProvider; import com.google.devtools.build.lib.rules.java.JavaConfiguration; import com.google.devtools.build.lib.rules.java.JavaConfiguration.JavaOptimizationMode; +import com.google.devtools.build.lib.rules.java.JavaHelper; import com.google.devtools.build.lib.rules.java.JavaSemantics; import com.google.devtools.build.lib.rules.java.JavaSourceInfoProvider; import com.google.devtools.build.lib.rules.java.JavaTargetAttributes; +import com.google.devtools.build.lib.rules.java.JavaToolchainProvider; +import com.google.devtools.build.lib.rules.java.Jvm; import com.google.devtools.build.lib.rules.java.ProguardHelper; import com.google.devtools.build.lib.rules.java.ProguardHelper.ProguardOutput; import com.google.devtools.build.lib.syntax.Type; @@ -1500,24 +1503,55 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { return javaResourceJar; } + // Adds the appropriate SpawnAction options depending on if SingleJar is a jar or not. + private static SpawnAction.Builder singleJarSpawnActionBuilder(RuleContext ruleContext) { + Artifact singleJar = JavaToolchainProvider.fromRuleContext(ruleContext).getSingleJar(); + SpawnAction.Builder builder = new SpawnAction.Builder(); + if (singleJar.getFilename().endsWith(".jar")) { + builder + .setJarExecutable( + ruleContext.getHostConfiguration().getFragment(Jvm.class).getJavaExecutable(), + singleJar, + JavaToolchainProvider.fromRuleContext(ruleContext).getJvmOptions()) + .addTransitiveInputs(JavaHelper.getHostJavabaseInputs(ruleContext)); + } else { + builder.setExecutable(singleJar); + } + return builder; + } + /** * Creates an action that copies a .zip file to a specified path, filtering all non-.dex files * out of the output. */ static void createCleanDexZipAction(RuleContext ruleContext, Artifact inputZip, Artifact outputZip) { - ruleContext.registerAction(new SpawnAction.Builder() - .setExecutable(ruleContext.getExecutablePrerequisite("$zip", Mode.HOST)) - .addInput(inputZip) - .addOutput(outputZip) - .addArgument(inputZip.getExecPathString()) - .addArgument("--out") - .addArgument(outputZip.getExecPathString()) - .addArgument("--copy") - .addArgument("classes*.dex") - .setProgressMessage("Trimming " + inputZip.getExecPath().getBaseName()) - .setMnemonic("TrimDexZip") - .build(ruleContext)); + if (ruleContext.getFragment(AndroidConfiguration.class).useSingleJarForMultidex()) { + ruleContext.registerAction(singleJarSpawnActionBuilder(ruleContext) + .addArgument("--exclude_build_data") + .addArgument("--sources") + .addInputArgument(inputZip) + .addArgument("--output") + .addOutputArgument(outputZip) + .addArgument("--include_prefixes") + .addArgument("classes") + .setProgressMessage("Trimming " + inputZip.getExecPath().getBaseName()) + .setMnemonic("TrimDexZip") + .build(ruleContext)); + } else { + ruleContext.registerAction(new SpawnAction.Builder() + .setExecutable(ruleContext.getExecutablePrerequisite("$zip", Mode.HOST)) + .addInput(inputZip) + .addOutput(outputZip) + .addArgument(inputZip.getExecPathString()) + .addArgument("--out") + .addArgument(outputZip.getExecPathString()) + .addArgument("--copy") + .addArgument("classes*.dex") + .setProgressMessage("Trimming " + inputZip.getExecPath().getBaseName()) + .setMnemonic("TrimDexZip") + .build(ruleContext)); + } } /** 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 dc11d1f37b..c9b0f4f6de 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 @@ -436,6 +436,12 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment { help = "Build Android APKs with SingleJar.") public boolean useSingleJarApkBuilder; + @Option(name = "experimental_android_use_singlejar_for_multidex", + defaultValue = "false", + category = "undocumented", + help = "Use SingleJar for multidex dex extraction.") + public boolean useSingleJarForMultidex; + @Override public void addAllLabels(Multimap<String, Label> labelMap) { if (androidCrosstoolTop != null) { @@ -513,6 +519,7 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment { private final AndroidManifestMerger manifestMerger; private final ApkSigningMethod apkSigningMethod; private final boolean useSingleJarApkBuilder; + private final boolean useSingleJarForMultidex; AndroidConfiguration(Options options, Label androidSdk) { this.sdk = androidSdk; @@ -538,6 +545,7 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment { this.manifestMerger = options.manifestMerger; this.apkSigningMethod = options.apkSigningMethod; this.useSingleJarApkBuilder = options.useSingleJarApkBuilder; + this.useSingleJarForMultidex = options.useSingleJarForMultidex; this.useRexToCompressDexFiles = options.useRexToCompressDexFiles; } @@ -627,6 +635,10 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment { return useSingleJarApkBuilder; } + public boolean useSingleJarForMultidex() { + return useSingleJarForMultidex; + } + @Override public void addGlobalMakeVariables(ImmutableMap.Builder<String, String> globalMakeEnvBuilder) { globalMakeEnvBuilder.put("ANDROID_CPU", cpu); |