aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules/android/ProcessedAndroidData.java
diff options
context:
space:
mode:
authorGravatar asteinb <asteinb@google.com>2018-04-18 11:52:27 -0700
committerGravatar Copybara-Service <copybara-piper@google.com>2018-04-18 11:53:53 -0700
commit707ec66d01e5a5fac76efb5b81a2ace726fa608b (patch)
treeb66de831d7fa61cb22e170b6974891b9f4314b00 /src/main/java/com/google/devtools/build/lib/rules/android/ProcessedAndroidData.java
parentd3d37f0c7da3eaf3277d0297cb93d81c161d8659 (diff)
Wire up decoupled resource processing for MobileInstall
This should be the last place the new data processing is needed. MobileInstall is a bit trickier than normal data processing because it's out of the way. I'm still using ApplicationManifest to wrap the manifest Artifact in a lot of it, just because that makes more sense than passing around both ApplicationManifest for use with old behavior and StampedAndroidManifest for use with the new. Once we switch to entirely the new behavior, we can remove ApplicationManifest entirely. RELNOTES: none PiperOrigin-RevId: 193392923
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/android/ProcessedAndroidData.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ProcessedAndroidData.java119
1 files changed, 78 insertions, 41 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ProcessedAndroidData.java b/src/main/java/com/google/devtools/build/lib/rules/android/ProcessedAndroidData.java
index 3c1086a5b6..637afabf25 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/ProcessedAndroidData.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/ProcessedAndroidData.java
@@ -51,6 +51,49 @@ public class ProcessedAndroidData {
public static ProcessedAndroidData processBinaryDataFrom(
RuleContext ruleContext, StampedAndroidManifest manifest, boolean conditionalKeepRules)
throws RuleErrorException, InterruptedException {
+ if (conditionalKeepRules
+ && AndroidAaptVersion.chooseTargetAaptVersion(ruleContext) != AndroidAaptVersion.AAPT2) {
+ throw ruleContext.throwWithRuleError(
+ "resource cycle shrinking can only be enabled for builds with aapt2");
+ }
+
+ AndroidResourcesProcessorBuilder builder =
+ builderForNonIncrementalTopLevelTarget(ruleContext, manifest)
+ .setUseCompiledResourcesForMerge(
+ AndroidAaptVersion.chooseTargetAaptVersion(ruleContext) == AndroidAaptVersion.AAPT2
+ && AndroidCommon.getAndroidConfig(ruleContext).skipParsingAction())
+ .setManifestOut(
+ ruleContext.getImplicitOutputArtifact(
+ AndroidRuleClasses.ANDROID_PROCESSED_MANIFEST))
+ .setMergedResourcesOut(
+ ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_RESOURCES_ZIP))
+ .setMainDexProguardOut(AndroidBinary.createMainDexProguardSpec(ruleContext))
+ .conditionalKeepRules(conditionalKeepRules)
+ .setDataBindingInfoZip(
+ DataBinding.isEnabled(ruleContext)
+ ? DataBinding.getLayoutInfoFile(ruleContext)
+ : null);
+ return buildActionForBinary(ruleContext, builder, manifest);
+ }
+
+ public static ProcessedAndroidData processIncrementalBinaryDataFrom(
+ RuleContext ruleContext,
+ StampedAndroidManifest manifest,
+ Artifact apkOut,
+ String proguardPrefix)
+ throws RuleErrorException {
+
+ AndroidResourcesProcessorBuilder builder =
+ builderForTopLevelTarget(ruleContext, manifest, proguardPrefix).setApkOut(apkOut);
+
+ return buildActionForBinary(ruleContext, builder, manifest);
+ }
+
+ private static ProcessedAndroidData buildActionForBinary(
+ RuleContext ruleContext,
+ AndroidResourcesProcessorBuilder builder,
+ StampedAndroidManifest manifest)
+ throws RuleErrorException {
AndroidResources resources = AndroidResources.from(ruleContext, "resource_files");
ResourceDependencies resourceDeps =
@@ -65,28 +108,11 @@ public class ProcessedAndroidData {
resources = resources.filterLocalResources(ruleContext, resourceFilter);
resourceDeps = resourceDeps.filter(ruleContext, resourceFilter);
- if (conditionalKeepRules
- && AndroidAaptVersion.chooseTargetAaptVersion(ruleContext) != AndroidAaptVersion.AAPT2) {
- throw ruleContext.throwWithRuleError(
- "resource cycle shrinking can only be enabled for builds with aapt2");
- }
-
- return builderForTopLevelTarget(ruleContext, manifest)
- .setUseCompiledResourcesForMerge(
- AndroidAaptVersion.chooseTargetAaptVersion(ruleContext) == AndroidAaptVersion.AAPT2
- && AndroidCommon.getAndroidConfig(ruleContext).skipParsingAction())
- .setManifestOut(
- ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_PROCESSED_MANIFEST))
- .setMergedResourcesOut(
- ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_RESOURCES_ZIP))
+ return builder
.setResourceFilterFactory(resourceFilterFactory)
.setUncompressedExtensions(
ruleContext.getExpander().withDataLocations().tokenized("nocompress_extensions"))
.setCrunchPng(ruleContext.attributes().get("crunch_png", Type.BOOLEAN))
- .setMainDexProguardOut(AndroidBinary.createMainDexProguardSpec(ruleContext))
- .conditionalKeepRules(conditionalKeepRules)
- .setDataBindingInfoZip(
- DataBinding.isEnabled(ruleContext) ? DataBinding.getLayoutInfoFile(ruleContext) : null)
.withResourceDependencies(resourceDeps)
.withAssetDependencies(AssetDependencies.fromRuleDeps(ruleContext, /* neverlink = */ false))
.build(resources, AndroidAssets.from(ruleContext), manifest);
@@ -97,7 +123,7 @@ public class ProcessedAndroidData {
RuleContext ruleContext, StampedAndroidManifest manifest)
throws RuleErrorException, InterruptedException {
- return builderForTopLevelTarget(ruleContext, manifest)
+ return builderForNonIncrementalTopLevelTarget(ruleContext, manifest)
.setUseCompiledResourcesForMerge(
AndroidAaptVersion.chooseTargetAaptVersion(ruleContext) == AndroidAaptVersion.AAPT2
&& AndroidCommon.getAndroidConfig(ruleContext).skipParsingAction())
@@ -124,7 +150,7 @@ public class ProcessedAndroidData {
throws InterruptedException, RuleErrorException {
AndroidResourcesProcessorBuilder builder =
- builderForTopLevelTarget(ruleContext, manifest)
+ builderForNonIncrementalTopLevelTarget(ruleContext, manifest)
.setMainDexProguardOut(AndroidBinary.createMainDexProguardSpec(ruleContext))
.setPackageUnderTest(packageUnderTest)
.setIsTestWithResources(hasLocalResourceFiles);
@@ -144,13 +170,31 @@ public class ProcessedAndroidData {
}
/**
- * Common {@link AndroidResourcesProcessorBuilder} builder for top-level targets.
+ * Common {@link AndroidResourcesProcessorBuilder} builder for non-incremental top-level targets.
*
* <p>The builder will be populated with commonly-used settings and outputs.
*/
- private static AndroidResourcesProcessorBuilder builderForTopLevelTarget(
+ private static AndroidResourcesProcessorBuilder builderForNonIncrementalTopLevelTarget(
RuleContext ruleContext, StampedAndroidManifest manifest)
throws InterruptedException, RuleErrorException {
+
+ return builderForTopLevelTarget(ruleContext, manifest, "")
+ .targetAaptVersion(AndroidAaptVersion.chooseTargetAaptVersion(ruleContext))
+
+ // Outputs
+ .setApkOut(ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_RESOURCES_APK))
+ .setRTxtOut(ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_R_TXT))
+ .setSourceJarOut(
+ ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_JAVA_SOURCE_JAR));
+ }
+
+ /**
+ * Common {@link AndroidResourcesProcessorBuilder} builder for top-level targets.
+ *
+ * <p>The builder will be populated with commonly-used settings and outputs.
+ */
+ private static AndroidResourcesProcessorBuilder builderForTopLevelTarget(
+ RuleContext ruleContext, StampedAndroidManifest manifest, String proguardPrefix) {
Map<String, String> manifestValues = ApplicationManifest.getManifestValues(ruleContext);
return new AndroidResourcesProcessorBuilder(ruleContext)
@@ -162,14 +206,9 @@ public class ProcessedAndroidData {
.setVersionName(manifestValues.get("versionName"))
.setThrowOnResourceConflict(
AndroidCommon.getAndroidConfig(ruleContext).throwOnResourceConflict())
- .targetAaptVersion(AndroidAaptVersion.chooseTargetAaptVersion(ruleContext))
- // Outputs
- .setApkOut(ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_RESOURCES_APK))
- .setRTxtOut(ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_R_TXT))
- .setSourceJarOut(
- ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_JAVA_SOURCE_JAR))
- .setProguardOut(ProguardHelper.getProguardConfigArtifact(ruleContext, ""));
+ // Output
+ .setProguardOut(ProguardHelper.getProguardConfigArtifact(ruleContext, proguardPrefix));
}
static ProcessedAndroidData of(
@@ -212,16 +251,12 @@ public class ProcessedAndroidData {
*/
public ResourceApk generateRClass(RuleContext ruleContext)
throws RuleErrorException, InterruptedException {
- ValidatedAndroidResources validated =
- new RClassGeneratorActionBuilder(ruleContext)
- .targetAaptVersion(AndroidAaptVersion.chooseTargetAaptVersion(ruleContext))
- .withDependencies(resourceDeps)
- .setClassJarOut(
- ruleContext.getImplicitOutputArtifact(
- AndroidRuleClasses.ANDROID_RESOURCES_CLASS_JAR))
- .build(this);
-
- return ResourceApk.of(validated, assets);
+ return new RClassGeneratorActionBuilder(ruleContext)
+ .targetAaptVersion(AndroidAaptVersion.chooseTargetAaptVersion(ruleContext))
+ .withDependencies(resourceDeps)
+ .setClassJarOut(
+ ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_RESOURCES_CLASS_JAR))
+ .build(this);
}
/**
@@ -230,7 +265,7 @@ public class ProcessedAndroidData {
* @param rClassJar an artifact containing the resource class jar for these resources. An action
* to generate it must be registered elsewhere.
*/
- ValidatedAndroidResources toValidatedResources(Artifact rClassJar) {
+ ResourceApk withValidatedResources(Artifact rClassJar) {
// When assets and resources are processed together, they are both merged into the same zip
Artifact mergedResources = assets.getMergedAssets();
@@ -241,7 +276,9 @@ public class ProcessedAndroidData {
resources, mergedResources, rClassJar, dataBindingInfoZip, resourceDeps, manifest);
// Combined resource processing does not produce aapt2 artifacts; they're nulled out
- return ValidatedAndroidResources.of(merged, rTxt, sourceJar, apk, null, null, null);
+ ValidatedAndroidResources validated =
+ ValidatedAndroidResources.of(merged, rTxt, sourceJar, apk, null, null, null);
+ return ResourceApk.of(validated, assets);
}
public MergedAndroidAssets getAssets() {