aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Adam Michael <ajmichael@google.com>2016-10-25 14:35:33 +0000
committerGravatar John Cater <jcater@google.com>2016-10-25 20:18:42 +0000
commit5d038c0cd12653fbb666367049a33e079d7921e3 (patch)
tree4f97b1fccac5bc8fb115fea0cbbd7f080a766161 /src
parent81aede1f9bdddfe0e2327d6cf0ba9bd40fd62718 (diff)
Multidex uses singlejar instead of zip.
To roll this out safely, this is hidden behind a flag: --experimental_android_use_singlejar_for_multidex See https://github.com/bazelbuild/bazel/issues/1936 -- MOS_MIGRATED_REVID=137155214
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java58
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java12
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);