From d11d510c571b10787856395709f9ad945ca70bb2 Mon Sep 17 00:00:00 2001 From: Googler Date: Tue, 7 Feb 2017 19:43:37 +0000 Subject: Move all the resource processing tools into a "busybox". This makes the code simpler as well as reducing the number of targets to build. It also makes testing and profiling different action strategies vastly easier. -- PiperOrigin-RevId: 146812659 MOS_MIGRATED_REVID=146812659 --- .../lib/rules/android/AarGeneratorBuilder.java | 25 ++-- .../AndroidResourceMergingActionBuilder.java | 9 +- .../AndroidResourceParsingActionBuilder.java | 13 +- .../AndroidResourceValidatorActionBuilder.java | 7 +- .../android/AndroidResourcesProcessorBuilder.java | 9 +- .../lib/rules/android/AndroidRuleClasses.java | 30 +---- .../rules/android/ManifestMergerActionBuilder.java | 14 ++- .../android/RClassGeneratorActionBuilder.java | 14 ++- .../android/ResourceShrinkerActionBuilder.java | 32 +++-- .../build/lib/analysis/mock/BazelAnalysisMock.java | 8 +- src/test/shell/bazel/android/BUILD | 11 +- .../java/com/google/devtools/build/android/BUILD | 69 +--------- .../com/google/devtools/build/android/BUILD.tools | 8 ++ .../build/android/ResourceProcessorBusyBox.java | 139 +++++++++++++++++++++ 14 files changed, 239 insertions(+), 149 deletions(-) create mode 100644 src/tools/android/java/com/google/devtools/build/android/ResourceProcessorBusyBox.java (limited to 'src') diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AarGeneratorBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/AarGeneratorBuilder.java index 4a42915da3..41c5ab751d 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AarGeneratorBuilder.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AarGeneratorBuilder.java @@ -83,6 +83,12 @@ public class AarGeneratorBuilder { List outs = new ArrayList<>(); List ins = new ArrayList<>(); List args = new ArrayList<>(); + + // Set the busybox tool + args.add("--tool"); + args.add("GENERATE_AAR"); + // Deliminate between the tool and the tool arguments. + args.add("--"); args.add("--mainData"); addPrimaryResourceContainer(ins, args, primary); @@ -109,15 +115,16 @@ public class AarGeneratorBuilder { args.add(aarOut.getExecPathString()); outs.add(aarOut); - ruleContext.registerAction(this.builder - .addInputs(ImmutableList.copyOf(ins)) - .addOutputs(ImmutableList.copyOf(outs)) - .setCommandLine(CommandLine.of(args, false)) - .setExecutable( - ruleContext.getExecutablePrerequisite("$android_aar_generator", Mode.HOST)) - .setProgressMessage("Building AAR package for " + ruleContext.getLabel()) - .setMnemonic("AARGenerator") - .build(context)); + ruleContext.registerAction( + this.builder + .addInputs(ImmutableList.copyOf(ins)) + .addOutputs(ImmutableList.copyOf(outs)) + .setCommandLine(CommandLine.of(args, false)) + .setExecutable( + ruleContext.getExecutablePrerequisite("$android_resources_busybox", Mode.HOST)) + .setProgressMessage("Building AAR package for " + ruleContext.getLabel()) + .setMnemonic("AARGenerator") + .build(context)); } private void addPrimaryResourceContainer(List inputs, List args, 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 56ab7bfcf2..1e3ae9ccce 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 @@ -35,7 +35,7 @@ import java.util.List; * $android_resource_validator action. For android_binary, see {@link * AndroidResourcesProcessorBuilder}. */ -class AndroidResourceMergingActionBuilder { +public class AndroidResourceMergingActionBuilder { private static final ResourceContainerConverter.ToArtifacts RESOURCE_CONTAINER_TO_ARTIFACTS = ResourceContainerConverter.builder() @@ -107,12 +107,15 @@ class AndroidResourceMergingActionBuilder { public ResourceContainer build(ActionConstructionContext context) { CustomCommandLine.Builder builder = new CustomCommandLine.Builder(); + + // Set the busybox tool. + builder.add("--tool").add("MERGE").add("--"); // Use a FluentIterable to avoid flattening the NestedSets NestedSetBuilder inputs = NestedSetBuilder.naiveLinkOrder(); inputs.addAll( ruleContext - .getExecutablePrerequisite("$android_resource_merger", Mode.HOST) + .getExecutablePrerequisite("$android_resources_busybox", Mode.HOST) .getRunfilesSupport() .getRunfilesArtifactsWithoutMiddlemen()); @@ -162,7 +165,7 @@ class AndroidResourceMergingActionBuilder { .addOutputs(ImmutableList.copyOf(outs)) .setCommandLine(builder.build()) .setExecutable( - ruleContext.getExecutablePrerequisite("$android_resource_merger", Mode.HOST)) + ruleContext.getExecutablePrerequisite("$android_resources_busybox", Mode.HOST)) .setProgressMessage("Merging Android resources for " + ruleContext.getLabel()) .setMnemonic("AndroidResourceMerger") .build(context)); 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 0d86acf744..4a926fd8e4 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 @@ -112,11 +112,16 @@ public class AndroidResourceParsingActionBuilder { public ResourceContainer build(ActionConstructionContext context) { CustomCommandLine.Builder builder = new CustomCommandLine.Builder(); + + // Set the busybox tool. + builder.add("--tool").add("PARSE").add("--"); NestedSetBuilder inputs = NestedSetBuilder.naiveLinkOrder(); - inputs.addAll(ruleContext.getExecutablePrerequisite("$android_resource_parser", Mode.HOST) - .getRunfilesSupport() - .getRunfilesArtifactsWithoutMiddlemen()); + inputs.addAll( + ruleContext + .getExecutablePrerequisite("$android_resources_busybox", Mode.HOST) + .getRunfilesSupport() + .getRunfilesArtifactsWithoutMiddlemen()); Preconditions.checkNotNull(primary); builder.add("--primaryData").add(RESOURCE_CONTAINER_TO_ARG.apply(primary)); @@ -136,7 +141,7 @@ public class AndroidResourceParsingActionBuilder { .addOutputs(ImmutableList.copyOf(outs)) .setCommandLine(builder.build()) .setExecutable( - ruleContext.getExecutablePrerequisite("$android_resource_parser", Mode.HOST)) + ruleContext.getExecutablePrerequisite("$android_resources_busybox", Mode.HOST)) .setProgressMessage("Parsing Android resources for " + ruleContext.getLabel()) .setMnemonic("AndroidResourceParser") .build(context)); diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceValidatorActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceValidatorActionBuilder.java index ce8df5f9fc..66e8b8b3cf 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceValidatorActionBuilder.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceValidatorActionBuilder.java @@ -91,6 +91,9 @@ class AndroidResourceValidatorActionBuilder { public ResourceContainer build(ActionConstructionContext context) { CustomCommandLine.Builder builder = new CustomCommandLine.Builder(); + // Set the busybox tool. + builder.add("--tool").add("VALIDATE").add("--"); + if (!Strings.isNullOrEmpty(sdk.getBuildToolsVersion())) { builder.add("--buildToolsVersion").add(sdk.getBuildToolsVersion()); } @@ -101,7 +104,7 @@ class AndroidResourceValidatorActionBuilder { NestedSetBuilder inputs = NestedSetBuilder.naiveLinkOrder(); inputs.addAll( ruleContext - .getExecutablePrerequisite("$android_resource_validator", Mode.HOST) + .getExecutablePrerequisite("$android_resources_busybox", Mode.HOST) .getRunfilesSupport() .getRunfilesArtifactsWithoutMiddlemen()); @@ -146,7 +149,7 @@ class AndroidResourceValidatorActionBuilder { .addOutputs(ImmutableList.copyOf(outs)) .setCommandLine(builder.build()) .setExecutable( - ruleContext.getExecutablePrerequisite("$android_resource_validator", Mode.HOST)) + ruleContext.getExecutablePrerequisite("$android_resources_busybox", Mode.HOST)) .setProgressMessage("Validating Android resources for " + ruleContext.getLabel()) .setMnemonic("AndroidResourceValidator") .build(context)); diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesProcessorBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesProcessorBuilder.java index 81cec62e5d..c10228c707 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesProcessorBuilder.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesProcessorBuilder.java @@ -201,6 +201,9 @@ public class AndroidResourcesProcessorBuilder { public ResourceContainer build(ActionConstructionContext context) { List outs = new ArrayList<>(); CustomCommandLine.Builder builder = new CustomCommandLine.Builder(); + + // Set the busybox tool. + builder.add("--tool").add("PACKAGE").add("--"); if (!Strings.isNullOrEmpty(sdk.getBuildToolsVersion())) { builder.add("--buildToolsVersion").add(sdk.getBuildToolsVersion()); @@ -209,7 +212,9 @@ public class AndroidResourcesProcessorBuilder { builder.addExecPath("--aapt", sdk.getAapt().getExecutable()); // Use a FluentIterable to avoid flattening the NestedSets NestedSetBuilder inputs = NestedSetBuilder.naiveLinkOrder(); - inputs.addAll(ruleContext.getExecutablePrerequisite("$android_resources_processor", Mode.HOST) + inputs.addAll( + ruleContext + .getExecutablePrerequisite("$android_resources_busybox", Mode.HOST) .getRunfilesSupport() .getRunfilesArtifactsWithoutMiddlemen()); @@ -317,7 +322,7 @@ public class AndroidResourcesProcessorBuilder { .addOutputs(ImmutableList.copyOf(outs)) .setCommandLine(builder.build()) .setExecutable( - ruleContext.getExecutablePrerequisite("$android_resources_processor", Mode.HOST)) + ruleContext.getExecutablePrerequisite("$android_resources_busybox", Mode.HOST)) .setProgressMessage("Processing Android resources for " + ruleContext.getLabel()) .setMnemonic("AndroidAapt") .build(context)); diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java index 3ec2bb41a6..ba552078e5 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java @@ -163,14 +163,7 @@ public final class AndroidRuleClasses { "//tools/android:incremental_stub_application"; public static final String DEFAULT_INCREMENTAL_SPLIT_STUB_APPLICATION = "//tools/android:incremental_split_stub_application"; - public static final String DEFAULT_AAR_GENERATOR = "//tools/android:aar_generator"; - public static final String DEFAULT_MANIFEST_MERGER = "//tools/android:manifest_merger"; - public static final String DEFAULT_RCLASS_GENERATOR = "//tools/android:rclass_generator"; - public static final String DEFAULT_RESOURCES_PROCESSOR = "//tools/android:resources_processor"; - public static final String DEFAULT_RESOURCE_MERGER = "//tools/android:resource_merger"; - public static final String DEFAULT_RESOURCE_PARSER = "//tools/android:resource_parser"; - public static final String DEFAULT_RESOURCE_SHRINKER = "//tools/android:resource_shrinker"; - public static final String DEFAULT_RESOURCE_VALIDATOR = "//tools/android:resource_validator"; + public static final String DEFAULT_RESOURCES_BUSYBOX = "//tools/android:busybox"; public static final String DEFAULT_SDK = "//tools/android:sdk"; /** @@ -423,22 +416,11 @@ public final class AndroidRuleClasses { @Override public RuleClass build(RuleClass.Builder builder, RuleDefinitionEnvironment env) { return builder - .add(attr("$android_aar_generator", LABEL).cfg(HOST).exec().value( - env.getToolsLabel(DEFAULT_AAR_GENERATOR))) - .add(attr("$android_manifest_merger", LABEL).cfg(HOST).exec().value( - env.getToolsLabel(DEFAULT_MANIFEST_MERGER))) - .add(attr("$android_rclass_generator", LABEL).cfg(HOST).exec().value( - env.getToolsLabel(DEFAULT_RCLASS_GENERATOR))) - .add(attr("$android_resources_processor", LABEL).cfg(HOST).exec().value( - env.getToolsLabel(DEFAULT_RESOURCES_PROCESSOR))) - .add(attr("$android_resource_merger", LABEL).cfg(HOST).exec().value( - env.getToolsLabel(DEFAULT_RESOURCE_MERGER))) - .add(attr("$android_resource_parser", LABEL).cfg(HOST).exec().value( - env.getToolsLabel(DEFAULT_RESOURCE_PARSER))) - .add(attr("$android_resource_validator", LABEL).cfg(HOST).exec().value( - env.getToolsLabel(DEFAULT_RESOURCE_VALIDATOR))) - .add(attr("$android_resource_shrinker", LABEL).cfg(HOST).exec().value( - env.getToolsLabel(DEFAULT_RESOURCE_SHRINKER))) + .add( + attr("$android_resources_busybox", LABEL) + .cfg(HOST) + .exec() + .value(env.getToolsLabel(DEFAULT_RESOURCES_BUSYBOX))) .build(); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ManifestMergerActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/ManifestMergerActionBuilder.java index af679f0509..c84e3fd1a3 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/ManifestMergerActionBuilder.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/ManifestMergerActionBuilder.java @@ -25,7 +25,6 @@ import com.google.devtools.build.lib.analysis.actions.CustomCommandLine; import com.google.devtools.build.lib.analysis.actions.SpawnAction; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; - import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; @@ -89,10 +88,15 @@ public class ManifestMergerActionBuilder { NestedSetBuilder inputs = NestedSetBuilder.naiveLinkOrder(); ImmutableList.Builder outputs = ImmutableList.builder(); CustomCommandLine.Builder builder = new CustomCommandLine.Builder(); + + // Set the busybox tool. + builder.add("--tool").add("MERGE_MANIFEST").add("--"); - inputs.addAll(ruleContext.getExecutablePrerequisite("$android_manifest_merger", Mode.HOST) - .getRunfilesSupport() - .getRunfilesArtifactsWithoutMiddlemen()); + inputs.addAll( + ruleContext + .getExecutablePrerequisite("$android_resources_busybox", Mode.HOST) + .getRunfilesSupport() + .getRunfilesArtifactsWithoutMiddlemen()); builder.addExecPath("--manifest", manifest); inputs.add(manifest); @@ -135,7 +139,7 @@ public class ManifestMergerActionBuilder { .addOutputs(outputs.build()) .setCommandLine(builder.build()) .setExecutable( - ruleContext.getExecutablePrerequisite("$android_manifest_merger", Mode.HOST)) + ruleContext.getExecutablePrerequisite("$android_resources_busybox", Mode.HOST)) .setProgressMessage("Merging manifest for " + ruleContext.getLabel()) .setMnemonic("ManifestMerger") .build(context)); 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 f9597c4a57..aec168286d 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 @@ -98,10 +98,16 @@ public class RClassGeneratorActionBuilder { public void build() { CustomCommandLine.Builder builder = new CustomCommandLine.Builder(); + + // Set the busybox tool. + builder.add("--tool").add("GENERATE_BINARY_R").add("--"); + NestedSetBuilder inputs = NestedSetBuilder.naiveLinkOrder(); - inputs.addAll(ruleContext.getExecutablePrerequisite("$android_rclass_generator", Mode.HOST) - .getRunfilesSupport() - .getRunfilesArtifactsWithoutMiddlemen()); + inputs.addAll( + ruleContext + .getExecutablePrerequisite("$android_resources_busybox", Mode.HOST) + .getRunfilesSupport() + .getRunfilesArtifactsWithoutMiddlemen()); List outs = new ArrayList<>(); if (primary.getRTxt() != null) { @@ -138,7 +144,7 @@ public class RClassGeneratorActionBuilder { .useParameterFile(ParameterFileType.SHELL_QUOTED) .setCommandLine(builder.build()) .setExecutable( - ruleContext.getExecutablePrerequisite("$android_rclass_generator", Mode.HOST)) + ruleContext.getExecutablePrerequisite("$android_resources_busybox", Mode.HOST)) .setProgressMessage("Generating R Classes: " + ruleContext.getLabel()) .setMnemonic("RClassGenerator") .build(ruleContext)); 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 beb7370d5a..4d234291c6 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 @@ -144,10 +144,15 @@ public class ResourceShrinkerActionBuilder { ImmutableList.Builder outputs = ImmutableList.builder(); CustomCommandLine.Builder commandLine = new CustomCommandLine.Builder(); + + // Set the busybox tool. + commandLine.add("--tool").add("SHRINK").add("--"); - inputs.addAll(ruleContext.getExecutablePrerequisite("$android_resource_shrinker", Mode.HOST) - .getRunfilesSupport() - .getRunfilesArtifactsWithoutMiddlemen()); + inputs.addAll( + ruleContext + .getExecutablePrerequisite("$android_resources_busybox", Mode.HOST) + .getRunfilesSupport() + .getRunfilesArtifactsWithoutMiddlemen()); commandLine.addExecPath("--aapt", sdk.getAapt().getExecutable()); @@ -208,16 +213,17 @@ public class ResourceShrinkerActionBuilder { commandLine.addExecPath("--log", logOut); outputs.add(logOut); - ruleContext.registerAction(spawnActionBuilder - .addTool(sdk.getAapt()) - .addInputs(inputs.build()) - .addOutputs(outputs.build()) - .setCommandLine(commandLine.build()) - .setExecutable(ruleContext.getExecutablePrerequisite( - "$android_resource_shrinker", Mode.HOST)) - .setProgressMessage("Shrinking resources for " + ruleContext.getLabel()) - .setMnemonic("ResourceShrinker") - .build(ruleContext)); + ruleContext.registerAction( + spawnActionBuilder + .addTool(sdk.getAapt()) + .addInputs(inputs.build()) + .addOutputs(outputs.build()) + .setCommandLine(commandLine.build()) + .setExecutable( + ruleContext.getExecutablePrerequisite("$android_resources_busybox", Mode.HOST)) + .setProgressMessage("Shrinking resources for " + ruleContext.getLabel()) + .setMnemonic("ResourceShrinker") + .build(ruleContext)); return resourceApkOut; } diff --git a/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java b/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java index c22249b24e..aff2791531 100644 --- a/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java +++ b/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java @@ -166,13 +166,7 @@ public final class BazelAnalysisMock extends AnalysisMock { .add("sh_binary(name = 'aar_native_libs_zip_creator', srcs = ['empty.sh'])") .add("sh_binary(name = 'dexbuilder', srcs = ['empty.sh'])") .add("sh_binary(name = 'dexmerger', srcs = ['empty.sh'])") - .add("sh_binary(name = 'manifest_merger', srcs = ['empty.sh'])") - .add("sh_binary(name = 'rclass_generator', srcs = ['empty.sh'])") - .add("sh_binary(name = 'resources_processor', srcs = ['empty.sh'])") - .add("sh_binary(name = 'resource_merger', srcs = ['empty.sh'])") - .add("sh_binary(name = 'resource_parser', srcs = ['empty.sh'])") - .add("sh_binary(name = 'resource_shrinker', srcs = ['empty.sh'])") - .add("sh_binary(name = 'resource_validator', srcs = ['empty.sh'])") + .add("sh_binary(name = 'busybox', srcs = ['empty.sh'])") .add("sh_binary(name = 'rex_wrapper', srcs = ['empty.sh'])") .add("android_library(name = 'incremental_stub_application')") .add("android_library(name = 'incremental_split_stub_application')") diff --git a/src/test/shell/bazel/android/BUILD b/src/test/shell/bazel/android/BUILD index 0bd8a35e72..758ddd6c10 100644 --- a/src/test/shell/bazel/android/BUILD +++ b/src/test/shell/bazel/android/BUILD @@ -16,15 +16,6 @@ sh_test( # labels, there isn't really a better option. "//external:android_ndk_for_testing", "//external:android_sdk_for_testing", - "//src/tools/android/java/com/google/devtools/build/android:AarGeneratorAction_deploy.jar", - "//src/tools/android/java/com/google/devtools/build/android:AndroidResourceMergingAction_deploy.jar", - "//src/tools/android/java/com/google/devtools/build/android:AndroidResourceParsingAction_deploy.jar", - "//src/tools/android/java/com/google/devtools/build/android:AndroidResourceProcessingAction_deploy.jar", - "//src/tools/android/java/com/google/devtools/build/android:AndroidResourceValidatorAction_deploy.jar", - "//src/tools/android/java/com/google/devtools/build/android:RClassGeneratorAction_deploy.jar", - "//src/tools/android/java/com/google/devtools/build/android:ResourceShrinkerAction_deploy.jar", - "//src/tools/android/java/com/google/devtools/build/android/incrementaldeployment:srcs", - "//src/tools/android/java/com/google/devtools/build/android/ziputils:mapper_deploy.jar", - "//src/tools/android/java/com/google/devtools/build/android/ziputils:reducer_deploy.jar", + "//src/tools/android/java/com/google/devtools/build/android:ResourceProcessorBusyBox_deploy.jar", ], ) diff --git a/src/tools/android/java/com/google/devtools/build/android/BUILD b/src/tools/android/java/com/google/devtools/build/android/BUILD index a132eea724..a4b1ca1b54 100644 --- a/src/tools/android/java/com/google/devtools/build/android/BUILD +++ b/src/tools/android/java/com/google/devtools/build/android/BUILD @@ -17,73 +17,10 @@ java_binary( runtime_deps = [":android_builder_lib"], ) +# Used by //src/test/shell/bazel/android:android_integration_test java_binary( - name = "AarGeneratorAction", - main_class = "com.google.devtools.build.android.AarGeneratorAction", - runtime_deps = [ - ":android_builder_lib", - ], -) - -java_binary( - name = "AndroidResourceMergingAction", - main_class = "com.google.devtools.build.android.AndroidResourceMergingAction", - runtime_deps = [ - ":android_builder_lib", - ], -) - -java_binary( - name = "AndroidResourceParsingAction", - main_class = "com.google.devtools.build.android.AndroidResourceParsingAction", - runtime_deps = [ - ":android_builder_lib", - ], -) - -java_binary( - name = "AndroidResourceProcessingAction", - main_class = "com.google.devtools.build.android.AndroidResourceProcessingAction", - runtime_deps = [ - ":android_builder_lib", - ], -) - -java_binary( - name = "AndroidResourceValidatorAction", - main_class = "com.google.devtools.build.android.AndroidResourceValidatorAction", - runtime_deps = [ - ":android_builder_lib", - ], -) - -java_binary( - name = "ManifestMergerAction", - main_class = "com.google.devtools.build.android.ManifestMergerAction", - runtime_deps = [ - ":android_builder_lib", - ], -) - -java_binary( - name = "RClassGeneratorAction", - main_class = "com.google.devtools.build.android.RClassGeneratorAction", - runtime_deps = [ - ":android_builder_lib", - ], -) - -java_binary( - name = "LibraryRClassGeneratorAction", - main_class = "com.google.devtools.build.android.LibraryRClassGeneratorAction", - runtime_deps = [ - ":android_builder_lib", - ], -) - -java_binary( - name = "ResourceShrinkerAction", - main_class = "com.google.devtools.build.android.ResourceShinkerAction", + name = "ResourceProcessorBusyBox", + main_class = "com.google.devtools.build.android.ResourceProcessorBusyBox", runtime_deps = [ ":android_builder_lib", ], diff --git a/src/tools/android/java/com/google/devtools/build/android/BUILD.tools b/src/tools/android/java/com/google/devtools/build/android/BUILD.tools index ab09887ed6..c50dbf3855 100644 --- a/src/tools/android/java/com/google/devtools/build/android/BUILD.tools +++ b/src/tools/android/java/com/google/devtools/build/android/BUILD.tools @@ -76,3 +76,11 @@ java_binary( ":classes", ], ) + +java_binary( + name = "ResourceProcessorBusyBox", + main_class = "com.google.devtools.build.android.ResourceProcessorBusyBox", + runtime_deps = [ + ":classes", + ], +) diff --git a/src/tools/android/java/com/google/devtools/build/android/ResourceProcessorBusyBox.java b/src/tools/android/java/com/google/devtools/build/android/ResourceProcessorBusyBox.java new file mode 100644 index 0000000000..553fe7c9d6 --- /dev/null +++ b/src/tools/android/java/com/google/devtools/build/android/ResourceProcessorBusyBox.java @@ -0,0 +1,139 @@ +// Copyright 2017 The Bazel Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.devtools.build.android; + +import com.google.devtools.common.options.EnumConverter; +import com.google.devtools.common.options.Option; +import com.google.devtools.common.options.OptionsBase; +import com.google.devtools.common.options.OptionsParser; +import java.nio.file.FileSystems; + +/** + * Provides an entry point for the resource processing stages. + * + *

A single entry point simplifies the build tool binary configuration and keeps the size of tool + * jar small, as opposed to multiple tools for each prosess step. It also makes it easy to prototype + * changes in the resource processing system. + * + *

+ * Example Usage:
+ *   java/com/google/build/android/ResourceProcessorBusyBox\
+ *      --tool PACKAGE\
+ *      --sdkRoot path/to/sdk\
+ *      --aapt path/to/sdk/aapt\
+ *      --annotationJar path/to/sdk/annotationJar\
+ *      --adb path/to/sdk/adb\
+ *      --zipAlign path/to/sdk/zipAlign\
+ *      --androidJar path/to/sdk/androidJar\
+ *      --manifestOutput path/to/manifest\
+ *      --primaryData path/to/resources:path/to/assets:path/to/manifest\
+ *      --data p/t/res1:p/t/assets1:p/t/1/AndroidManifest.xml:p/t/1/R.txt:symbols,\
+ *             p/t/res2:p/t/assets2:p/t/2/AndroidManifest.xml:p/t/2/R.txt:symbols\
+ *      --packagePath path/to/write/archive.ap_\
+ *      --srcJarOutput path/to/write/archive.srcjar
+ * 
+ */ +public class ResourceProcessorBusyBox { + static enum Tool { + PACKAGE() { + @Override + void call(String[] args) throws Exception { + AndroidResourceProcessingAction.main(args); + } + }, + VALIDATE() { + @Override + void call(String[] args) throws Exception { + AndroidResourceValidatorAction.main(args); + } + }, + GENERATE_BINARY_R() { + @Override + void call(String[] args) throws Exception { + RClassGeneratorAction.main(args); + } + }, + GENERATE_LIBRARY_R() { + @Override + void call(String[] args) throws Exception { + LibraryRClassGeneratorAction.main(args); + } + }, + PARSE() { + @Override + void call(String[] args) throws Exception { + AndroidResourceParsingAction.main(args); + } + }, + MERGE() { + @Override + void call(String[] args) throws Exception { + AndroidResourceMergingAction.main(args); + } + }, + GENERATE_AAR() { + @Override + void call(String[] args) throws Exception { + AarGeneratorAction.main(args); + } + }, + SHRINK() { + @Override + void call(String[] args) throws Exception { + ResourceShrinkerAction.main(args); + } + }, + MERGE_MANIFEST() { + @Override + void call(String[] args) throws Exception { + ManifestMergerAction.main(args); + } + }; + + abstract void call(String[] args) throws Exception; + } + + /** Converter for the Tool enum. */ + public static final class ToolConverter extends EnumConverter { + + public ToolConverter() { + super(Tool.class, "resource tool"); + } + } + + /** Flag specifications for this action. */ + public static final class Options extends OptionsBase { + @Option( + name = "tool", + defaultValue = "null", + converter = ToolConverter.class, + category = "input", + help = + "The processing tool to execute. " + + "Valid tools: PACKAGE, VALIDATE, GENERATE_BINARY_R, GENERATE_LIBRARY_R, PARSE, " + + "MERGE, GENERATE_AAR, SHRINK, MERGE_MANIFEST." + ) + public Tool tool; + } + + public static void main(String[] args) throws Exception { + OptionsParser optionsParser = OptionsParser.newOptionsParser(Options.class); + optionsParser.setAllowResidue(true); + optionsParser.enableParamsFileSupport(FileSystems.getDefault()); + optionsParser.parse(args); + Options options = optionsParser.getOptions(Options.class); + options.tool.call(optionsParser.getResidue().toArray(new String[0])); + } +} -- cgit v1.2.3