diff options
author | 2018-05-22 12:44:51 -0700 | |
---|---|---|
committer | 2018-05-22 12:46:38 -0700 | |
commit | f6a858c59dad03c0618fd95bfff82076bf4a41f8 (patch) | |
tree | a7ff8d4092a36005fe4ed47abcb5441e575334a6 /src/main/java/com/google/devtools/build/lib/rules/android/ResourceShrinkerActionBuilder.java | |
parent | d92688eec14040d9a381291bbb881a4b26a4d55d (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.java | 135 |
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; } |