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 09:59:55 -0700
committerGravatar Copybara-Service <copybara-piper@google.com>2018-04-18 10:01:37 -0700
commit9b72ae13744069a6dc5f8f474c7979a3b0c9200d (patch)
treec4674242b68ce0da31fec6312f1df580200e5e39 /src/main/java/com/google/devtools/build/lib/rules/android/ProcessedAndroidData.java
parent3b432394c92614e2848d3000e7d228280ecfe127 (diff)
Wire up decoupled data pipeline in top-level Android targets
The decoupled pipeline is safely hidden behind a flag. I'm explicitly holding off on the MobileInstall code until next review, so we sometimes create an ApplicationManifest object even in the new pipeline to pass data to that code. I'm not thrilled with the 'just call into the resource processor with different settings' approach that I've reproduced in ProcessedAndroidData, but I don't see a better way of doing things, and I think that breaking out the commonly used settings makes things cleaner. RELNOTES: none PiperOrigin-RevId: 193373347
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.java129
1 files changed, 129 insertions, 0 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 ed9ef21b5d..3c1086a5b6 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
@@ -15,8 +15,12 @@ package com.google.devtools.build.lib.rules.android;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.RuleContext;
+import com.google.devtools.build.lib.analysis.config.CompilationMode;
import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
import com.google.devtools.build.lib.rules.android.AndroidConfiguration.AndroidAaptVersion;
+import com.google.devtools.build.lib.rules.java.ProguardHelper;
+import com.google.devtools.build.lib.syntax.Type;
+import java.util.Map;
import javax.annotation.Nullable;
/**
@@ -43,6 +47,131 @@ public class ProcessedAndroidData {
@Nullable private final Artifact dataBindingInfoZip;
private final ResourceDependencies resourceDeps;
+ /** Processes Android data (assets, resources, and manifest) for android_binary targets. */
+ public static ProcessedAndroidData processBinaryDataFrom(
+ RuleContext ruleContext, StampedAndroidManifest manifest, boolean conditionalKeepRules)
+ throws RuleErrorException, InterruptedException {
+
+ AndroidResources resources = AndroidResources.from(ruleContext, "resource_files");
+ ResourceDependencies resourceDeps =
+ ResourceDependencies.fromRuleDeps(ruleContext, /* neverlink = */ false);
+ ResourceFilterFactory resourceFilterFactory =
+ ResourceFilterFactory.fromRuleContext(ruleContext);
+
+ ResourceFilter resourceFilter =
+ resourceFilterFactory.getResourceFilter(ruleContext, resourceDeps, resources);
+
+ // Filter unwanted resources out
+ 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))
+ .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);
+ }
+
+ /** Processes Android data (assets, resources, and manifest) for android_local_test targets. */
+ public static ProcessedAndroidData processLocalTestDataFrom(
+ RuleContext ruleContext, StampedAndroidManifest manifest)
+ throws RuleErrorException, InterruptedException {
+
+ 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))
+ .setCrunchPng(false)
+ .withResourceDependencies(
+ ResourceDependencies.fromRuleDeps(ruleContext, /* neverlink = */ false))
+ .withAssetDependencies(AssetDependencies.fromRuleDeps(ruleContext, /* neverlink = */ false))
+ .build(
+ AndroidResources.from(ruleContext, "resource_files"),
+ AndroidAssets.from(ruleContext),
+ manifest);
+ }
+
+ /** Processes Android data (assets, resources, and manifest) for android_test targets. */
+ public static ProcessedAndroidData processTestDataFrom(
+ RuleContext ruleContext,
+ StampedAndroidManifest manifest,
+ String packageUnderTest,
+ boolean hasLocalResourceFiles)
+ throws InterruptedException, RuleErrorException {
+
+ AndroidResourcesProcessorBuilder builder =
+ builderForTopLevelTarget(ruleContext, manifest)
+ .setMainDexProguardOut(AndroidBinary.createMainDexProguardSpec(ruleContext))
+ .setPackageUnderTest(packageUnderTest)
+ .setIsTestWithResources(hasLocalResourceFiles);
+
+ if (hasLocalResourceFiles) {
+ builder
+ .withResourceDependencies(
+ ResourceDependencies.fromRuleDeps(ruleContext, /* neverlink = */ false))
+ .withAssetDependencies(
+ AssetDependencies.fromRuleDeps(ruleContext, /* neverlink = */ false));
+ }
+
+ return builder.build(
+ AndroidResources.from(ruleContext, "local_resource_files"),
+ AndroidAssets.from(ruleContext),
+ manifest);
+ }
+
+ /**
+ * 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)
+ throws InterruptedException, RuleErrorException {
+ Map<String, String> manifestValues = ApplicationManifest.getManifestValues(ruleContext);
+
+ return new AndroidResourcesProcessorBuilder(ruleContext)
+ // Settings
+ .setDebug(ruleContext.getConfiguration().getCompilationMode() != CompilationMode.OPT)
+ .setJavaPackage(manifest.getPackage())
+ .setApplicationId(manifestValues.get("applicationId"))
+ .setVersionCode(manifestValues.get("versionCode"))
+ .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, ""));
+ }
+
static ProcessedAndroidData of(
ParsedAndroidResources resources,
MergedAndroidAssets assets,