aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main
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
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')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinaryMobileInstall.java75
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java21
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ProcessedAndroidData.java119
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/RClassGeneratorActionBuilder.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/StampedAndroidManifest.java16
5 files changed, 164 insertions, 71 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinaryMobileInstall.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinaryMobileInstall.java
index 4ff42e3259..7c40011c0a 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinaryMobileInstall.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinaryMobileInstall.java
@@ -63,29 +63,58 @@ public final class AndroidBinaryMobileInstall {
ResourceDependencies resourceDeps)
throws RuleErrorException, InterruptedException {
- ResourceApk incrementalResourceApk =
- applicationManifest
- .addMobileInstallStubApplication(ruleContext)
- .packIncrementalBinaryWithDataAndResources(
- ruleContext,
- ruleContext.getImplicitOutputArtifact(
- AndroidRuleClasses.ANDROID_INCREMENTAL_RESOURCES_APK),
- resourceDeps,
- ruleContext.getExpander().withDataLocations().tokenized("nocompress_extensions"),
- ruleContext.attributes().get("crunch_png", Type.BOOLEAN),
- ProguardHelper.getProguardConfigArtifact(ruleContext, "incremental"));
- ruleContext.assertNoErrors();
-
- ResourceApk splitResourceApk =
- applicationManifest
- .createSplitManifest(ruleContext, "android_resources", false)
- .packIncrementalBinaryWithDataAndResources(
- ruleContext,
- getMobileInstallArtifact(ruleContext, "android_resources.ap_"),
- resourceDeps,
- ruleContext.getExpander().withDataLocations().tokenized("nocompress_extensions"),
- ruleContext.attributes().get("crunch_png", Type.BOOLEAN),
- ProguardHelper.getProguardConfigArtifact(ruleContext, "incremental_split"));
+ final ResourceApk incrementalResourceApk;
+ final ResourceApk splitResourceApk;
+ if (AndroidResources.decoupleDataProcessing(ruleContext)) {
+ StampedAndroidManifest manifest =
+ new StampedAndroidManifest(
+ applicationManifest.getManifest(), /* pkg = */ null, /* exported = */ true);
+
+ incrementalResourceApk =
+ ProcessedAndroidData.processIncrementalBinaryDataFrom(
+ ruleContext,
+ manifest.addMobileInstallStubApplication(ruleContext),
+ ruleContext.getImplicitOutputArtifact(
+ AndroidRuleClasses.ANDROID_INCREMENTAL_RESOURCES_APK),
+ "incremental")
+ // Intentionally skip building an R class JAR - incremental binaries handle this
+ // separately.
+ .withValidatedResources(null);
+
+ splitResourceApk =
+ ProcessedAndroidData.processIncrementalBinaryDataFrom(
+ ruleContext,
+ manifest.createSplitManifest(ruleContext, "android_resources", false),
+ getMobileInstallArtifact(ruleContext, "android_resources.ap_"),
+ "incremental_split")
+ // Intentionally skip building an R class JAR - incremental binaries handle this
+ // separately.
+ .withValidatedResources(null);
+ } else {
+ incrementalResourceApk =
+ applicationManifest
+ .addMobileInstallStubApplication(ruleContext)
+ .packIncrementalBinaryWithDataAndResources(
+ ruleContext,
+ ruleContext.getImplicitOutputArtifact(
+ AndroidRuleClasses.ANDROID_INCREMENTAL_RESOURCES_APK),
+ resourceDeps,
+ ruleContext.getExpander().withDataLocations().tokenized("nocompress_extensions"),
+ ruleContext.attributes().get("crunch_png", Type.BOOLEAN),
+ ProguardHelper.getProguardConfigArtifact(ruleContext, "incremental"));
+ ruleContext.assertNoErrors();
+
+ splitResourceApk =
+ applicationManifest
+ .createSplitManifest(ruleContext, "android_resources", false)
+ .packIncrementalBinaryWithDataAndResources(
+ ruleContext,
+ getMobileInstallArtifact(ruleContext, "android_resources.ap_"),
+ resourceDeps,
+ ruleContext.getExpander().withDataLocations().tokenized("nocompress_extensions"),
+ ruleContext.attributes().get("crunch_png", Type.BOOLEAN),
+ ProguardHelper.getProguardConfigArtifact(ruleContext, "incremental_split"));
+ }
ruleContext.assertNoErrors();
return new MobileInstallResourceApks(incrementalResourceApk, splitResourceApk);
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 e4335dd813..8ecb28d045 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
@@ -45,6 +45,12 @@ public final class ApplicationManifest {
public ApplicationManifest createSplitManifest(
RuleContext ruleContext, String splitName, boolean hasCode) {
+ Artifact result = createSplitManifest(ruleContext, manifest, splitName, hasCode);
+ return new ApplicationManifest(ruleContext, result, targetAaptVersion);
+ }
+
+ static Artifact createSplitManifest(
+ RuleContext ruleContext, Artifact manifest, String splitName, boolean hasCode) {
// aapt insists that manifests be called AndroidManifest.xml, even though they have to be
// explicitly designated as manifests on the command line
Artifact result =
@@ -68,18 +74,24 @@ public final class ApplicationManifest {
commandLine.add("--nohascode");
}
- String overridePackage = manifestValues.get("applicationId");
+ String overridePackage = getManifestValues(ruleContext).get("applicationId");
if (overridePackage != null) {
commandLine.add("--override_package", overridePackage);
}
builder.addCommandLine(commandLine.build());
ruleContext.registerAction(builder.build(ruleContext));
- return new ApplicationManifest(ruleContext, result, targetAaptVersion);
+ return result;
}
public ApplicationManifest addMobileInstallStubApplication(RuleContext ruleContext)
throws InterruptedException {
+ Artifact stubManifest = addMobileInstallStubApplication(ruleContext, manifest);
+ return new ApplicationManifest(ruleContext, stubManifest, targetAaptVersion);
+ }
+
+ static Artifact addMobileInstallStubApplication(RuleContext ruleContext, Artifact manifest)
+ throws InterruptedException {
Artifact stubManifest =
ruleContext.getImplicitOutputArtifact(
@@ -103,7 +115,7 @@ public final class ApplicationManifest {
.addExecPath("--output_manifest", stubManifest)
.addExecPath("--output_datafile", stubData);
- String overridePackage = manifestValues.get("applicationId");
+ String overridePackage = getManifestValues(ruleContext).get("applicationId");
if (overridePackage != null) {
commandLine.add("--override_package", overridePackage);
}
@@ -111,7 +123,7 @@ public final class ApplicationManifest {
builder.addCommandLine(commandLine.build());
ruleContext.registerAction(builder.build(ruleContext));
- return new ApplicationManifest(ruleContext, stubManifest, targetAaptVersion);
+ return stubManifest;
}
public static ApplicationManifest fromRule(RuleContext ruleContext) throws RuleErrorException {
@@ -247,7 +259,6 @@ public final class ApplicationManifest {
return Optional.empty();
}
-
private static boolean useLegacyMerging(RuleContext ruleContext) {
boolean legacy = false;
if (ruleContext.isLegalFragment(AndroidConfiguration.class)
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() {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/RClassGeneratorActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/RClassGeneratorActionBuilder.java
index 42d30d4867..016aee5866 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/RClassGeneratorActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/RClassGeneratorActionBuilder.java
@@ -70,10 +70,10 @@ public class RClassGeneratorActionBuilder {
return primary.toBuilder().setJavaClassJar(classJarOut).build();
}
- public ValidatedAndroidResources build(ProcessedAndroidData data) {
+ public ResourceApk build(ProcessedAndroidData data) {
build(data.getRTxt(), data.getManifest());
- return data.toValidatedResources(classJarOut);
+ return data.withValidatedResources(classJarOut);
}
private void build(Artifact rTxt, ProcessedAndroidManifest manifest) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/StampedAndroidManifest.java b/src/main/java/com/google/devtools/build/lib/rules/android/StampedAndroidManifest.java
index 9291309b52..9ba17bb533 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/StampedAndroidManifest.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/StampedAndroidManifest.java
@@ -52,4 +52,20 @@ public class StampedAndroidManifest extends AndroidManifest {
return new StampedAndroidManifest(
ApplicationManifest.generateManifest(ruleContext, pkg), pkg, exported);
}
+
+ public StampedAndroidManifest addMobileInstallStubApplication(RuleContext ruleContext)
+ throws InterruptedException {
+ return new StampedAndroidManifest(
+ ApplicationManifest.addMobileInstallStubApplication(ruleContext, getManifest()),
+ getPackage(),
+ isExported());
+ }
+
+ public StampedAndroidManifest createSplitManifest(
+ RuleContext ruleContext, String splitName, boolean hasCode) {
+ return new StampedAndroidManifest(
+ ApplicationManifest.createSplitManifest(ruleContext, getManifest(), splitName, hasCode),
+ getPackage(),
+ isExported());
+ }
}