aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Greg Estren <gregce@google.com>2017-02-16 22:46:41 +0000
committerGravatar Dmitry Lomov <dslomov@google.com>2017-02-17 14:53:19 +0000
commitedeb6d0ba47a52ddd9fc421f1ab577f4eafdc2b5 (patch)
tree0ec950dcde90cd663eae31ae9e01294a92fbceed
parent0d4980bc7251ebb62cbb85c7777da6fd4361dd21 (diff)
Make Android data binding work with --experimental_use_parallel_android_resource_processing.
Without that flag, data binding already works via hooks in ApplicationManifest and AndroidResourceProcessingAction. The flag replaces AndroidResourceProcessingAction with three smaller processors: AndroidResourceParsingAction, AndroidResourceMergingAction, and AndroidResourceValidatorAction. So this change hooks the same logic into AndroidResourceMergingAction (at the equivalent place where data binding applies in the other pipeline). We could alternatively hook this into AndroidResourceValidatorAction (i.e. anywhere after resource merging completes and before aapt starts). But doing that would block Java compilation on aapt finishing, which the whole point of the flag is to unblock. -- PiperOrigin-RevId: 147770236 MOS_MIGRATED_REVID=147770236
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceMergingActionBuilder.java16
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java3
-rw-r--r--src/tools/android/java/com/google/devtools/build/android/AndroidResourceMergingAction.java17
-rw-r--r--src/tools/android/java/com/google/devtools/build/android/AndroidResourceProcessor.java2
4 files changed, 35 insertions, 3 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceMergingActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceMergingActionBuilder.java
index 1e3ae9ccce..3d7886d368 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceMergingActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceMergingActionBuilder.java
@@ -61,6 +61,7 @@ public class AndroidResourceMergingActionBuilder {
private Artifact mergedResourcesOut;
private Artifact classJarOut;
private Artifact manifestOut;
+ private Artifact dataBindingInfoZip;
// Flags
private String customJavaPackage;
@@ -100,6 +101,16 @@ public class AndroidResourceMergingActionBuilder {
return this;
}
+ /**
+ * The output zip for resource-processed data binding expressions (i.e. a zip of .xml files).
+ * If null, data binding processing is skipped (and data binding expressions aren't allowed in
+ * layout resources).
+ */
+ public AndroidResourceMergingActionBuilder setDataBindingInfoZip(Artifact zip) {
+ this.dataBindingInfoZip = zip;
+ return this;
+ }
+
public AndroidResourceMergingActionBuilder setJavaPackage(String customJavaPackage) {
this.customJavaPackage = customJavaPackage;
return this;
@@ -156,6 +167,11 @@ public class AndroidResourceMergingActionBuilder {
builder.add("--packageForR").add(customJavaPackage);
}
+ if (dataBindingInfoZip != null) {
+ builder.addExecPath("--dataBindingInfoOut", dataBindingInfoZip);
+ outs.add(dataBindingInfoZip);
+ }
+
SpawnAction.Builder spawnActionBuilder = new SpawnAction.Builder();
// Create the spawn action.
ruleContext.registerAction(
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 05c896a96f..019a85d8d7 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
@@ -466,7 +466,8 @@ public final class ApplicationManifest {
.withDependencies(resourceDeps)
.setMergedResourcesOut(mergedResources)
.setManifestOut(manifestOut)
- .setClassJarOut(rJavaClassJar);
+ .setClassJarOut(rJavaClassJar)
+ .setDataBindingInfoZip(dataBindingInfoZip);
ResourceContainer merged = resourcesMergerBuilder.build(ruleContext);
AndroidResourceValidatorActionBuilder validatorBuilder =
diff --git a/src/tools/android/java/com/google/devtools/build/android/AndroidResourceMergingAction.java b/src/tools/android/java/com/google/devtools/build/android/AndroidResourceMergingAction.java
index f11ebbdf18..0e2501e773 100644
--- a/src/tools/android/java/com/google/devtools/build/android/AndroidResourceMergingAction.java
+++ b/src/tools/android/java/com/google/devtools/build/android/AndroidResourceMergingAction.java
@@ -146,6 +146,13 @@ public class AndroidResourceMergingAction {
help = "Path to write the merged symbols binary."
)
public Path symbolsBinOut;
+
+ @Option(name = "dataBindingInfoOut",
+ defaultValue = "null",
+ converter = PathConverter.class,
+ category = "output",
+ help = "Path to where data binding's layout info output should be written.")
+ public Path dataBindingInfoOut;
}
public static void main(String[] args) throws Exception {
@@ -218,10 +225,18 @@ public class AndroidResourceMergingAction {
String.format("Create classJar finished at %sms", timer.elapsed(TimeUnit.MILLISECONDS)));
if (options.resourcesOutput != null) {
+ Path resourcesDir =
+ AndroidResourceProcessor.processDataBindings(
+ mergedData.getResourceDir(),
+ options.dataBindingInfoOut,
+ packageType,
+ options.packageForR,
+ options.primaryManifest);
+
// For now, try compressing the library resources that we pass to the validator. This takes
// extra CPU resources to pack and unpack (~2x), but can reduce the zip size (~4x).
resourceProcessor.createResourcesZip(
- mergedData.getResourceDir(),
+ resourcesDir,
mergedData.getAssetDir(),
options.resourcesOutput,
true /* compress */);
diff --git a/src/tools/android/java/com/google/devtools/build/android/AndroidResourceProcessor.java b/src/tools/android/java/com/google/devtools/build/android/AndroidResourceProcessor.java
index d631e7de88..ec50361bb5 100644
--- a/src/tools/android/java/com/google/devtools/build/android/AndroidResourceProcessor.java
+++ b/src/tools/android/java/com/google/devtools/build/android/AndroidResourceProcessor.java
@@ -603,7 +603,7 @@ public class AndroidResourceProcessor {
*
* <p>Returns the resources directory that aapt should read.
*/
- private Path processDataBindings(Path resourceDir, Path dataBindingInfoOut,
+ static Path processDataBindings(Path resourceDir, Path dataBindingInfoOut,
VariantType variantType, String packagePath, Path androidManifest)
throws IOException {