diff options
author | 2017-07-20 16:39:08 +0200 | |
---|---|---|
committer | 2017-07-21 09:11:59 +0200 | |
commit | 1afbac0775d277625a07e318d4eae4627b093225 (patch) | |
tree | 3e8659e3d33128026989847d7074eebf2620ff15 /src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java | |
parent | 79816f6cd178eaeb665fac21f5c6b60f7c52483c (diff) |
Allow the aapt2 code paths to be enabled by either flag or attribute.
RELNOTES: None
PiperOrigin-RevId: 162613289
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java | 93 |
1 files changed, 63 insertions, 30 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java b/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java index 36ef672877..0fea1e2567 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java @@ -46,13 +46,15 @@ import javax.annotation.Nullable; /** Represents a AndroidManifest, that may have been merged from dependencies. */ public final class ApplicationManifest { - public static ApplicationManifest fromResourcesRule(RuleContext ruleContext) { + + public static ApplicationManifest fromResourcesRule(RuleContext ruleContext) + throws RuleErrorException { final AndroidResourcesProvider resources = AndroidCommon.getAndroidResources(ruleContext); if (resources == null) { ruleContext.attributeError("manifest", "a resources or manifest attribute is mandatory."); return null; } - return new ApplicationManifest( + return fromExplicitManifest( ruleContext, Iterables.getOnlyElement(resources.getDirectAndroidResources()).getManifest()); } @@ -82,7 +84,7 @@ public final class ApplicationManifest { } ruleContext.registerAction(builder.build(ruleContext)); - return new ApplicationManifest(ruleContext, result); + return new ApplicationManifest(ruleContext, result, targetAaptVersion); } public ApplicationManifest addMobileInstallStubApplication(RuleContext ruleContext) @@ -112,7 +114,7 @@ public final class ApplicationManifest { ruleContext.registerAction(builder.build(ruleContext)); - return new ApplicationManifest(ruleContext, stubManifest); + return new ApplicationManifest(ruleContext, stubManifest, targetAaptVersion); } public ApplicationManifest addInstantRunStubApplication(RuleContext ruleContext) @@ -133,28 +135,30 @@ public final class ApplicationManifest { ruleContext.registerAction(builder.build(ruleContext)); - return new ApplicationManifest(ruleContext, stubManifest); + return new ApplicationManifest(ruleContext, stubManifest, targetAaptVersion); } - public static ApplicationManifest fromRule(RuleContext ruleContext) { - return new ApplicationManifest( + public static ApplicationManifest fromRule(RuleContext ruleContext) throws RuleErrorException { + return fromExplicitManifest( ruleContext, ruleContext.getPrerequisiteArtifact("manifest", Mode.TARGET)); } - public static ApplicationManifest fromExplicitManifest( - RuleContext ruleContext, Artifact manifest) { - return new ApplicationManifest(ruleContext, manifest); + public static ApplicationManifest fromExplicitManifest(RuleContext ruleContext, Artifact manifest) + throws RuleErrorException { + return new ApplicationManifest( + ruleContext, manifest, AndroidAaptVersion.chooseTargetAaptVersion(ruleContext)); } /** * Generates an empty manifest for a rule that does not directly specify resources. * - * <p><strong>Note:</strong> This generated manifest can then be used as the primary manifest - * when merging with dependencies. + * <p><strong>Note:</strong> This generated manifest can then be used as the primary manifest when + * merging with dependencies. * * @return the generated ApplicationManifest */ - public static ApplicationManifest generatedManifest(RuleContext ruleContext) { + public static ApplicationManifest generatedManifest(RuleContext ruleContext) + throws RuleErrorException { Artifact generatedManifest = ruleContext.getUniqueDirectoryArtifact( ruleContext.getRule().getName() + "_generated", PathFragment.create("AndroidManifest.xml"), ruleContext.getBinOrGenfilesDirectory()); @@ -172,7 +176,7 @@ public final class ApplicationManifest { .registerAction( FileWriteAction.create( ruleContext, generatedManifest, contents, /*makeExecutable=*/ false)); - return new ApplicationManifest(ruleContext, generatedManifest); + return fromExplicitManifest(ruleContext, generatedManifest); } private static ImmutableMap<String, String> getManifestValues(RuleContext context) { @@ -200,10 +204,13 @@ public final class ApplicationManifest { private final Artifact manifest; private final ImmutableMap<String, String> manifestValues; + private final AndroidAaptVersion targetAaptVersion; - private ApplicationManifest(RuleContext ruleContext, Artifact manifest) { + private ApplicationManifest( + RuleContext ruleContext, Artifact manifest, AndroidAaptVersion targetAaptVersion) { this.manifest = manifest; this.manifestValues = getManifestValues(ruleContext); + this.targetAaptVersion = targetAaptVersion; } public ApplicationManifest mergeWith(RuleContext ruleContext, ResourceDependencies resourceDeps) { @@ -222,7 +229,7 @@ public final class ApplicationManifest { ruleContext.getBinOrGenfilesDirectory()); AndroidManifestMergeHelper.createMergeManifestAction(ruleContext, getManifest(), mergeeManifests.keySet(), ImmutableList.of("all"), outputManifest); - return new ApplicationManifest(ruleContext, outputManifest); + return new ApplicationManifest(ruleContext, outputManifest, targetAaptVersion); } } else { if (!mergeeManifests.isEmpty() || !manifestValues.isEmpty()) { @@ -241,7 +248,7 @@ public final class ApplicationManifest { .setManifestOutput(outputManifest) .setLogOut(mergeLog) .build(ruleContext); - return new ApplicationManifest(ruleContext, outputManifest); + return new ApplicationManifest(ruleContext, outputManifest, targetAaptVersion); } } return this; @@ -292,7 +299,7 @@ public final class ApplicationManifest { .setCustomPackage(customPackage) .setManifestOutput(outputManifest) .build(ruleContext); - return new ApplicationManifest(ruleContext, outputManifest); + return new ApplicationManifest(ruleContext, outputManifest, targetAaptVersion); } /** Packages up the manifest with assets from the rule and dependent resources. */ @@ -345,14 +352,15 @@ public final class ApplicationManifest { if (ruleContext.hasErrors()) { return null; } - ResourceContainer.Builder resourceContainer = + ResourceContainer.Builder builder = ResourceContainer.builderFromRule(ruleContext) .setRTxt(rTxt) .setSymbols(symbols) .setJavaPackageFrom(JavaPackageSource.MANIFEST); if (alwaysExportManifest) { - resourceContainer.setManifestExported(true); + builder.setManifestExported(true); } + return createApk( ruleContext, true, /* isLibrary */ @@ -360,7 +368,7 @@ public final class ApplicationManifest { ImmutableList.<String>of(), /* List<String> uncompressedExtensions */ false, /* crunchPng */ false, /* incremental */ - resourceContainer, + builder, data, null, /* Artifact proguardCfg */ null, /* Artifact mainDexProguardCfg */ @@ -418,7 +426,8 @@ public final class ApplicationManifest { RuleContext ruleContext, Artifact resourceApk, ResourceDependencies resourceDeps, - Artifact rTxt, + @Nullable Artifact rTxt, + ResourceFilter resourceFilter, List<String> uncompressedExtensions, boolean crunchPng, Artifact proguardCfg, @@ -442,6 +451,13 @@ public final class ApplicationManifest { "resource_files", Mode.TARGET, FileProvider.class)).build(); + ResourceContainer.Builder builder = + ResourceContainer.builderFromRule(ruleContext) + .setAssetsAndResourcesFrom(data) + .setManifest(getManifest()) + .setRTxt(rTxt) + .setApk(resourceApk); + if (ruleContext.hasErrors()) { return null; } @@ -452,9 +468,7 @@ public final class ApplicationManifest { uncompressedExtensions, crunchPng, false /* incremental */, - ResourceContainer.builderFromRule(ruleContext) - .setRTxt(rTxt) - .setApk(resourceApk), + builder, data, proguardCfg, mainDexProguardCfg, @@ -488,6 +502,28 @@ public final class ApplicationManifest { if (ruleContext.hasErrors()) { return null; } + ResourceContainer.Builder builder = + ResourceContainer.builderFromRule(ruleContext) + .setAssetsAndResourcesFrom(data) + .setManifest(getManifest()) + .setSymbols(symbols) + .setRTxt(rTxt); + + if (targetAaptVersion == AndroidAaptVersion.AAPT2) { + + builder + .setAapt2JavaSourceJar( + ruleContext.getImplicitOutputArtifact( + AndroidRuleClasses.ANDROID_RESOURCES_AAPT2_SOURCE_JAR)) + .setAapt2RTxt( + ruleContext.getImplicitOutputArtifact( + AndroidRuleClasses.ANDROID_RESOURCES_AAPT2_R_TXT)) + .setCompiledSymbols( + ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_COMPILED_SYMBOLS)) + .setStaticLibrary( + ruleContext.getImplicitOutputArtifact( + AndroidRuleClasses.ANDROID_RESOURCES_AAPT2_LIBRARY_APK)); + } return createApk( ruleContext, true /* isLibrary */, @@ -495,10 +531,7 @@ public final class ApplicationManifest { ImmutableList.<String>of() /* uncompressedExtensions */, false /* crunchPng */, false /* incremental */, - ResourceContainer.builderFromRule(ruleContext) - .setRTxt(rTxt) - .setSymbols(symbols) - .setApk(null), + builder, data, null /* proguardCfg */, null /* mainDexProguardCfg */, @@ -634,7 +667,7 @@ public final class ApplicationManifest { .getFragment(AndroidConfiguration.class).throwOnResourceConflict()); if (!incremental) { builder - .targetAaptVersion(AndroidAaptVersion.AAPT) + .targetAaptVersion(targetAaptVersion) .setRTxtOut(resourceContainer.getRTxt()) .setSymbols(resourceContainer.getSymbols()) .setSourceJarOut(resourceContainer.getJavaSourceJar()); |