From 1afbac0775d277625a07e318d4eae4627b093225 Mon Sep 17 00:00:00 2001 From: corysmith Date: Thu, 20 Jul 2017 16:39:08 +0200 Subject: Allow the aapt2 code paths to be enabled by either flag or attribute. RELNOTES: None PiperOrigin-RevId: 162613289 --- .../build/lib/analysis/util/BuildViewTestCase.java | 8 +- .../build/lib/rules/android/AndroidBinaryTest.java | 136 +++++++++++++++++++++ .../lib/rules/android/AndroidLibraryTest.java | 83 +++++++++++++ 3 files changed, 226 insertions(+), 1 deletion(-) (limited to 'src/test/java/com') diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java index 20b779ccff..a95510a33c 100644 --- a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java +++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java @@ -1909,9 +1909,15 @@ public abstract class BuildViewTestCase extends FoundationTestCase { protected Artifact getImplicitOutputArtifact( ConfiguredTarget target, SafeImplicitOutputsFunction outputFunction) { + return getImplicitOutputArtifact(target, target.getConfiguration(), outputFunction); + } + + protected Artifact getImplicitOutputArtifact( + ConfiguredTarget target, + BuildConfiguration configuration, + SafeImplicitOutputsFunction outputFunction) { Rule associatedRule = target.getTarget().getAssociatedRule(); RepositoryName repository = associatedRule.getRepository(); - BuildConfiguration configuration = target.getConfiguration(); Root root; if (associatedRule.hasBinaryOutput()) { 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 a7c1a36c30..a64f633f2b 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 @@ -3050,4 +3050,140 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase { assertThat(getConfiguredTarget("//java/com/google/android/foo:foo")).isNotNull(); assertNoEvents(); } + + @Test + public void testAapt2WithoutAndroidSdk() throws Exception { + checkError( + "java/a", + "a", + "aapt2 processing requested but not available on the android_sdk", + "android_binary(", + " name = 'a',", + " srcs = ['A.java'],", + " manifest = 'AndroidManifest.xml',", + " resource_files = [ 'res/values/values.xml' ], ", + " aapt_version = 'aapt2'", + ")"); + } + + @Test + public void testAapt2FlagWithoutAndroidSdk() throws Exception { + useConfiguration("--android_aapt=aapt2"); + checkError( + "java/a", + "a", + "aapt2 processing requested but not available on the android_sdk", + "android_binary(", + " name = 'a',", + " srcs = ['A.java'],", + " manifest = 'AndroidManifest.xml',", + " resource_files = [ 'res/values/values.xml' ], ", + ")"); + } + + @Test + public void testAapt2WithAndroidSdk() throws Exception { + scratch.file( + "sdk/BUILD", + "android_sdk(", + " name = 'sdk',", + " aapt = 'aapt',", + " aapt2 = 'aapt2',", + " adb = 'adb',", + " aidl = 'aidl',", + " android_jar = 'android.jar',", + " annotations_jar = 'annotations_jar',", + " apksigner = 'apksigner',", + " dx = 'dx',", + " framework_aidl = 'framework_aidl',", + " main_dex_classes = 'main_dex_classes',", + " main_dex_list_creator = 'main_dex_list_creator',", + " proguard = 'proguard',", + " shrinked_android_jar = 'shrinked_android_jar',", + " zipalign = 'zipalign',", + " resource_extractor = 'resource_extractor')"); + + scratch.file( + "java/a/BUILD", + "android_binary(", + " name = 'a',", + " srcs = ['A.java'],", + " manifest = 'AndroidManifest.xml',", + " resource_files = [ 'res/values/values.xml' ], ", + " aapt_version = 'aapt2'", + ")"); + + useConfiguration("--android_sdk=//sdk:sdk"); + ConfiguredTarget a = getConfiguredTarget("//java/a:a"); + Artifact apk = getImplicitOutputArtifact(a, AndroidRuleClasses.ANDROID_RESOURCES_APK); + + SpawnAction apkAction = getGeneratingSpawnAction(apk); + assertThat(apkAction.getArguments()) + .containsAllOf("--aapt2", "sdk/aapt2", "--tool", "AAPT2_PACKAGE"); + } + + @Test + public void testAapt2WithAndroidSdkAndDependencies() throws Exception { + scratch.file( + "sdk/BUILD", + "android_sdk(", + " name = 'sdk',", + " aapt = 'aapt',", + " aapt2 = 'aapt2',", + " adb = 'adb',", + " aidl = 'aidl',", + " android_jar = 'android.jar',", + " annotations_jar = 'annotations_jar',", + " apksigner = 'apksigner',", + " dx = 'dx',", + " framework_aidl = 'framework_aidl',", + " main_dex_classes = 'main_dex_classes',", + " main_dex_list_creator = 'main_dex_list_creator',", + " proguard = 'proguard',", + " shrinked_android_jar = 'shrinked_android_jar',", + " zipalign = 'zipalign',", + " resource_extractor = 'resource_extractor')"); + + scratch.file( + "java/b/BUILD", + "android_library(", + " name = 'b',", + " srcs = ['B.java'],", + " manifest = 'AndroidManifest.xml',", + " resource_files = [ 'res/values/values.xml' ], ", + ")"); + + scratch.file( + "java/a/BUILD", + "android_binary(", + " name = 'a',", + " srcs = ['A.java'],", + " manifest = 'AndroidManifest.xml',", + " deps = [ '//java/b:b' ],", + " resource_files = [ 'res/values/values.xml' ], ", + " aapt_version = 'aapt2'", + ")"); + + useConfiguration("--android_sdk=//sdk:sdk"); + ConfiguredTarget a = getConfiguredTarget("//java/a:a"); + ConfiguredTarget b = getDirectPrerequisite(a, "//java/b:b"); + + Artifact classJar = + getImplicitOutputArtifact(a, AndroidRuleClasses.ANDROID_RESOURCES_CLASS_JAR); + Artifact rTxt = getImplicitOutputArtifact(a, AndroidRuleClasses.ANDROID_R_TXT); + Artifact apk = getImplicitOutputArtifact(a, AndroidRuleClasses.ANDROID_RESOURCES_APK); + + SpawnAction apkAction = getGeneratingSpawnAction(apk); + assertThat(apkAction.getArguments()) + .containsAllOf("--aapt2", "sdk/aapt2", "--tool", "AAPT2_PACKAGE"); + + assertThat(apkAction.getInputs()) + .contains( + getImplicitOutputArtifact(b, AndroidRuleClasses.ANDROID_RESOURCES_AAPT2_LIBRARY_APK)); + + SpawnAction classAction = getGeneratingSpawnAction(classJar); + assertThat(classAction.getInputs()) + .containsAllOf( + rTxt, getImplicitOutputArtifact(b, AndroidRuleClasses.ANDROID_RESOURCES_AAPT2_R_TXT)); + } } diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidLibraryTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidLibraryTest.java index b21353a1ce..ebdb4bbd08 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidLibraryTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidLibraryTest.java @@ -1489,4 +1489,87 @@ public class AndroidLibraryTest extends AndroidBuildViewTestCase { assertThat(javacAction.buildCommandLine()).doesNotContain("--testonly"); } + + @Test + public void aapt2ArtifactGenerationWhenSdkIsDefined() throws Exception { + scratch.file( + "sdk/BUILD", + "android_sdk(", + " name = 'sdk',", + " aapt = 'aapt',", + " aapt2 = 'aapt2',", + " adb = 'adb',", + " aidl = 'aidl',", + " android_jar = 'android.jar',", + " annotations_jar = 'annotations_jar',", + " apksigner = 'apksigner',", + " dx = 'dx',", + " framework_aidl = 'framework_aidl',", + " main_dex_classes = 'main_dex_classes',", + " main_dex_list_creator = 'main_dex_list_creator',", + " proguard = 'proguard',", + " shrinked_android_jar = 'shrinked_android_jar',", + " zipalign = 'zipalign',", + " resource_extractor = 'resource_extractor')"); + scratch.file( + "java/a/BUILD", + "android_library(", + " name = 'a', ", + " srcs = ['A.java'],", + " deps = [':b'],", + " manifest = 'a/AndroidManifest.xml',", + " resource_files = [ 'res/values/a.xml' ]", + ")", + "android_library(", + " name = 'b', ", + " srcs = ['B.java'],", + " manifest = 'b/AndroidManifest.xml',", + " resource_files = [ 'res/values/b.xml' ]", + ")"); + + useConfiguration("--android_sdk=//sdk:sdk"); + ConfiguredTarget a = getConfiguredTarget("//java/a:a"); + ConfiguredTarget b = getConfiguredTarget("//java/a:b"); + SpawnAction compileAction = + getGeneratingSpawnAction( + getImplicitOutputArtifact(a, AndroidRuleClasses.ANDROID_COMPILED_SYMBOLS)); + assertThat(compileAction).isNotNull(); + + SpawnAction linkAction = + getGeneratingSpawnAction( + getImplicitOutputArtifact(a, AndroidRuleClasses.ANDROID_RESOURCES_AAPT2_LIBRARY_APK)); + assertThat(linkAction).isNotNull(); + assertThat(linkAction.getInputs()) + .containsAllOf( + getImplicitOutputArtifact(a, AndroidRuleClasses.ANDROID_COMPILED_SYMBOLS), + getImplicitOutputArtifact( + b, a.getConfiguration(), AndroidRuleClasses.ANDROID_RESOURCES_AAPT2_LIBRARY_APK)); + assertThat(linkAction.getOutputs()) + .containsAllOf( + getImplicitOutputArtifact(a, AndroidRuleClasses.ANDROID_RESOURCES_AAPT2_R_TXT), + getImplicitOutputArtifact(a, AndroidRuleClasses.ANDROID_RESOURCES_AAPT2_SOURCE_JAR)); + } + + @Test + public void aapt2ArtifactGenerationSkippedWhenSdkIsNotDefined() throws Exception { + scratch.file( + "java/a/BUILD", + "android_library(", + " name = 'a', ", + " srcs = ['A.java'],", + " manifest = 'a/AndroidManifest.xml',", + " resource_files = [ 'res/values/a.xml' ]", + ")"); + + ConfiguredTarget a = getConfiguredTarget("//java/a:a"); + SpawnAction compileAction = + getGeneratingSpawnAction( + getImplicitOutputArtifact(a, AndroidRuleClasses.ANDROID_COMPILED_SYMBOLS)); + assertThat(compileAction).isNull(); + + SpawnAction linkAction = + getGeneratingSpawnAction( + getImplicitOutputArtifact(a, AndroidRuleClasses.ANDROID_RESOURCES_AAPT2_LIBRARY_APK)); + assertThat(linkAction).isNull(); + } } -- cgit v1.2.3