From 76b100e3a9cc20313a49fd7c63c2de3ed4115cc9 Mon Sep 17 00:00:00 2001 From: asteinb Date: Wed, 18 Apr 2018 10:46:09 -0700 Subject: Wire up decoupled data processing for aar_import rule RELNOTES: none PiperOrigin-RevId: 193381165 --- .../build/lib/rules/android/AarImport.java | 51 ++++++++++++++-------- .../build/lib/rules/android/AndroidBinary.java | 2 +- .../lib/rules/android/AndroidLocalTestBase.java | 2 +- .../build/lib/rules/android/AndroidManifest.java | 4 +- .../build/lib/rules/android/AndroidResources.java | 4 ++ 5 files changed, 42 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java b/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java index 434531a670..9972335a77 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java @@ -88,29 +88,46 @@ public class AarImport implements RuleConfiguredTargetFactory { ruleContext.registerAction( createAarResourcesExtractorActions(ruleContext, aar, resources, assets)); - ApplicationManifest androidManifest = - ApplicationManifest.fromExplicitManifest(ruleContext, androidManifestArtifact); - - Artifact resourcesZip = - ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_RESOURCES_ZIP); - - ResourceApk resourceApk = - androidManifest.packAarWithDataAndResources( - ruleContext, - AndroidAssets.forAarImport(assets), - AndroidResources.forAarImport(resources), - ResourceDependencies.fromRuleDeps(ruleContext, JavaCommon.isNeverLink(ruleContext)), - ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_R_TXT), - ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_LOCAL_SYMBOLS), - ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_PROCESSED_MANIFEST), - resourcesZip); + final ResourceApk resourceApk; + if (AndroidResources.decoupleDataProcessing(ruleContext)) { + StampedAndroidManifest manifest = + AndroidManifest.forAarImport(ruleContext, androidManifestArtifact); + + boolean neverlink = JavaCommon.isNeverLink(ruleContext); + ValidatedAndroidResources validatedResources = + AndroidResources.forAarImport(resources).process(ruleContext, manifest, neverlink); + MergedAndroidAssets mergedAssets = + AndroidAssets.forAarImport(assets).process(ruleContext, neverlink); + + resourceApk = ResourceApk.of(validatedResources, mergedAssets); + } else { + ApplicationManifest androidManifest = + ApplicationManifest.fromExplicitManifest(ruleContext, androidManifestArtifact); + + Artifact resourcesZip = + ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_RESOURCES_ZIP); + + resourceApk = + androidManifest.packAarWithDataAndResources( + ruleContext, + AndroidAssets.forAarImport(assets), + AndroidResources.forAarImport(resources), + ResourceDependencies.fromRuleDeps(ruleContext, JavaCommon.isNeverLink(ruleContext)), + ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_R_TXT), + ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_LOCAL_SYMBOLS), + ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_PROCESSED_MANIFEST), + resourcesZip); + } // There isn't really any use case for building an aar_import target on its own, so the files to // build could be empty. The resources zip and merged jars are added here as a sanity check for // Bazel developers so that `bazel build java/com/my_aar_import` will fail if the resource // processing or jar merging steps fail. NestedSet filesToBuild = - NestedSetBuilder.stableOrder().add(resourcesZip).add(mergedJar).build(); + NestedSetBuilder.stableOrder() + .add(resourceApk.getValidatedResources().getMergedResources()) + .add(mergedJar) + .build(); Artifact nativeLibs = createAarArtifact(ruleContext, "native_libs.zip"); ruleContext.registerAction(createAarNativeLibsFilterActions(ruleContext, aar, nativeLibs)); 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 385aedfb1f..025bac06df 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 @@ -189,7 +189,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { final ApplicationManifest applicationManifest; final ResourceApk resourceApk; - if (AndroidCommon.getAndroidConfig(ruleContext).decoupleDataProcessing()) { + if (AndroidResources.decoupleDataProcessing(ruleContext)) { StampedAndroidManifest manifest = AndroidManifest.from(ruleContext, androidSemantics).mergeWithDeps(ruleContext); applicationManifest = diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java index ffab3d23fd..78dec89ede 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java @@ -88,7 +88,7 @@ public abstract class AndroidLocalTestBase implements RuleConfiguredTargetFactor final ResourceApk resourceApk; final Artifact unprocessedManifest; - if (AndroidCommon.getAndroidConfig(ruleContext).decoupleDataProcessing()) { + if (AndroidResources.decoupleDataProcessing(ruleContext)) { StampedAndroidManifest manifest = StampedAndroidManifest.from(ruleContext, androidSemantics).mergeWithDeps(ruleContext); unprocessedManifest = manifest.getManifest(); diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidManifest.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidManifest.java index e5bdcb873a..5cbb11ad57 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidManifest.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidManifest.java @@ -34,8 +34,8 @@ public class AndroidManifest { @Nullable private final String pkg; private final boolean exported; - public static AndroidManifest forAarImport(RuleContext ruleContext, Artifact manifest) { - return new AndroidManifest(manifest, /* pkg = */ null, /* exported = */ true); + public static StampedAndroidManifest forAarImport(RuleContext ruleContext, Artifact manifest) { + return new StampedAndroidManifest(manifest, /* pkg = */ null, /* exported = */ true); } /** diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResources.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResources.java index c30f6d9ad2..e48bf0d9ff 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResources.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResources.java @@ -99,6 +99,10 @@ public class AndroidResources { validateManifest(ruleContext); } + public static boolean decoupleDataProcessing(RuleContext ruleContext) { + return AndroidCommon.getAndroidConfig(ruleContext).decoupleDataProcessing(); + } + /** * Validates that there are no targets with resources in the srcs, as they should not be used with * the Android data logic. -- cgit v1.2.3