aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/test/java/com/google
diff options
context:
space:
mode:
authorGravatar kmb <kmb@google.com>2017-11-17 08:04:47 -0800
committerGravatar Copybara-Service <copybara-piper@google.com>2017-11-17 08:07:01 -0800
commit9a2d3fe37e96f56c9ef1e6844bded0eb9ffabef9 (patch)
tree68653dbe7c80239113ec674afcaa0e803d12bd8a /src/test/java/com/google
parenta9b5f8b646bb7bd2c34a3b2515fc8d97dfe02a6e (diff)
Support incremental dexing tools in proguarded Android builds
RELNOTES: None. PiperOrigin-RevId: 176109497
Diffstat (limited to 'src/test/java/com/google')
-rw-r--r--src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java1
-rw-r--r--src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java146
2 files changed, 146 insertions, 1 deletions
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 626bbdcceb..42a2684fcd 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
@@ -222,6 +222,7 @@ public final class BazelAnalysisMock extends AnalysisMock {
.add("sh_binary(name = 'resource_extractor', srcs = ['empty.sh'])")
.add("sh_binary(name = 'dexbuilder', srcs = ['empty.sh'])")
.add("sh_binary(name = 'dexmerger', srcs = ['empty.sh'])")
+ .add("sh_binary(name = 'dexsharder', srcs = ['empty.sh'])")
.add("sh_binary(name = 'busybox', srcs = ['empty.sh'])")
.add("sh_binary(name = 'rex_wrapper', srcs = ['empty.sh'])")
.add("android_library(name = 'incremental_stub_application')")
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 f94b033c8a..cb31bf76ec 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
@@ -191,7 +191,7 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase {
Artifact jarShard = artifactByPath(
ImmutableList.of(getCompressedUnsignedApk(getConfiguredTarget("//java/a:a"))),
- ".apk", "classes.dex.zip", "shard1.dex.zip", "shard1.jar");
+ ".apk", "classes.dex.zip", "shard1.dex.zip", "shard1.jar.dex.zip");
Iterable<Artifact> shardInputs = getGeneratingAction(jarShard).getInputs();
assertThat(getFirstArtifactEndingWith(shardInputs, ".txt")).isNull();
}
@@ -647,6 +647,150 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase {
}
@Test
+ public void testIncrementalDexingAfterProguard_unsharded() throws Exception {
+ useConfiguration("--experimental_incremental_dexing_after_proguard=1");
+ // Use "legacy" multidex mode so we get a main dex list file and can test that it's passed to
+ // the splitter action (similar to _withDexShards below), unlike without the dex splitter where
+ // the main dex list goes to the merging action.
+ scratch.file(
+ "java/com/google/android/BUILD",
+ "android_binary(",
+ " name = 'top',",
+ " srcs = ['foo.java', 'bar.srcjar'],",
+ " manifest = 'AndroidManifest.xml',",
+ " incremental_dexing = 1,",
+ " multidex = 'legacy',",
+ " dexopts = ['--minimal-main-dex', '--positions=none'],",
+ " proguard_specs = ['b.pro'],",
+ ")");
+
+ ConfiguredTarget topTarget = getConfiguredTarget("//java/com/google/android:top");
+ assertNoEvents();
+
+ SpawnAction shardAction =
+ getGeneratingSpawnAction(getBinArtifact("_dx/top/classes.dex.zip", topTarget));
+ assertThat(shardAction.getArguments()).contains("--main-dex-list");
+ assertThat(shardAction.getArguments()).contains("--minimal-main-dex");
+ assertThat(ActionsTestUtil.baseArtifactNames(getNonToolInputs(shardAction)))
+ .containsExactly("classes.jar", "main_dex_list.txt");
+
+ // --positions dexopt is supported after Proguard, even though not normally otherwise
+ assertThat(
+ findParamsFileAction(
+ getGeneratingSpawnAction(getBinArtifact("_dx/top/classes.jar", topTarget)))
+ .getContents())
+ .contains("--positions=none");
+ }
+
+ @Test
+ public void testIncrementalDexingAfterProguard_autoShardedMultidex() throws Exception {
+ useConfiguration("--experimental_incremental_dexing_after_proguard=3");
+ // Use "legacy" multidex mode so we get a main dex list file and can test that it's passed to
+ // the splitter action (similar to _withDexShards below), unlike without the dex splitter where
+ // the main dex list goes to the merging action.
+ scratch.file(
+ "java/com/google/android/BUILD",
+ "android_binary(",
+ " name = 'top',",
+ " srcs = ['foo.java', 'bar.srcjar'],",
+ " manifest = 'AndroidManifest.xml',",
+ " incremental_dexing = 1,",
+ " multidex = 'legacy',",
+ " dexopts = ['--minimal-main-dex', '--positions=none'],",
+ " proguard_specs = ['b.pro'],",
+ ")");
+
+ ConfiguredTarget topTarget = getConfiguredTarget("//java/com/google/android:top");
+ assertNoEvents();
+
+ SpawnAction splitAction =
+ getGeneratingSpawnAction(getBinArtifact("dexsplits/top", topTarget));
+ assertThat(splitAction.getArguments()).contains("--main-dex-list");
+ assertThat(splitAction.getArguments()).contains("--minimal-main-dex");
+ assertThat(ActionsTestUtil.baseArtifactNames(getNonToolInputs(splitAction)))
+ .containsExactly("shard1.jar.dex.zip", "shard2.jar.dex.zip", "shard3.jar.dex.zip",
+ "main_dex_list.txt");
+
+ SpawnAction shuffleAction =
+ getGeneratingSpawnAction(getBinArtifact("_dx/top/shard1.jar", topTarget));
+ assertThat(shuffleAction.getArguments()).doesNotContain("--main-dex-list");
+ assertThat(ActionsTestUtil.baseArtifactNames(getNonToolInputs(shuffleAction)))
+ .containsExactly("top_proguard.jar");
+
+ // --positions dexopt is supported after Proguard, even though not normally otherwise
+ assertThat(
+ findParamsFileAction(
+ getGeneratingSpawnAction(
+ getBinArtifact("_dx/top/shard3.jar.dex.zip", topTarget)))
+ .getContents())
+ .contains("--positions=none");
+ }
+
+ @Test
+ public void testIncrementalDexingAfterProguard_explicitDexShards() throws Exception {
+ useConfiguration("--experimental_incremental_dexing_after_proguard=2");
+ // Use "legacy" multidex mode so we get a main dex list file and can test that it's passed to
+ // the shardAction, not to the subsequent dexMerger action. Without dex_shards, main dex list
+ // file goes to the dexMerger instead (see _multidex test).
+ scratch.file(
+ "java/com/google/android/BUILD",
+ "android_binary(",
+ " name = 'top',",
+ " srcs = ['foo.java', 'bar.srcjar'],",
+ " manifest = 'AndroidManifest.xml',",
+ " dex_shards = 25,",
+ " incremental_dexing = 1,",
+ " multidex = 'legacy',",
+ " proguard_specs = ['b.pro'],",
+ ")");
+
+ ConfiguredTarget topTarget = getConfiguredTarget("//java/com/google/android:top");
+ assertNoEvents();
+ SpawnAction shardAction =
+ getGeneratingSpawnAction(getBinArtifact("_dx/top/shard25.jar", topTarget));
+ assertThat(shardAction.getArguments()).contains("--main_dex_filter");
+ assertThat(ActionsTestUtil.baseArtifactNames(getNonToolInputs(shardAction)))
+ .containsExactly("top_proguard.jar", "main_dex_list.txt");
+ SpawnAction mergeAction =
+ getGeneratingSpawnAction(getBinArtifact("_dx/top/shard1.jar.dex.zip", topTarget));
+ assertThat(mergeAction.getArguments()).doesNotContain("--main-dex-list");
+ assertThat(ActionsTestUtil.baseArtifactNames(getNonToolInputs(mergeAction)))
+ .containsExactly("shard1.jar", "shard1.jar.dex.zip-2.params");
+ }
+
+ @Test
+ public void testIncrementalDexingAfterProguard_autoShardedMonodex()
+ throws Exception {
+ useConfiguration("--experimental_incremental_dexing_after_proguard=3");
+ // Use "legacy" multidex mode so we get a main dex list file and can test that it's passed to
+ // the splitter action (similar to _withDexShards below), unlike without the dex splitter where
+ // the main dex list goes to the merging action.
+ scratch.file(
+ "java/com/google/android/BUILD",
+ "android_binary(",
+ " name = 'top',",
+ " srcs = ['foo.java', 'bar.srcjar'],",
+ " manifest = 'AndroidManifest.xml',",
+ " incremental_dexing = 1,",
+ " multidex = 'off',",
+ " proguard_specs = ['b.pro'],",
+ ")");
+
+ ConfiguredTarget topTarget = getConfiguredTarget("//java/com/google/android:top");
+ assertNoEvents();
+ SpawnAction mergeAction =
+ getGeneratingSpawnAction(getBinArtifact("_dx/top/classes.dex.zip", topTarget));
+ assertThat(mergeAction.getArguments()).doesNotContain("--main-dex-list");
+ assertThat(ActionsTestUtil.baseArtifactNames(getNonToolInputs(mergeAction)))
+ .containsExactly("shard1.jar.dex.zip", "shard2.jar.dex.zip", "shard3.jar.dex.zip");
+ SpawnAction shuffleAction =
+ getGeneratingSpawnAction(getBinArtifact("_dx/top/shard1.jar", topTarget));
+ assertThat(shuffleAction.getArguments()).doesNotContain("--main-dex-list");
+ assertThat(ActionsTestUtil.baseArtifactNames(getNonToolInputs(shuffleAction)))
+ .containsExactly("top_proguard.jar");
+ }
+
+ @Test
public void testV1SigningMethod() throws Exception {
actualSignerToolTests("v1", "true", "false");
}