aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceParsingActionBuilder.java
diff options
context:
space:
mode:
authorGravatar asteinb <asteinb@google.com>2018-05-25 11:16:34 -0700
committerGravatar Copybara-Service <copybara-piper@google.com>2018-05-25 11:17:48 -0700
commitc2cf1132a75d03cc37888fe8c2b9583c7ce198c5 (patch)
tree77d981b934797bb9e335cabf1c9c496023bb74e9 /src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceParsingActionBuilder.java
parent2643d4b7543403eae52c038e769231f539938195 (diff)
Automated rollback of commit 372fbc2f016157b0331f83a20edad10d4b4cf9f7.
*** Reason for rollback *** Roll forward with fix: I was assuming that R.txt and symbols files are always set, but they can be null in some cases (especially in the old data processing pipeline). Properly handle them here. RELNOTES: none PiperOrigin-RevId: 198075743
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceParsingActionBuilder.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceParsingActionBuilder.java137
1 files changed, 32 insertions, 105 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceParsingActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceParsingActionBuilder.java
index a3bd4773d6..13976552ef 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceParsingActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceParsingActionBuilder.java
@@ -15,31 +15,16 @@ package com.google.devtools.build.lib.rules.android;
import static java.util.stream.Collectors.joining;
-import com.google.common.base.Preconditions;
-import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
import com.google.common.collect.Streams;
import com.google.devtools.build.lib.actions.Artifact;
-import com.google.devtools.build.lib.actions.ParamFileInfo;
-import com.google.devtools.build.lib.actions.ParameterFile.ParameterFileType;
-import com.google.devtools.build.lib.analysis.RuleContext;
-import com.google.devtools.build.lib.analysis.actions.ActionConstructionContext;
-import com.google.devtools.build.lib.analysis.actions.CustomCommandLine;
-import com.google.devtools.build.lib.analysis.actions.SpawnAction;
-import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode;
-import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
-import com.google.devtools.build.lib.util.OS;
+import com.google.devtools.build.lib.rules.android.AndroidConfiguration.AndroidAaptVersion;
import com.google.devtools.build.lib.vfs.PathFragment;
-import java.util.ArrayList;
-import java.util.List;
import javax.annotation.Nullable;
/** Builder for creating $android_resource_parser action. */
public class AndroidResourceParsingActionBuilder {
- private final RuleContext ruleContext;
- private final AndroidSdkProvider sdk;
-
// These are only needed when parsing resources with data binding
@Nullable private Artifact manifest;
@Nullable private String javaPackage;
@@ -54,12 +39,6 @@ public class AndroidResourceParsingActionBuilder {
@Nullable private Artifact compiledSymbols;
@Nullable private Artifact dataBindingInfoZip;
- /** @param ruleContext The RuleContext that was used to create the SpawnAction.Builder. */
- public AndroidResourceParsingActionBuilder(RuleContext ruleContext) {
- this.ruleContext = ruleContext;
- this.sdk = AndroidSdkProvider.fromRuleContext(ruleContext);
- }
-
/** Set the artifact location for the output protobuf. */
public AndroidResourceParsingActionBuilder setOutput(Artifact output) {
this.output = output;
@@ -103,86 +82,32 @@ public class AndroidResourceParsingActionBuilder {
return Streams.stream(roots).map(Object::toString).collect(joining("#"));
}
- private void build(ActionConstructionContext context) {
- CustomCommandLine.Builder builder = new CustomCommandLine.Builder();
-
- // Set the busybox tool.
- builder.add("--tool").add("PARSE").add("--");
-
- NestedSetBuilder<Artifact> inputs = NestedSetBuilder.naiveLinkOrder();
-
+ private void build(AndroidDataContext dataContext) {
String resourceDirectories =
convertRoots(resources.getResourceRoots()) + ":" + convertRoots(assets.getAssetRoots());
- builder.add("--primaryData", resourceDirectories);
- inputs.addTransitive(
- NestedSetBuilder.<Artifact>naiveLinkOrder()
- .addAll(assets.getAssets())
- .addAll(resources.getResources())
- .build());
-
- Preconditions.checkNotNull(output);
- builder.addExecPath("--output", output);
-
- SpawnAction.Builder spawnActionBuilder = new SpawnAction.Builder();
- ParamFileInfo.Builder paramFileInfo = ParamFileInfo.builder(ParameterFileType.SHELL_QUOTED);
- // Some flags (e.g. --mainData) may specify lists (or lists of lists) separated by special
- // characters (colon, semicolon, hashmark, ampersand) that don't work on Windows, and quoting
- // semantics are very complicated (more so than in Bash), so let's just always use a parameter
- // file.
- // TODO(laszlocsomor), TODO(corysmith): restructure the Android BusyBux's flags by deprecating
- // list-type and list-of-list-type flags that use such problematic separators in favor of
- // multi-value flags (to remove one level of listing) and by changing all list separators to a
- // platform-safe character (= comma).
- paramFileInfo.setUseAlways(OS.getCurrent() == OS.WINDOWS);
-
- // Create the spawn action.
- ruleContext.registerAction(
- spawnActionBuilder
- .useDefaultShellEnvironment()
- .addTransitiveInputs(inputs.build())
- .addOutputs(ImmutableList.of(output))
- .addCommandLine(builder.build(), paramFileInfo.build())
- .setExecutable(
- ruleContext.getExecutablePrerequisite("$android_resources_busybox", Mode.HOST))
- .setProgressMessage("Parsing Android resources for %s", ruleContext.getLabel())
- .setMnemonic("AndroidResourceParser")
- .build(context));
+ Iterable<Artifact> resourceArtifacts =
+ Iterables.concat(assets.getAssets(), resources.getResources());
+
+ BusyBoxActionBuilder.create(dataContext, "PARSE")
+ .addInput("--primaryData", resourceDirectories, resourceArtifacts)
+ .addOutput("--output", output)
+ .buildAndRegister("Parsing Android resources", "AndroidResourceParser");
if (compiledSymbols != null) {
- List<Artifact> outs = new ArrayList<>();
- CustomCommandLine.Builder flatFileBuilder = new CustomCommandLine.Builder();
- flatFileBuilder
- .add("--tool")
- .add("COMPILE_LIBRARY_RESOURCES")
- .add("--")
- .addExecPath("--aapt2", sdk.getAapt2().getExecutable())
- .add("--resources", resourceDirectories)
- .addExecPath("--output", compiledSymbols);
- inputs.add(sdk.getAapt2().getExecutable());
- outs.add(compiledSymbols);
-
- // The databinding needs to be processed before compilation, so the stripping happens here.
+ BusyBoxActionBuilder compiledBuilder =
+ BusyBoxActionBuilder.create(dataContext, "COMPILE_LIBRARY_RESOURCES")
+ .addAapt(AndroidAaptVersion.AAPT2)
+ .addInput("--resources", resourceDirectories, resourceArtifacts)
+ .addOutput("--output", compiledSymbols);
+
if (dataBindingInfoZip != null) {
- flatFileBuilder.addExecPath("--manifest", manifest);
- inputs.add(manifest);
- if (!Strings.isNullOrEmpty(javaPackage)) {
- flatFileBuilder.add("--packagePath", javaPackage);
- }
- flatFileBuilder.addExecPath("--dataBindingInfoOut", dataBindingInfoZip);
- outs.add(dataBindingInfoZip);
+ compiledBuilder
+ .addInput("--manifest", manifest)
+ .maybeAddFlag("--packagePath", javaPackage)
+ .addOutput("--dataBindingInfoOut", dataBindingInfoZip);
}
- // Create the spawn action.
- ruleContext.registerAction(
- new SpawnAction.Builder()
- .useDefaultShellEnvironment()
- .addTransitiveInputs(inputs.build())
- .addOutputs(ImmutableList.copyOf(outs))
- .addCommandLine(flatFileBuilder.build(), paramFileInfo.build())
- .setExecutable(
- ruleContext.getExecutablePrerequisite("$android_resources_busybox", Mode.HOST))
- .setProgressMessage("Compiling Android resources for %s", ruleContext.getLabel())
- .setMnemonic("AndroidResourceCompiler")
- .build(context));
+
+ compiledBuilder.buildAndRegister("Compiling Android resources", "AndroidResourceCompiler");
}
}
@@ -191,7 +116,9 @@ public class AndroidResourceParsingActionBuilder {
* parsed and compiled information.
*/
public ParsedAndroidResources build(
- AndroidResources androidResources, StampedAndroidManifest manifest) {
+ AndroidDataContext dataContext,
+ AndroidResources androidResources,
+ StampedAndroidManifest manifest) {
if (dataBindingInfoZip != null) {
// Manifest information is needed for data binding
setManifest(manifest.getManifest());
@@ -199,17 +126,17 @@ public class AndroidResourceParsingActionBuilder {
}
setResources(androidResources);
- build(ruleContext);
+ build(dataContext);
return ParsedAndroidResources.of(
- androidResources, output, compiledSymbols, ruleContext.getLabel(), manifest);
+ androidResources, output, compiledSymbols, dataContext.getLabel(), manifest);
}
- public ParsedAndroidAssets build(AndroidAssets assets) {
+ public ParsedAndroidAssets build(AndroidDataContext dataContext, AndroidAssets assets) {
setAssets(assets);
- build(ruleContext);
+ build(dataContext);
- return ParsedAndroidAssets.of(assets, output, ruleContext.getLabel());
+ return ParsedAndroidAssets.of(assets, output, dataContext.getLabel());
}
/**
@@ -217,8 +144,8 @@ public class AndroidResourceParsingActionBuilder {
* symbols.
*/
public ResourceContainer buildAndUpdate(
- RuleContext ruleContext, ResourceContainer resourceContainer) {
- build(ruleContext);
+ AndroidDataContext dataContext, ResourceContainer resourceContainer) {
+ build(dataContext);
ResourceContainer.Builder builder =
resourceContainer