diff options
author | 2017-11-17 08:04:47 -0800 | |
---|---|---|
committer | 2017-11-17 08:07:01 -0800 | |
commit | 9a2d3fe37e96f56c9ef1e6844bded0eb9ffabef9 (patch) | |
tree | 68653dbe7c80239113ec674afcaa0e803d12bd8a /src/test/java/com/google | |
parent | a9b5f8b646bb7bd2c34a3b2515fc8d97dfe02a6e (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.java | 1 | ||||
-rw-r--r-- | src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java | 146 |
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"); } |