aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar ajmichael <ajmichael@google.com>2017-03-30 21:21:41 +0000
committerGravatar Philipp Wollermann <philwo@google.com>2017-03-31 17:11:50 +0200
commit354137f5af34c603334458bbabed4fca91b1d2ed (patch)
tree43dbeb24e4db0a9802035e530508a6dfe6e4f222
parent1fb90fd6112747c6e8bfa4943ba023225c47820f (diff)
Build android_binary APKs with Singlejar by default.
This will improve android_binary build times and allow Bazel to remove a dependency on our forked version of the deprecated ApkBuilderMain. RELNOTES: None PiperOrigin-RevId: 151749709
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java2
-rw-r--r--src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java47
-rw-r--r--src/test/java/com/google/devtools/build/lib/rules/android/AndroidBuildViewTestCase.java40
3 files changed, 62 insertions, 27 deletions
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 019fe5cac2..2cd2cee00f 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
@@ -403,7 +403,7 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment {
public ApkSigningMethod apkSigningMethod;
@Option(name = "use_singlejar_apkbuilder",
- defaultValue = "false",
+ defaultValue = "true",
category = "undocumented",
help = "Build Android APKs with SingleJar.")
public boolean useSingleJarApkBuilder;
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 5a941bcbfa..1da1347209 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
@@ -113,7 +113,7 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase {
" multidex = 'legacy',",
" main_dex_proguard_specs = ['a.spec'])");
- Artifact intermediateJar = artifactByPath(getFilesToBuild(ct),
+ Artifact intermediateJar = artifactByPath(ImmutableList.of(getCompressedUnsignedApk(ct)),
".apk", ".dex.zip", ".dex.zip", "main_dex_list.txt", "_intermediate.jar");
List<String> args = getGeneratingSpawnAction(intermediateJar).getArguments();
MoreAsserts.assertContainsSublist(args, "-include", "java/a/a.spec");
@@ -131,8 +131,9 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase {
"cc_library(name = 'cc',",
" srcs = ['cc.cc'])");
- Artifact jarShard = artifactByPath(getFilesToBuild(getConfiguredTarget("//java/a:a")),
- "a.apk", ".apk", ".apk", "classes.dex.zip", "shard1.dex.zip", "shard1.jar");
+ Artifact jarShard = artifactByPath(
+ ImmutableList.of(getCompressedUnsignedApk(getConfiguredTarget("//java/a:a"))),
+ ".apk", "classes.dex.zip", "shard1.dex.zip", "shard1.jar");
Iterable<Artifact> shardInputs = getGeneratingAction(jarShard).getInputs();
assertThat(getFirstArtifactEndingWith(shardInputs, ".txt")).isNull();
}
@@ -683,7 +684,7 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase {
Action jackDexAction =
getGeneratingAction(
artifactByPath(
- getFilesToBuild(topTarget), "top.apk", ".apk", ".apk", "classes.dex.zip"));
+ ImmutableList.of(getCompressedUnsignedApk(topTarget)), ".apk", "classes.dex.zip"));
Iterable<String> jackDexInputs = ActionsTestUtil.baseArtifactNames(jackDexAction.getInputs());
assertThat(jackDexInputs).containsAllOf("libtop.jack", "libdep.jack");
assertThat(jackDexInputs).doesNotContain("libneverlink.jack");
@@ -714,7 +715,7 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase {
Action jackDexAction =
getGeneratingAction(
artifactByPath(
- getFilesToBuild(topTarget), "top.apk", ".apk", ".apk", "classes.dex.zip"));
+ ImmutableList.of(getCompressedUnsignedApk(topTarget)), ".apk", "classes.dex.zip"));
Iterable<String> jackDexInputs = ActionsTestUtil.baseArtifactNames(jackDexAction.getInputs());
assertThat(jackDexInputs).containsAllOf("transitive.pro_valid", "direct.pro");
}
@@ -741,7 +742,7 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase {
Action jackDexAction =
getGeneratingAction(
artifactByPath(
- getFilesToBuild(topTarget), "top.apk", ".apk", ".apk", "classes.dex.zip"));
+ ImmutableList.of(getCompressedUnsignedApk(topTarget)), ".apk", "classes.dex.zip"));
Iterable<String> jackDexInputs = ActionsTestUtil.baseArtifactNames(jackDexAction.getInputs());
assertThat(jackDexInputs).doesNotContain("transitive.pro_valid");
}
@@ -793,8 +794,27 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase {
Set<Artifact> artifacts = actionsTestUtil().artifactClosureOf(getFilesToBuild(binary));
assertThat(getFirstArtifactEndingWith(artifacts, "signed_hello.apk")).isNull();
SpawnAction unsignedApkAction = (SpawnAction) actionsTestUtil()
- .getActionForArtifactEndingWith(artifacts, "hello_unsigned.apk");
- assertThat(unsignedApkAction.getCommandFilename()).endsWith("sdk/apkbuilder");
+ .getActionForArtifactEndingWith(artifacts, "/hello_unsigned.apk");
+ assertTrue(
+ Iterables.any(
+ unsignedApkAction.getInputs(),
+ new Predicate<Artifact>() {
+ @Override
+ public boolean apply(Artifact artifact) {
+ return artifact.getFilename().equals("SingleJar_deploy.jar");
+ }
+ }));
+ SpawnAction compressedUnsignedApkAction = (SpawnAction) actionsTestUtil()
+ .getActionForArtifactEndingWith(artifacts, "compressed_hello_unsigned.apk");
+ assertTrue(
+ Iterables.any(
+ compressedUnsignedApkAction.getInputs(),
+ new Predicate<Artifact>() {
+ @Override
+ public boolean apply(Artifact artifact) {
+ return artifact.getFilename().equals("SingleJar_deploy.jar");
+ }
+ }));
SpawnAction zipalignAction = (SpawnAction) actionsTestUtil()
.getActionForArtifactEndingWith(artifacts, "zipaligned_hello.apk");
assertThat(zipalignAction.getCommandFilename()).endsWith("sdk/zipalign");
@@ -1830,8 +1850,7 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase {
Set<Artifact> artifacts = actionsTestUtil().artifactClosureOf(getFilesToBuild(target));
Artifact shard1 = getFirstArtifactEndingWith(artifacts, "shard1.jar");
Artifact shard2 = getFirstArtifactEndingWith(artifacts, "shard2.jar");
- Artifact resourceJar = getFirstArtifactEndingWith(artifacts,
- "java_resources.jar");
+ Artifact resourceJar = getFirstArtifactEndingWith(artifacts, "/java_resources.jar");
expectedArguments.add("--output_jar");
expectedArguments.add(shard1.getExecPathString());
expectedArguments.add("--output_jar");
@@ -1881,7 +1900,7 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase {
// Verify that dex compilation is followed by the correct merge operation
Action apkAction = getGeneratingAction(getFirstArtifactEndingWith(
- getFilesToBuild(target), "a_unsigned.apk"));
+ actionsTestUtil().artifactClosureOf(getFilesToBuild(target)), "compressed_a_unsigned.apk"));
Action mergeAction = getGeneratingAction(getFirstArtifactEndingWith(
apkAction.getInputs(), "classes.dex.zip"));
Iterable<Artifact> dexShards = Iterables.filter(
@@ -2143,7 +2162,7 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase {
useConfiguration(
"--android_sdk=//sdk:sdk", "--experimental_android_use_singlejar_for_multidex");
ConfiguredTarget a = getConfiguredTarget("//java/a:a");
- Artifact intermediateJar = artifactByPath(getFilesToBuild(a),
+ Artifact intermediateJar = artifactByPath(ImmutableList.of(getCompressedUnsignedApk(a)),
".apk", ".dex.zip", ".dex.zip", "main_dex_list.txt", "_intermediate.jar");
List<String> args = getGeneratingSpawnAction(intermediateJar).getArguments();
assertContainsSublist(
@@ -2187,7 +2206,7 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase {
useConfiguration(
"--android_sdk=//sdk:sdk", "--experimental_android_use_singlejar_for_multidex");
ConfiguredTarget a = getConfiguredTarget("//java/a:a");
- Artifact intermediateJar = artifactByPath(getFilesToBuild(a),
+ Artifact intermediateJar = artifactByPath(ImmutableList.of(getCompressedUnsignedApk(a)),
".apk", ".dex.zip", ".dex.zip", "main_dex_list.txt", "_intermediate.jar");
List<String> args = getGeneratingSpawnAction(intermediateJar).getArguments();
assertEquals(-1,
@@ -2209,7 +2228,7 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase {
" manifest = 'AndroidManifest.xml',",
" multidex = 'legacy',)");
ConfiguredTarget a = getConfiguredTarget("//java/foo:abin");
- Artifact intermediateJar = artifactByPath(getFilesToBuild(a),
+ Artifact intermediateJar = artifactByPath(ImmutableList.of(getCompressedUnsignedApk(a)),
".apk", ".dex.zip", ".dex.zip", "main_dex_list.txt", "_intermediate.jar");
List<String> args = getGeneratingSpawnAction(intermediateJar).getArguments();
MoreAsserts.assertDoesNotContainSublist(
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBuildViewTestCase.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBuildViewTestCase.java
index 504ae5d835..fe53a86009 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBuildViewTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBuildViewTestCase.java
@@ -18,7 +18,6 @@ import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assertWithMessage;
import static com.google.devtools.build.lib.actions.util.ActionsTestUtil.getFirstArtifactEndingWith;
import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableList;
@@ -29,6 +28,7 @@ import com.google.devtools.build.lib.actions.Action;
import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
+import com.google.devtools.build.lib.analysis.FileProvider;
import com.google.devtools.build.lib.analysis.OutputFileConfiguredTarget;
import com.google.devtools.build.lib.analysis.actions.SpawnAction;
import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
@@ -46,10 +46,9 @@ import javax.annotation.Nullable;
/** Common methods shared between Android related {@link BuildViewTestCase}s. */
public abstract class AndroidBuildViewTestCase extends BuildViewTestCase {
protected Iterable<Artifact> getNativeLibrariesInApk(ConfiguredTarget target) {
- Action unsignedApkAction = actionsTestUtil().getActionForArtifactEndingWith(
- getFilesToBuild(target), "_unsigned.apk");
+ SpawnAction compressedUnsignedApkaction = getCompressedUnsignedApkAction(target);
ImmutableList.Builder<Artifact> result = ImmutableList.builder();
- for (Artifact output : unsignedApkAction.getInputs()) {
+ for (Artifact output : compressedUnsignedApkaction.getInputs()) {
if (!output.getExecPathString().endsWith(".so")) {
continue;
}
@@ -84,16 +83,33 @@ public abstract class AndroidBuildViewTestCase extends BuildViewTestCase {
return args.get(args.indexOf(flag) + 1);
}
+ /**
+ * The unsigned APK is created in two actions. The first action adds everything that needs to be
+ * unconditionally compressed in the APK. The second action adds everything else, preserving their
+ * compression.
+ */
+ protected Artifact getCompressedUnsignedApk(ConfiguredTarget target) {
+ return artifactByPath(
+ actionsTestUtil().artifactClosureOf(getFinalUnsignedApk(target)),
+ "_unsigned.apk",
+ "_unsigned.apk");
+ }
+
+ protected SpawnAction getCompressedUnsignedApkAction(ConfiguredTarget target) {
+ return getGeneratingSpawnAction(getCompressedUnsignedApk(target));
+ }
+
+ protected Artifact getFinalUnsignedApk(ConfiguredTarget target) {
+ return getFirstArtifactEndingWith(
+ target.getProvider(FileProvider.class).getFilesToBuild(), "_unsigned.apk");
+ }
+
protected Artifact getResourceApk(ConfiguredTarget target) {
- Action unsignedApkAction = getGeneratingAction(
- getFirstArtifactEndingWith(getFilesToBuild(target), "_unsigned.apk"));
- Artifact binaryApk =
- getFirstArtifactEndingWith(unsignedApkAction.getInputs(), ".apk");
Artifact resourceApk =
- getFirstArtifactEndingWith(unsignedApkAction.getInputs(), ".ap_");
- assertTrue((binaryApk == null && resourceApk != null)
- || (binaryApk != null && resourceApk == null));
- return binaryApk == null ? resourceApk : binaryApk;
+ getFirstArtifactEndingWith(
+ getGeneratingAction(getFinalUnsignedApk(target)).getInputs(), ".ap_");
+ assertThat(resourceApk).isNotNull();
+ return resourceApk;
}
protected void assertProguardUsed(ConfiguredTarget binary) {