aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules/android/ResourceShrinkerActionBuilder.java
diff options
context:
space:
mode:
authorGravatar asteinb <asteinb@google.com>2018-05-22 12:44:51 -0700
committerGravatar Copybara-Service <copybara-piper@google.com>2018-05-22 12:46:38 -0700
commitf6a858c59dad03c0618fd95bfff82076bf4a41f8 (patch)
treea7ff8d4092a36005fe4ed47abcb5441e575334a6 /src/main/java/com/google/devtools/build/lib/rules/android/ResourceShrinkerActionBuilder.java
parentd92688eec14040d9a381291bbb881a4b26a4d55d (diff)
Move non-resource busybox actions to BusyBoxActionBuilder and AndroidDataContext
BusyBoxActionBuilder makes much cleaner action builders while making it harder to do Bad Things (like collapsing NestedSets in analysis, or adding an artifact to one of the command line and the inputs but not both). Remaining action builders will be moved in the next change. Add old manifest merger tool to AndroidDataContext. RELNOTES: none PiperOrigin-RevId: 197607155
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/android/ResourceShrinkerActionBuilder.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ResourceShrinkerActionBuilder.java135
1 files changed, 25 insertions, 110 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceShrinkerActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceShrinkerActionBuilder.java
index 4e6c395287..f5861a72c8 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceShrinkerActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceShrinkerActionBuilder.java
@@ -17,17 +17,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
import com.google.common.collect.ImmutableList;
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.FilesToRunProvider;
-import com.google.devtools.build.lib.analysis.RuleContext;
-import com.google.devtools.build.lib.analysis.actions.CustomCommandLine;
-import com.google.devtools.build.lib.analysis.actions.CustomCommandLine.VectorArg;
-import com.google.devtools.build.lib.analysis.actions.SpawnAction;
-import com.google.devtools.build.lib.analysis.config.CompilationMode;
-import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode;
import com.google.devtools.build.lib.rules.android.AndroidConfiguration.AndroidAaptVersion;
-import com.google.devtools.build.lib.util.OS;
import java.util.Collections;
import java.util.List;
@@ -43,20 +33,8 @@ public class ResourceShrinkerActionBuilder {
private Artifact shrunkResourcesOut;
private Artifact logOut;
- private final RuleContext ruleContext;
- private final SpawnAction.Builder spawnActionBuilder;
- private final AndroidSdkProvider sdk;
-
private List<String> uncompressedExtensions = Collections.emptyList();
- private ResourceFilterFactory resourceFilterFactory;
-
- /** @param ruleContext The RuleContext of the owning rule. */
- public ResourceShrinkerActionBuilder(RuleContext ruleContext) {
- this.ruleContext = ruleContext;
- this.spawnActionBuilder = new SpawnAction.Builder();
- this.sdk = AndroidSdkProvider.fromRuleContext(ruleContext);
- this.resourceFilterFactory = ResourceFilterFactory.empty();
- }
+ private ResourceFilterFactory resourceFilterFactory = ResourceFilterFactory.empty();
public ResourceShrinkerActionBuilder setUncompressedExtensions(
List<String> uncompressedExtensions) {
@@ -131,38 +109,7 @@ public class ResourceShrinkerActionBuilder {
return this;
}
- public Artifact build() {
- ImmutableList.Builder<Artifact> inputs = ImmutableList.builder();
- ImmutableList.Builder<Artifact> outputs = ImmutableList.builder();
-
- CustomCommandLine.Builder commandLine = new CustomCommandLine.Builder();
-
- // Set the busybox tool.
- FilesToRunProvider aapt;
-
- if (targetAaptVersion == AndroidAaptVersion.AAPT2) {
- aapt = sdk.getAapt2();
- commandLine.add("--tool").add("SHRINK_AAPT2").add("--");
- commandLine.addExecPath("--aapt2", aapt.getExecutable());
- } else {
- aapt = sdk.getAapt();
- commandLine.add("--tool").add("SHRINK").add("--");
- commandLine.addExecPath("--aapt", aapt.getExecutable());
- }
-
- commandLine.addExecPath("--androidJar", sdk.getAndroidJar());
- inputs.add(sdk.getAndroidJar());
-
- if (!uncompressedExtensions.isEmpty()) {
- commandLine.addAll(
- "--uncompressedExtensions", VectorArg.join(",").each(uncompressedExtensions));
- }
- if (ruleContext.getConfiguration().getCompilationMode() != CompilationMode.OPT) {
- commandLine.add("--debug");
- }
- if (resourceFilterFactory.hasConfigurationFilters()) {
- commandLine.add("--resourceConfigs", resourceFilterFactory.getConfigurationFilterString());
- }
+ public Artifact build(AndroidDataContext dataContext) {
checkNotNull(resourceFilesZip);
checkNotNull(shrunkJar);
@@ -172,63 +119,31 @@ public class ResourceShrinkerActionBuilder {
checkNotNull(primaryResources.getManifest());
checkNotNull(resourceApkOut);
- commandLine.addExecPath("--resources", resourceFilesZip);
- inputs.add(resourceFilesZip);
-
- commandLine.addExecPath("--shrunkJar", shrunkJar);
- inputs.add(shrunkJar);
-
- commandLine.addExecPath("--proguardMapping", proguardMapping);
- inputs.add(proguardMapping);
-
- commandLine.addExecPath("--rTxt", primaryResources.getRTxt());
- inputs.add(primaryResources.getRTxt());
-
- commandLine.addExecPath("--primaryManifest", primaryResources.getManifest());
- inputs.add(primaryResources.getManifest());
-
- ImmutableList<Artifact> dependencyManifests = getManifests(dependencyResources);
- if (!dependencyManifests.isEmpty()) {
- commandLine.addExecPaths("--dependencyManifest", dependencyManifests);
- inputs.addAll(dependencyManifests);
+ BusyBoxActionBuilder builder;
+ if (targetAaptVersion == AndroidAaptVersion.AAPT2) {
+ builder = BusyBoxActionBuilder.create(dataContext, "SHRINK_AAPT2");
+ } else {
+ builder = BusyBoxActionBuilder.create(dataContext, "SHRINK");
}
- ImmutableList<String> resourcePackages =
- getResourcePackages(primaryResources, dependencyResources);
- commandLine.addAll("--resourcePackages", VectorArg.join(",").each(resourcePackages));
-
- commandLine.addExecPath("--shrunkResourceApk", resourceApkOut);
- outputs.add(resourceApkOut);
-
- commandLine.addExecPath("--shrunkResources", shrunkResourcesOut);
- outputs.add(shrunkResourcesOut);
-
- commandLine.addExecPath("--log", logOut);
- outputs.add(logOut);
-
- 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);
-
- ruleContext.registerAction(
- spawnActionBuilder
- .useDefaultShellEnvironment()
- .addTool(aapt)
- .addInputs(inputs.build())
- .addOutputs(outputs.build())
- .addCommandLine(commandLine.build(), paramFileInfo.build())
- .setExecutable(
- ruleContext.getExecutablePrerequisite("$android_resources_busybox", Mode.HOST))
- .setProgressMessage("Shrinking resources for %s", ruleContext.getLabel())
- .setMnemonic("ResourceShrinker")
- .build(ruleContext));
+ builder
+ .addAapt(targetAaptVersion)
+ .addAndroidJar()
+ .maybeAddVectoredFlag("--uncompressedExtensions", uncompressedExtensions)
+ .maybeAddFlag("--debug", dataContext.useDebug())
+ .maybeAddFlag("--resourceConfigs", resourceFilterFactory.getConfigurationFilterString())
+ .addInput("--resources", resourceFilesZip)
+ .addInput("--shrunkJar", shrunkJar)
+ .addInput("--proguardMapping", proguardMapping)
+ .addInput("--rTxt", primaryResources.getRTxt())
+ .addInput("--primaryManifest", primaryResources.getManifest())
+ .maybeAddInput("--dependencyManifest", getManifests(dependencyResources))
+ .addVectoredFlag(
+ "--resourcePackages", getResourcePackages(primaryResources, dependencyResources))
+ .addOutput("--shrunkResourceApk", resourceApkOut)
+ .addOutput("--shrunkResources", shrunkResourcesOut)
+ .addOutput("--log", logOut)
+ .buildAndRegister("Shrinking resources", "ResourceShrinker");
return resourceApkOut;
}