diff options
author | Lukacs Berki <lberki@google.com> | 2015-06-24 06:04:53 +0000 |
---|---|---|
committer | Damien Martin-Guillerez <dmarting@google.com> | 2015-06-24 12:08:27 +0000 |
commit | 36077ffdab207706989d96216c5fb843e72a66f9 (patch) | |
tree | fd6cd7daf2aba872fad534403307b4b822cc072a /src/main/java/com/google/devtools/build/lib/rules | |
parent | 90723bfc6e66f823d677b2eb7159daf7deaa211a (diff) |
Remove support for non-android_sdk Android SDKs.
AndroidTools is not passed around anymore. This comes at the cost of having to remember to raise an error in every rule configured target factory, but I think this is preferable to shuttling a variable around.
--
MOS_MIGRATED_REVID=96746874
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules')
10 files changed, 183 insertions, 513 deletions
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 a0b75d8d81..83ae86002d 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 @@ -20,7 +20,7 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Iterators; import com.google.devtools.build.lib.actions.Action; import com.google.devtools.build.lib.actions.Artifact; -import com.google.devtools.build.lib.analysis.FilesToRunProvider; +import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; 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.CommandLine; @@ -44,19 +44,15 @@ public class AarGeneratorBuilder { private Artifact aarOut; - private final AndroidTools androidTools; private final RuleContext ruleContext; private final SpawnAction.Builder builder; /** * Creates an {@link AarGeneratorBuilder}. * - * @param androidTools A configured {@link AndroidTools} to retrieve the - * {@link FilesToRunProvider} for the AarGeneratorAction. * @param ruleContext The {@link RuleContext} that is used to register the {@link Action}. */ - public AarGeneratorBuilder(AndroidTools androidTools, RuleContext ruleContext) { - this.androidTools = androidTools; + public AarGeneratorBuilder(RuleContext ruleContext) { this.ruleContext = ruleContext; this.builder = new SpawnAction.Builder(); } @@ -129,7 +125,8 @@ public class AarGeneratorBuilder { .addInputs(ImmutableList.<Artifact>copyOf(ins)) .addOutputs(ImmutableList.<Artifact>copyOf(outs)) .setCommandLine(CommandLine.of(args, false)) - .setExecutable(androidTools.getAarGenerator()) + .setExecutable( + ruleContext.getExecutablePrerequisite(":android_aar_generator", Mode.HOST)) .setProgressMessage("Building AAR package") .setMnemonic("AARGenerator") .build(context)); diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidAaptActionHelper.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidAaptActionHelper.java index 7ba64f7354..2bcec39c9f 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidAaptActionHelper.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidAaptActionHelper.java @@ -20,6 +20,8 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.ParameterFile.ParameterFileType; +import com.google.devtools.build.lib.analysis.FilesToRunProvider; +import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.RunfilesSupport; import com.google.devtools.build.lib.analysis.actions.CommandLine; @@ -44,7 +46,6 @@ public final class AndroidAaptActionHelper { private final Artifact manifest; private final Collection<Artifact> inputs = new LinkedHashSet<>(); private final List<ResourceContainer> resourceContainers; - private final AndroidTools tools; /** * Constructs an instance of AndroidAaptActionHelper. @@ -54,14 +55,12 @@ public final class AndroidAaptActionHelper { * @param manifest Artifact representing the AndroidManifest.xml that will be * used to package resources. * @param resourceContainers The transitive closure of the ResourceContainers. - * @param tools AndroidTools used for creating the approriate actions. */ public AndroidAaptActionHelper(RuleContext ruleContext, Artifact manifest, - List<ResourceContainer> resourceContainers, AndroidTools tools) { + List<ResourceContainer> resourceContainers) { this.ruleContext = ruleContext; this.manifest = manifest; this.resourceContainers = resourceContainers; - this.tools = tools; } /** @@ -69,14 +68,16 @@ public final class AndroidAaptActionHelper { */ private Iterable<Artifact> getInputs() { if (inputs.isEmpty()) { + FilesToRunProvider toolRunner = + ruleContext.getExecutablePrerequisite("$android_tool_runner", Mode.HOST); // TODO(bazel-team): When using getFilesToRun(), the middleman is // not expanded. Fix by providing code to expand and use getFilesToRun here. - RunfilesSupport aaptRunnerRunfiles = tools.getToolRunner().getRunfilesSupport(); - Preconditions.checkState(aaptRunnerRunfiles != null, tools.getToolRunner().getLabel()); + RunfilesSupport aaptRunnerRunfiles = toolRunner.getRunfilesSupport(); + Preconditions.checkState(aaptRunnerRunfiles != null, toolRunner.getLabel()); // Note the below may be an overapproximation of the actual runfiles, due to "conditional // artifacts" (see Runfiles.PruningManifest). Iterables.addAll(inputs, aaptRunnerRunfiles.getRunfilesArtifactsWithoutMiddlemen()); - inputs.add(tools.getAndroidJar()); + inputs.add(AndroidSdkProvider.fromRuleContext(ruleContext).getAndroidJar()); inputs.add(manifest); Iterables.addAll(inputs, Iterables.concat(Iterables.transform(resourceContainers, new Function<AndroidResourcesProvider.ResourceContainer, Iterable<Artifact>>() { @@ -119,8 +120,9 @@ public final class AndroidAaptActionHelper { javaPackage)); final Builder builder = new SpawnAction.Builder() .addInputs(getInputs()) - .addTool(tools.getAapt()) - .setExecutable(tools.getAaptJavaGenerator()) + .addTool(AndroidSdkProvider.fromRuleContext(ruleContext).getAapt()) + .setExecutable( + ruleContext.getExecutablePrerequisite("$android_aapt_java_generator", Mode.HOST)) .addOutput(javaSourcesJar) .setCommandLine(CommandLine.of(args, false)) .useParameterFile(ParameterFileType.UNQUOTED) @@ -158,9 +160,10 @@ public final class AndroidAaptActionHelper { ruleContext.registerAction(new SpawnAction.Builder() .addInputs(getInputs()) - .addTool(tools.getAapt()) + .addTool(AndroidSdkProvider.fromRuleContext(ruleContext).getAapt()) .addOutput(apk) - .setExecutable(tools.getApkGenerator()) + .setExecutable( + ruleContext.getExecutablePrerequisite("$android_aapt_apk_generator", Mode.HOST)) .setCommandLine(CommandLine.of(args, false)) .useParameterFile(ParameterFileType.UNQUOTED) .setProgressMessage("Generating apk resources") @@ -173,8 +176,10 @@ public final class AndroidAaptActionHelper { List<String> args = new ArrayList<>(); args.addAll(getArgs(output, actionKind, ResourceType.RESOURCES)); args.addAll(getArgs(output, actionKind, ResourceType.ASSETS)); - args.add(tools.getToolRunner().getExecutable().getExecPathString()); - args.add(tools.getAapt().getExecutable().getExecPathString()); + args.add(ruleContext.getExecutablePrerequisite("$android_tool_runner", Mode.HOST) + .getExecutable().getExecPathString()); + args.add( + AndroidSdkProvider.fromRuleContext(ruleContext).getAapt().getExecutable().getExecPathString()); args.add("package"); Collections.addAll(args, outputArgs); // Allow overlay in case the same resource appears in more than one target, @@ -192,7 +197,7 @@ public final class AndroidAaptActionHelper { args.add("--debug-mode"); } args.add("-I"); - args.add(tools.getAndroidJar().getExecPathString()); + args.add(AndroidSdkProvider.fromRuleContext(ruleContext).getAndroidJar().getExecPathString()); args.add("-M"); args.add(manifest.getExecPathString()); args.addAll(getResourcesDirArg(output, actionKind, "-S", ResourceType.RESOURCES)); @@ -266,9 +271,10 @@ public final class AndroidAaptActionHelper { "-G", outputSpec.getExecPathString()); ruleContext.registerAction(new SpawnAction.Builder() .addInputs(getInputs()) - .addTool(tools.getAapt()) + .addTool(AndroidSdkProvider.fromRuleContext(ruleContext).getAapt()) .addOutput(outputSpec) - .setExecutable(tools.getApkGenerator()) + .setExecutable( + ruleContext.getExecutablePrerequisite("$android_aapt_apk_generator", Mode.HOST)) .setCommandLine(CommandLine.of(aaptCommand, false)) .useParameterFile(ParameterFileType.UNQUOTED) .setProgressMessage("Generating Proguard Configuration") diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java index 0f52356e57..0a5bbf1d3a 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java @@ -80,6 +80,9 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { public ConfiguredTarget create(RuleContext ruleContext) { JavaSemantics javaSemantics = createJavaSemantics(); AndroidSemantics androidSemantics = createAndroidSemantics(); + if (!AndroidSdkProvider.verifyPresence(ruleContext)) { + return null; + } NestedSetBuilder<Artifact> filesBuilder = NestedSetBuilder.stableOrder(); ImmutableList<TransitiveInfoCollection> deps = ImmutableList.<TransitiveInfoCollection>copyOf( @@ -89,15 +92,11 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { AndroidCommon androidCommon = new AndroidCommon( ruleContext, javaCommon, true /* asNeverLink */, true /* exportDeps */); - AndroidTools tools = AndroidTools.fromRuleContext(ruleContext); - if (tools == null) { - return null; - } try { RuleConfiguredTargetBuilder builder = init(ruleContext, filesBuilder, getTransitiveResourceContainers(ruleContext, ImmutableList.of("resources", "deps")), - javaCommon, androidCommon, javaSemantics, androidSemantics, tools, + javaCommon, androidCommon, javaSemantics, androidSemantics, ImmutableList.<String>of("deps")); if (builder == null) { return null; @@ -118,7 +117,6 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { AndroidCommon androidCommon, JavaSemantics javaSemantics, AndroidSemantics androidSemantics, - AndroidTools tools, List<String> depsAttributes) { // TODO(bazel-team): Find a way to simplify this code. // treeKeys() means that the resulting map sorts the entries by key, which is necessary to @@ -177,7 +175,6 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_RESOURCES_APK), ruleContext, resourceContainers, - tools, null, /* Artifact rTxt */ null, /* Artifact symbolsTxt */ ruleContext.getTokenizedStringListAttr("resource_configuration_filters"), @@ -192,7 +189,6 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { .getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_INCREMENTAL_RESOURCES_APK), ruleContext, resourceContainers, - tools, null, /* Artifact rTxt */ null, /* Artifact symbolsTxt */ ruleContext.getTokenizedStringListAttr("resource_configuration_filters"), @@ -207,7 +203,6 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { .packWithDataAndResources(getDxArtifact(ruleContext, "android_resources.ap_"), ruleContext, resourceContainers, - tools, null, /* Artifact rTxt */ null, /* Artifact symbolsTxt */ ruleContext.getTokenizedStringListAttr("resource_configuration_filters"), @@ -228,11 +223,10 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_RESOURCES_APK), ruleContext, resourceContainers, - tools, true, getProguardConfigArtifact(ruleContext, "")); } else { - resourceApk = applicationManifest.useCurrentResources(ruleContext, tools, + resourceApk = applicationManifest.useCurrentResources(ruleContext, getProguardConfigArtifact(ruleContext, "")); } incrementalResourceApk = applicationManifest @@ -242,7 +236,6 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { AndroidRuleClasses.ANDROID_INCREMENTAL_RESOURCES_APK), ruleContext, resourceContainers, - tools, false, getProguardConfigArtifact(ruleContext, "incremental")); @@ -251,13 +244,12 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { .packWithResources(getDxArtifact(ruleContext, "android_resources.ap_"), ruleContext, resourceContainers, - tools, false, getProguardConfigArtifact(ruleContext, "incremental_split")); } JavaTargetAttributes resourceClasses = androidCommon.init( - javaSemantics, androidSemantics, tools, resourceApk, AndroidIdlProvider.EMPTY, + javaSemantics, androidSemantics, resourceApk, AndroidIdlProvider.EMPTY, ruleContext.getConfiguration().isCodeCoverageEnabled(), true); if (resourceClasses == null) { return null; @@ -273,7 +265,6 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { androidCommon, javaSemantics, androidSemantics, - tools, nativeLibs, applicationManifest, resourceApk, @@ -292,7 +283,6 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { AndroidCommon androidCommon, JavaSemantics javaSemantics, AndroidSemantics androidSemantics, - AndroidTools tools, NativeLibs nativeLibs, ApplicationManifest applicationManifest, ResourceApk resourceApk, @@ -308,16 +298,13 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { filesBuilder, resourceApk, ruleContext.getPrerequisiteArtifacts(PROGUARD_SPECS, Mode.TARGET).list(), - proguardMapping, - tools); + proguardMapping); Artifact jarToDex = proguardOutput.outputJar; DexingOutput dexingOutput = shouldDexWithJack(ruleContext) ? dexWithJack(ruleContext, androidCommon) : dex( ruleContext, - androidSemantics, - tools, getMultidexMode(ruleContext), ruleContext.getTokenizedStringListAttr("dexopts"), deployJar, @@ -330,7 +317,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { Artifact signedApk = ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_BINARY_SIGNED_APK); - ApkActionBuilder apkBuilder = new ApkActionBuilder(ruleContext, androidSemantics, tools) + ApkActionBuilder apkBuilder = new ApkActionBuilder(ruleContext, androidSemantics) .classesDex(dexingOutput.classesDexZip) .resourceApk(resourceApk.getArtifact()) .javaResourceZip(dexingOutput.javaResourceJar) @@ -347,7 +334,6 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { Artifact zipAlignedApk = zipalignApk( ruleContext, - tools, signedApk, ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_BINARY_APK)); @@ -389,8 +375,8 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { Artifact stubData = ruleContext.getImplicitOutputArtifact( AndroidRuleClasses.STUB_APPLICATION_DATA); - ruleContext.registerAction(new ApkActionBuilder(ruleContext, androidSemantics, tools) - .classesDex(getStubDex(ruleContext, javaSemantics, androidSemantics, tools, false)) + ruleContext.registerAction(new ApkActionBuilder(ruleContext, androidSemantics) + .classesDex(getStubDex(ruleContext, javaSemantics, false)) .resourceApk(incrementalResourceApk.getArtifact()) .javaResourceZip(dexingOutput.javaResourceJar) .nativeLibs(nativeLibs) @@ -404,10 +390,10 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { ruleContext.registerAction( new WriteAdbArgsAction(ruleContext.getActionOwner(), argsArtifact)); - createInstallAction(ruleContext, tools, false, fullDeployMarker, argsArtifact, + createInstallAction(ruleContext, false, fullDeployMarker, argsArtifact, incrementalDexManifest, incrementalResourceApk.getArtifact(), incrementalApk, stubData); - createInstallAction(ruleContext, tools, true, incrementalDeployMarker, + createInstallAction(ruleContext, true, incrementalDeployMarker, argsArtifact, incrementalDexManifest, incrementalResourceApk.getArtifact(), @@ -419,9 +405,9 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { for (int i = 0; i < dexingOutput.shardDexZips.size(); i++) { String splitName = "dex" + (i + 1); Artifact splitApkResources = createSplitApkResources( - ruleContext, tools, applicationManifest, splitName, true); + ruleContext, applicationManifest, splitName, true); Artifact splitApk = getDxArtifact(ruleContext, splitName + ".apk"); - ruleContext.registerAction(new ApkActionBuilder(ruleContext, androidSemantics, tools) + ruleContext.registerAction(new ApkActionBuilder(ruleContext, androidSemantics) .classesDex(dexingOutput.shardDexZips.get(i)) .resourceApk(splitApkResources) .sign(true) @@ -431,9 +417,9 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { } Artifact nativeSplitApkResources = createSplitApkResources( - ruleContext, tools, applicationManifest, "native", false); + ruleContext, applicationManifest, "native", false); Artifact nativeSplitApk = getDxArtifact(ruleContext, "native.apk"); - ruleContext.registerAction(new ApkActionBuilder(ruleContext, androidSemantics, tools) + ruleContext.registerAction(new ApkActionBuilder(ruleContext, androidSemantics) .resourceApk(nativeSplitApkResources) .sign(true) .message("Generating split native apk") @@ -442,9 +428,9 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { splitApkSetBuilder.add(nativeSplitApk); Artifact javaSplitApkResources = createSplitApkResources( - ruleContext, tools, applicationManifest, "java_resources", false); + ruleContext, applicationManifest, "java_resources", false); Artifact javaSplitApk = getDxArtifact(ruleContext, "java_resources.apk"); - ruleContext.registerAction(new ApkActionBuilder(ruleContext, androidSemantics, tools) + ruleContext.registerAction(new ApkActionBuilder(ruleContext, androidSemantics) .resourceApk(javaSplitApkResources) .javaResourceZip(dexingOutput.javaResourceJar) .sign(true) @@ -453,7 +439,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { splitApkSetBuilder.add(javaSplitApk); Artifact resourceSplitApk = getDxArtifact(ruleContext, "android_resources.apk"); - ruleContext.registerAction(new ApkActionBuilder(ruleContext, androidSemantics, tools) + ruleContext.registerAction(new ApkActionBuilder(ruleContext, androidSemantics) .resourceApk(splitResourceApk.getArtifact()) .sign(true) .message("Generating split Android resource apk") @@ -473,16 +459,16 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { NestedSet<Artifact> splitApks = splitApkSetBuilder.build(); Artifact splitMainApk = getDxArtifact(ruleContext, "split_main.apk"); - ruleContext.registerAction(new ApkActionBuilder(ruleContext, androidSemantics, tools) + ruleContext.registerAction(new ApkActionBuilder(ruleContext, androidSemantics) .resourceApk(splitMainApkResources) - .classesDex(getStubDex(ruleContext, javaSemantics, androidSemantics, tools, true)) + .classesDex(getStubDex(ruleContext, javaSemantics, true)) .sign(true) .message("Generating split main apk") .build(splitMainApk)); splitApkSetBuilder.add(splitMainApk); NestedSet<Artifact> allSplitApks = splitApkSetBuilder.build(); - createSplitInstallAction(ruleContext, tools, splitDeployMarker, argsArtifact, splitMainApk, + createSplitInstallAction(ruleContext, splitDeployMarker, argsArtifact, splitMainApk, splitApks, stubData); NestedSet<Artifact> splitOutputGroup = NestedSetBuilder.<Artifact>stableOrder() @@ -490,7 +476,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { .add(splitDeployMarker) .build(); - androidCommon.addTransitiveInfoProviders(builder, tools); + androidCommon.addTransitiveInfoProviders(builder); androidSemantics.addTransitiveInfoProviders(builder, ruleContext, javaCommon, androidCommon, jarToDex, resourceApk, zipAlignedApk, apksUnderTest); @@ -514,10 +500,10 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { .addOutputGroup("mobile_install_split", splitOutputGroup); } - private static void createSplitInstallAction(RuleContext ruleContext, AndroidTools tools, + private static void createSplitInstallAction(RuleContext ruleContext, Artifact marker, Artifact argsArtifact, Artifact splitMainApk, NestedSet<Artifact> splitApks, Artifact stubDataFile) { - FilesToRunProvider adb = tools.getAdb(); + FilesToRunProvider adb = AndroidSdkProvider.fromRuleContext(ruleContext).getAdb(); SpawnAction.Builder builder = new SpawnAction.Builder() .setExecutable(ruleContext.getExecutablePrerequisite("$incremental_install", Mode.HOST)) .addTool(adb) @@ -547,9 +533,9 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { } private static void createInstallAction(RuleContext ruleContext, - AndroidTools tools, boolean incremental, Artifact marker, Artifact argsArtifact, + boolean incremental, Artifact marker, Artifact argsArtifact, Artifact dexmanifest, Artifact resourceApk, Artifact apk, Artifact stubDataFile) { - + FilesToRunProvider adb = AndroidSdkProvider.fromRuleContext(ruleContext).getAdb(); SpawnAction.Builder builder = new SpawnAction.Builder() .setExecutable(ruleContext.getExecutablePrerequisite("$incremental_install", Mode.HOST)) // We cannot know if the user connected a new device, uninstalled the app from the device @@ -568,11 +554,10 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { .addArgument("--stub_datafile") .addInputArgument(stubDataFile) .addArgument("--adb") - .addArgument(tools.getAdb().getExecutable().getExecPathString()) - .addTool(tools.getAdb()) + .addArgument(adb.getExecutable().getExecPathString()) + .addTool(adb) .addArgument("--flagfile") - .addInputArgument(argsArtifact) - .addTool(tools.getAdb()); + .addInputArgument(argsArtifact); if (!incremental) { builder @@ -583,8 +568,8 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { ruleContext.registerAction(builder.build(ruleContext)); } - private static Artifact getStubDex(RuleContext ruleContext, JavaSemantics javaSemantics, - AndroidSemantics androidSemantics, AndroidTools tools, boolean split) { + private static Artifact getStubDex( + RuleContext ruleContext, JavaSemantics javaSemantics, boolean split) { JavaCompilationArgs dep = ruleContext .getPrerequisite( split ? ":incremental_split_stub_application" : ":incremental_stub_application", @@ -607,8 +592,6 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { split ? "split_stub_application.dex" : "stub_application.dex"); AndroidCommon.createDexAction( ruleContext, - androidSemantics, - tools, stubDeployJar, stubDex, ImmutableList.<String>of(), @@ -656,8 +639,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { NestedSetBuilder<Artifact> filesBuilder, ResourceApk resourceApk, ImmutableList<Artifact> proguardSpecs, - Artifact proguardMapping, - AndroidTools tools) { + Artifact proguardMapping) { // Proguard will be only used for binaries which specify a proguard_spec if (proguardSpecs.isEmpty()) { return new ProguardOutput(deployJarArtifact, null); @@ -674,8 +656,9 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { proguardSpecs = builder.build().asList(); Artifact proguardOutputJar = ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_BINARY_PROGUARD_JAR); - return createProguardAction(ruleContext, common, tools.getProguard(), deployJarArtifact, - proguardSpecs, proguardMapping, tools.getAndroidJar(), proguardOutputJar, filesBuilder); + AndroidSdkProvider sdk = AndroidSdkProvider.fromRuleContext(ruleContext); + return createProguardAction(ruleContext, common, sdk.getProguard(), deployJarArtifact, + proguardSpecs, proguardMapping, sdk.getAndroidJar(), proguardOutputJar, filesBuilder); } private static ProguardOutput createProguardAction(RuleContext ruleContext, AndroidCommon common, @@ -766,12 +749,12 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { } /** Dexes the ProguardedJar to generate ClassesDex that has a reference classes.dex. */ - static DexingOutput dex(RuleContext ruleContext, AndroidSemantics semantics, - AndroidTools tools, MultidexMode multidexMode, List<String> dexopts, Artifact deployJar, - Artifact proguardedJar, AndroidCommon common, JavaTargetAttributes attributes) { + static DexingOutput dex(RuleContext ruleContext, MultidexMode multidexMode, List<String> dexopts, + Artifact deployJar, Artifact proguardedJar, AndroidCommon common, + JavaTargetAttributes attributes) { Artifact classesDex = AndroidBinary.getDxArtifact(ruleContext, getMultidexMode(ruleContext).getOutputDexFilename()); - if (!AndroidBinary.supportsMultidexMode(tools, multidexMode)) { + if (!AndroidBinary.supportsMultidexMode(ruleContext, multidexMode)) { ruleContext.ruleError("Multidex mode \"" + multidexMode.getAttributeValue() + "\" not supported by this version of the Android SDK"); throw new RuleConfigurationException(); @@ -794,7 +777,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { if (multidexMode == MultidexMode.OFF) { // Single dex mode: generate classes.dex directly from the input jar. AndroidCommon.createDexAction( - ruleContext, semantics, tools, proguardedJar, classesDex, dexopts, false, null); + ruleContext, proguardedJar, classesDex, dexopts, false, null); return new DexingOutput(classesDex, deployJar, ImmutableList.of(classesDex)); } else { // Multidex mode: generate classes.dex.zip, where the zip contains [classes.dex, @@ -803,7 +786,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { // for apk building. if (multidexMode == MultidexMode.LEGACY) { // For legacy multidex, we need to generate a list for the dexer's --main-dex-list flag. - mainDexList = createMainDexListAction(ruleContext, tools, proguardedJar); + mainDexList = createMainDexListAction(ruleContext, proguardedJar); } if (dexShards > 1) { @@ -864,7 +847,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { Artifact shard = getDxArtifact(ruleContext, "shard" + i + ".dex.zip"); shardDexes.add(shard); AndroidCommon.createDexAction( - ruleContext, semantics, tools, shardJar, shard, dexopts, true, null); + ruleContext, shardJar, shard, dexopts, true, null); } CommandLine mergeCommandLine = CustomCommandLine.builder() @@ -889,7 +872,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { // Have the dexer generate the intermediate file and the "cleaner" action consume this to // generate the final archive with only .dex files. - AndroidCommon.createDexAction(ruleContext, semantics, tools, proguardedJar, + AndroidCommon.createDexAction(ruleContext, proguardedJar, classesDexIntermediate, dexopts, true, mainDexList); createCleanDexZipAction(ruleContext, classesDexIntermediate, classesDex); return new DexingOutput(classesDex, deployJar, ImmutableList.of(classesDex)); @@ -922,19 +905,19 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { * --main-dex-list flag (which specifies the classes that need to be directly in classes.dex). * Returns the file containing the list. */ - static Artifact createMainDexListAction( - RuleContext ruleContext, AndroidTools tools, Artifact jar) { + static Artifact createMainDexListAction(RuleContext ruleContext, Artifact jar) { // Process the input jar through Proguard into an intermediate, streamlined jar. Artifact strippedJar = AndroidBinary.getDxArtifact(ruleContext, "main_dex_intermediate.jar"); + AndroidSdkProvider sdk = AndroidSdkProvider.fromRuleContext(ruleContext); ruleContext.registerAction(new SpawnAction.Builder() .addOutput(strippedJar) - .setExecutable(tools.getProguard()) + .setExecutable(sdk.getProguard()) .setProgressMessage("Generating streamlined input jar for main dex classes list") .setMnemonic("MainDexClassesIntermediate") .addArgument("-injars") .addInputArgument(jar) .addArgument("-libraryjars") - .addInputArgument(tools.getShrinkedAndroidJar()) + .addInputArgument(sdk.getShrinkedAndroidJar()) .addArgument("-outjars") .addArgument(strippedJar.getExecPathString()) .addArgument("-dontwarn") @@ -944,22 +927,33 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { .addArgument("-dontobfuscate") .addArgument("-dontpreverify") .addArgument("-include") - .addInputArgument(tools.getMainDexClasses()) + .addInputArgument(sdk.getMainDexClasses()) .build(ruleContext)); // Create the main dex classes list. Artifact mainDexList = AndroidBinary.getDxArtifact(ruleContext, "main_dex_list.txt"); - ruleContext.registerAction(tools.mainDexListAction(jar, strippedJar, mainDexList)); + Builder builder = new Builder() + .setMnemonic("MainDexClasses") + .setProgressMessage("Generating main dex classes list"); + + ruleContext.registerAction(builder + .setExecutable(sdk.getMainDexListCreator()) + .addOutputArgument(mainDexList) + .addInputArgument(strippedJar) + .addInputArgument(jar) + .addArguments(ruleContext.getTokenizedStringListAttr("main_dex_list_opts")) + .build(ruleContext)); return mainDexList; } - private static Artifact createSplitApkResources(RuleContext ruleContext, AndroidTools tools, + private static Artifact createSplitApkResources(RuleContext ruleContext, ApplicationManifest mainManifest, String splitName, boolean hasCode) { Artifact splitManifest = mainManifest.createSplitManifest(ruleContext, splitName, hasCode) .getManifest(); Artifact splitResources = getDxArtifact(ruleContext, "split_" + splitName + ".ap_"); + AndroidSdkProvider sdk = AndroidSdkProvider.fromRuleContext(ruleContext); ruleContext.registerAction(new SpawnAction.Builder() - .setExecutable(tools.getAapt()) + .setExecutable(sdk.getAapt()) .setMnemonic("AndroidAapt") .setProgressMessage("Generating resource apk for split " + splitName) .addArgument("package") @@ -968,7 +962,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { .addArgument("-M") .addInputArgument(splitManifest) .addArgument("-I") - .addInputArgument(tools.getAndroidJar()) + .addInputArgument(sdk.getAndroidJar()) .build(ruleContext)); return splitResources; @@ -983,7 +977,6 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { private static final class ApkActionBuilder { private final RuleContext ruleContext; private final AndroidSemantics semantics; - private final AndroidTools tools; private boolean sign; private String message; @@ -996,10 +989,9 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { private NativeLibs nativeLibs = NativeLibs.EMPTY; private ApkActionBuilder( - RuleContext ruleContext, AndroidSemantics semantics, AndroidTools tools) { + RuleContext ruleContext, AndroidSemantics semantics) { this.ruleContext = ruleContext; this.semantics = semantics; - this.tools = tools; } /** @@ -1071,7 +1063,8 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { * Creates a generating action for {@code outApk} that builds the APK specified. */ public Action[] build(Artifact outApk) { - Builder actionBuilder = tools.apkBuilderAction() + Builder actionBuilder = new SpawnAction.Builder() + .setExecutable(AndroidSdkProvider.fromRuleContext(ruleContext).getApkBuilder()) .setProgressMessage(message) .setMnemonic("AndroidApkBuilder") .addOutputArgument(outApk); @@ -1123,7 +1116,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { } /** Last step in buildings an apk: align the zip boundaries by 4 bytes. */ - static Artifact zipalignApk(RuleContext ruleContext, AndroidTools tools, + static Artifact zipalignApk(RuleContext ruleContext, Artifact signedApk, Artifact zipAlignedApk) { List<String> args = new ArrayList<>(); // "4" is the only valid value for zipalign, according to: @@ -1135,7 +1128,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { ruleContext.registerAction(new SpawnAction.Builder() .addInput(signedApk) .addOutput(zipAlignedApk) - .setExecutable(tools.getZipalign()) + .setExecutable(AndroidSdkProvider.fromRuleContext(ruleContext).getZipalign()) .addArguments(args) .setProgressMessage("Zipaligning apk") .setMnemonic("AndroidZipAlign") @@ -1205,10 +1198,11 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { * Returns true if the runtime contained in the Android SDK used to build this rule supports the * given version of multidex mode specified, false otherwise. */ - public static boolean supportsMultidexMode(AndroidTools tools, MultidexMode mode) { + public static boolean supportsMultidexMode(RuleContext ruleContext, MultidexMode mode) { if (mode == MultidexMode.NATIVE) { // Native mode is not supported by Android devices running Android before v21. - String runtime = tools.getAndroidJar().getExecPathString(); + String runtime = + AndroidSdkProvider.fromRuleContext(ruleContext).getAndroidJar().getExecPathString(); for (String blacklistedRuntime : RUNTIMES_THAT_DONT_SUPPORT_NATIVE_MULTIDEXING) { if (runtime.contains(blacklistedRuntime)) { return false; diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java index 9826c2ec05..a0321a0dc2 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java @@ -163,8 +163,9 @@ public class AndroidCommon { * the {@link com.google.devtools.build.lib.actions.Artifact} {@code dxJar}. */ public static void createDexAction( - RuleContext ruleContext, AndroidSemantics semantics, AndroidTools tools, Artifact jarToDex, - Artifact classesDex, List<String> dexOptions, boolean multidex, Artifact mainDexList) { + RuleContext ruleContext, + Artifact jarToDex, Artifact classesDex, List<String> dexOptions, boolean multidex, + Artifact mainDexList) { List<String> args = new ArrayList<>(); args.add("--dex"); // Add --no-locals to coverage builds. Otherwise local variable debug information is not @@ -191,7 +192,8 @@ public class AndroidCommon { args.add("--output=" + classesDex.getExecPathString()); args.add(jarToDex.getExecPathString()); - SpawnAction.Builder builder = tools.dxAction(semantics) + SpawnAction.Builder builder = new SpawnAction.Builder() + .setExecutable(AndroidSdkProvider.fromRuleContext(ruleContext).getDx()) .addInput(jarToDex) .addOutput(classesDex) .addArguments(args) @@ -305,14 +307,14 @@ public class AndroidCommon { public JavaTargetAttributes init( JavaSemantics javaSemantics, AndroidSemantics androidSemantics, - AndroidTools tools, ResourceApk resourceApk, AndroidIdlProvider transitiveIdlImportData, + ResourceApk resourceApk, AndroidIdlProvider transitiveIdlImportData, boolean addCoverageSupport, boolean collectJavaCompilationArgs) { ImmutableList<Artifact> extraSources = resourceApk.isLegacy() || resourceApk.getResourceJavaSrcJar() == null ? ImmutableList.<Artifact>of() : ImmutableList.of(resourceApk.getResourceJavaSrcJar()); JavaTargetAttributes.Builder attributes = init( - tools, androidSemantics, + androidSemantics, transitiveIdlImportData, resourceApk.getTransitiveResources(), extraSources); @@ -340,7 +342,6 @@ public class AndroidCommon { } private JavaTargetAttributes.Builder init( - AndroidTools tools, AndroidSemantics androidSemantics, AndroidIdlProvider transitiveIdlImportData, NestedSet<AndroidResourcesProvider.ResourceContainer> transitiveResources, @@ -360,7 +361,8 @@ public class AndroidCommon { JavaTargetAttributes.Builder attributes = javaCommon.initCommon( extraSrcsBuilder.addAll(translatedIdlSources.values()).build()); - attributes.setBootClassPath(ImmutableList.of(tools.getAndroidJar())); + attributes.setBootClassPath(ImmutableList.of( + AndroidSdkProvider.fromRuleContext(ruleContext).getAndroidJar())); return attributes; } @@ -494,10 +496,10 @@ public class AndroidCommon { } public RuleConfiguredTargetBuilder addTransitiveInfoProviders( - RuleConfiguredTargetBuilder builder, AndroidTools tools) { + RuleConfiguredTargetBuilder builder) { if (!idls.isEmpty()) { generateAndroidIdlActions( - ruleContext, tools, idls, transitiveIdlImportData, translatedIdlSources); + ruleContext, idls, transitiveIdlImportData, translatedIdlSources); } Runfiles runfiles = new Runfiles.Builder() @@ -649,11 +651,12 @@ public class AndroidCommon { return builder.build(); } - private void generateAndroidIdlActions(RuleContext ruleContext, AndroidTools tools, + private void generateAndroidIdlActions(RuleContext ruleContext, Collection<Artifact> idls, AndroidIdlProvider transitiveIdlImportData, Map<Artifact, Artifact> translatedIdlSources) { FilesToRunProvider toolRunner = ruleContext.getExecutablePrerequisite("$android_tool_runner", Mode.HOST); + AndroidSdkProvider sdk = AndroidSdkProvider.fromRuleContext(ruleContext); Set<Artifact> preprocessedIdls = new LinkedHashSet<>(); List<String> preprocessedArgs = new ArrayList<>(); @@ -663,7 +666,7 @@ public class AndroidCommon { } // preprocess each aidl file - preprocessedArgs.add("-p" + tools.getFrameworkAidl().getExecPathString()); + preprocessedArgs.add("-p" + sdk.getFrameworkAidl().getExecPathString()); PathFragment rulePackage = ruleContext.getRule().getLabel().getPackageFragment(); String ruleName = ruleContext.getRule().getName(); for (Artifact idl : idls) { @@ -676,7 +679,7 @@ public class AndroidCommon { preprocessedIdls.add(preprocessed); preprocessedArgs.add("-p" + preprocessed.getExecPathString()); - createAndroidIdlPreprocessAction(ruleContext, tools, toolRunner, idl, preprocessed); + createAndroidIdlPreprocessAction(ruleContext, toolRunner, idl, preprocessed); } // aggregate all preprocessed aidl files @@ -686,17 +689,19 @@ public class AndroidCommon { ruleContext.getConfiguration().getMiddlemanDirectory()); for (Artifact idl : translatedIdlSources.keySet()) { - createAndroidIdlAction(ruleContext, tools, toolRunner, idl, + createAndroidIdlAction(ruleContext, toolRunner, idl, transitiveIdlImportData.getTransitiveIdlImports(), preprocessedIdlsMiddleman, translatedIdlSources.get(idl), preprocessedArgs); } } - private void createAndroidIdlPreprocessAction(RuleContext ruleContext, AndroidTools tools, + private void createAndroidIdlPreprocessAction(RuleContext ruleContext, FilesToRunProvider toolRunner, Artifact idl, Artifact preprocessed) { RunfilesSupport toolRunnerRunfiles = toolRunner.getRunfilesSupport(); + AndroidSdkProvider sdk = AndroidSdkProvider.fromRuleContext(ruleContext); Preconditions.checkState(toolRunnerRunfiles != null, toolRunner.getLabel()); - ruleContext.registerAction(tools.aidlAction() + ruleContext.registerAction(new SpawnAction.Builder() + .setExecutable(sdk.getAidl()) // Note the below may be an overapproximation of the actual runfiles, due to "conditional // artifacts" (see Runfiles.PruningManifest). // TODO(bazel-team): When using getFilesToRun(), the middleman is @@ -711,17 +716,19 @@ public class AndroidCommon { .build(ruleContext)); } - private void createAndroidIdlAction(RuleContext ruleContext, AndroidTools tools, + private void createAndroidIdlAction(RuleContext ruleContext, FilesToRunProvider toolRunner, Artifact idl, Iterable<Artifact> idlImports, Artifact preprocessedIdls, Artifact output, List<String> preprocessedArgs) { RunfilesSupport toolRunnerRunfiles = toolRunner.getRunfilesSupport(); + AndroidSdkProvider sdk = AndroidSdkProvider.fromRuleContext(ruleContext); Preconditions.checkState(toolRunnerRunfiles != null, toolRunner.getLabel()); - ruleContext.registerAction(tools.aidlAction() + ruleContext.registerAction(new SpawnAction.Builder() + .setExecutable(sdk.getAidl()) .addInput(idl) .addInputs(idlImports) .addInput(preprocessedIdls) - .addInput(tools.getFrameworkAidl()) + .addInput(sdk.getFrameworkAidl()) .addOutput(output) .addArgument("-b") // Fail if trying to compile a parcelable. .addArguments(preprocessedArgs) diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java index 0a908de2be..e70aafd9da 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java @@ -31,14 +31,10 @@ import com.google.devtools.build.lib.analysis.config.FragmentOptions; import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException; import com.google.devtools.build.lib.packages.Attribute.SplitTransition; import com.google.devtools.build.lib.syntax.Label; -import com.google.devtools.build.lib.syntax.Label.SyntaxException; import com.google.devtools.common.options.Converters; import com.google.devtools.common.options.Option; import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.TreeMap; /** * Configuration fragment for Android rules. @@ -138,33 +134,10 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment { } @Override - public Map<String, Set<Label>> getDefaultsLabels(BuildConfiguration.Options commonOptions) { - Map<String, Set<Label>> result = new TreeMap<>(); - Label realSdk = realSdk(); - if (Constants.ANDROID_ALLOW_SDK_FILEGROUP) { - addLabel(result, realSdk, "ANDROID_AIDL_TOOL", "static_aidl_tool"); - addLabel(result, realSdk, "ANDROID_AIDL_FRAMEWORK", "aidl_framework"); - addLabel(result, realSdk, "ANDROID_AAPT", "static_aapt_tool"); - addLabel(result, realSdk, "ANDROID_ADB", "static_adb_tool"); - addLabel(result, realSdk, "ANDROID_APKBUILDER", "apkbuilder_tool"); - addLabel(result, realSdk, "ANDROID_DX_JAR", "dx_jar"); - } - return result; - } - - @Override public ImmutableList<String> getDefaultsRules() { return ImmutableList.of("android_tools_defaults_jar(name = 'android_jar')"); } - private void addLabel(Map<String, Set<Label>> map, Label sdk, String key, String localLabel) { - try { - map.put(key, ImmutableSet.of(sdk.getLocalTargetLabel(localLabel))); - } catch (SyntaxException e) { - throw new IllegalStateException("Invalid label for " + key + ": " + localLabel, e); - } - } - @Override public List<SplitTransition<BuildOptions>> getPotentialSplitTransitions() { return ImmutableList.of(AndroidRuleClasses.ANDROID_SPLIT_TRANSITION); diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java index af4e4fa794..338282bc4e 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java @@ -57,7 +57,9 @@ public abstract class AndroidLibrary implements RuleConfiguredTargetFactory { public ConfiguredTarget create(RuleContext ruleContext) { JavaSemantics javaSemantics = createJavaSemantics(); AndroidSemantics androidSemantics = createAndroidSemantics(); - + if (!AndroidSdkProvider.verifyPresence(ruleContext)) { + return null; + } List<? extends TransitiveInfoCollection> deps = ruleContext.getPrerequisites("deps", Mode.TARGET); checkResourceInlining(ruleContext); @@ -69,11 +71,6 @@ public abstract class AndroidLibrary implements RuleConfiguredTargetFactory { NestedSet<Artifact> transitiveProguardConfigs = collectTransitiveProguardConfigs(ruleContext); AndroidIdlProvider transitiveIdlImportData = collectTransitiveIdlImports(ruleContext); - AndroidTools tools = AndroidTools.fromRuleContext(ruleContext); - if (tools == null) { - return null; - } - if (LocalResourceContainer.definesAndroidResources(ruleContext.attributes())) { try { if (!LocalResourceContainer.validateRuleContext(ruleContext)) { @@ -85,7 +82,7 @@ public abstract class AndroidLibrary implements RuleConfiguredTargetFactory { ApplicationManifest applicationManifest = androidSemantics.getManifestForRule(ruleContext); ResourceApk resourceApk = applicationManifest.packWithDataAndResources( ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_RESOURCES_APK), - ruleContext, transitiveResources, tools, + ruleContext, transitiveResources, ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_R_TXT), ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_SYMBOLS_TXT), ImmutableList.<String>of(), /* configurationFilters */ @@ -97,7 +94,7 @@ public abstract class AndroidLibrary implements RuleConfiguredTargetFactory { false, null /* proguardCfgOut */); - if (androidCommon.init(javaSemantics, androidSemantics, tools, + if (androidCommon.init(javaSemantics, androidSemantics, resourceApk, transitiveIdlImportData, false, true) == null) { return null; } @@ -108,7 +105,7 @@ public abstract class AndroidLibrary implements RuleConfiguredTargetFactory { Artifact aarOut = ruleContext.getImplicitOutputArtifact( AndroidRuleClasses.ANDROID_LIBRARY_AAR); - new AarGeneratorBuilder(tools, ruleContext) + new AarGeneratorBuilder(ruleContext) .withPrimary(resourceApk.getPrimaryResource()) .withManifest(resourceApk.getPrimaryResource().getManifest()) .withRtxt(resourceApk.getPrimaryResource().getRTxt()) @@ -118,7 +115,7 @@ public abstract class AndroidLibrary implements RuleConfiguredTargetFactory { .build(ruleContext); RuleConfiguredTargetBuilder builder = new RuleConfiguredTargetBuilder(ruleContext); - androidCommon.addTransitiveInfoProviders(builder, tools); + androidCommon.addTransitiveInfoProviders(builder); androidSemantics.addTransitiveInfoProviders( builder, ruleContext, javaCommon, androidCommon, null, resourceApk, null, ImmutableList.<Artifact>of()); @@ -147,13 +144,13 @@ public abstract class AndroidLibrary implements RuleConfiguredTargetFactory { JavaCommon javaCommon = new JavaCommon(ruleContext, javaSemantics); AndroidCommon androidCommon = new AndroidCommon(ruleContext, javaCommon); ResourceApk resourceApk = ResourceApk.fromTransitiveResources(transitiveResources); - if (androidCommon.init(javaSemantics, androidSemantics, tools, + if (androidCommon.init(javaSemantics, androidSemantics, resourceApk, transitiveIdlImportData, false, true) == null) { return null; } RuleConfiguredTargetBuilder targetBuilder = androidCommon.addTransitiveInfoProviders( - new RuleConfiguredTargetBuilder(ruleContext), tools); + new RuleConfiguredTargetBuilder(ruleContext)); androidSemantics.addTransitiveInfoProviders( targetBuilder, ruleContext, javaCommon, androidCommon, @@ -211,7 +208,7 @@ public abstract class AndroidLibrary implements RuleConfiguredTargetFactory { ruleContext.attributes().get("exports_manifest", Type.BOOLEAN), ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_R_TXT), null); - primaryResources = new AndroidResourcesProcessorBuilder(tools, ruleContext) + primaryResources = new AndroidResourcesProcessorBuilder(ruleContext) .setApkOut(apk) .setRTxtOut(primaryResources.getRTxt()) .setSourceJarOut(primaryResources.getJavaSourceJar()) @@ -224,7 +221,7 @@ public abstract class AndroidLibrary implements RuleConfiguredTargetFactory { .build(ruleContext); } - new AarGeneratorBuilder(tools, ruleContext) + new AarGeneratorBuilder(ruleContext) .withPrimary(primaryResources) .withManifest(primaryResources.getManifest()) .withRtxt(primaryResources.getRTxt()) 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 f873e2b2d4..fd859e01f0 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 @@ -21,6 +21,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; import com.google.common.collect.Iterators; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; 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.SpawnAction; @@ -46,7 +47,7 @@ public class AndroidResourcesProcessorBuilder { private List<String> resourceConfigs = Collections.emptyList(); private List<String> uncompressedExtensions = Collections.emptyList(); private Artifact apkOut; - private final AndroidTools androidTools; + private final AndroidSdkProvider sdk; private List<String> assetsToIgnore = Collections.emptyList(); private SpawnAction.Builder spawnActionBuilder; private PathFragment workingDirectory; @@ -59,11 +60,10 @@ public class AndroidResourcesProcessorBuilder { private Artifact symbolsTxt; /** - * @param androidTools A configured AndroidTools for the AndroidResourcesProcessor action. * @param ruleContext The RuleContext that was used to create the SpawnAction.Builder. */ - public AndroidResourcesProcessorBuilder(AndroidTools androidTools, RuleContext ruleContext) { - this.androidTools = androidTools; + public AndroidResourcesProcessorBuilder(RuleContext ruleContext) { + this.sdk = AndroidSdkProvider.fromRuleContext(ruleContext); this.ruleContext = ruleContext; this.spawnActionBuilder = new SpawnAction.Builder(); } @@ -179,17 +179,19 @@ public class AndroidResourcesProcessorBuilder { List<String> args = new ArrayList<>(); args.add("--aapt"); - args.add(androidTools.getAapt().getExecutable().getExecPathString()); + args.add(sdk.getAapt().getExecutable().getExecPathString()); - Iterables.addAll(ins, androidTools.getAndroidResourceProcessor().getRunfilesSupport() - .getRunfilesArtifactsWithoutMiddlemen()); + Iterables.addAll(ins, + ruleContext.getExecutablePrerequisite(":android_resources_processor", Mode.HOST) + .getRunfilesSupport() + .getRunfilesArtifactsWithoutMiddlemen()); args.add("--annotationJar"); - args.add(androidTools.getAnnotationsJar().getExecPathString()); - ins.add(androidTools.getAnnotationsJar()); + args.add(sdk.getAnnotationsJar().getExecPathString()); + ins.add(sdk.getAnnotationsJar()); args.add("--androidJar"); - args.add(androidTools.getAndroidJar().getExecPathString()); - ins.add(androidTools.getAndroidJar()); + args.add(sdk.getAndroidJar().getExecPathString()); + ins.add(sdk.getAndroidJar()); args.add("--primaryData"); addPrimaryResourceContainer(ins, args, primary); @@ -282,11 +284,12 @@ public class AndroidResourcesProcessorBuilder { // Create the spawn action. ruleContext.registerAction(this.spawnActionBuilder - .addTool(androidTools.getAapt()) + .addTool(sdk.getAapt()) .addInputs(ImmutableList.<Artifact>copyOf(ins)) .addOutputs(ImmutableList.<Artifact>copyOf(outs)) .addArguments(ImmutableList.<String>copyOf(args)) - .setExecutable(androidTools.getAndroidResourceProcessor()) + .setExecutable( + ruleContext.getExecutablePrerequisite(":android_resources_processor", Mode.HOST)) .setProgressMessage("Processing resources") .setMnemonic("AndroidAapt") .build(context)); diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSdkProvider.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSdkProvider.java index c8883568ff..87121e3708 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSdkProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSdkProvider.java @@ -15,6 +15,9 @@ package com.google.devtools.build.lib.rules.android; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.FilesToRunProvider; +import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; +import com.google.devtools.build.lib.analysis.RuleContext; +import com.google.devtools.build.lib.analysis.TransitiveInfoCollection; import com.google.devtools.build.lib.analysis.TransitiveInfoProvider; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; @@ -59,6 +62,32 @@ public final class AndroidSdkProvider implements TransitiveInfoProvider { this.zipalign = zipalign; } + /** + * Returns the Android SDK associated with the rule being analyzed or null if the Android SDK is + * not specified. + */ + public static AndroidSdkProvider fromRuleContext(RuleContext ruleContext) { + TransitiveInfoCollection androidSdkDep = + ruleContext.getPrerequisite(":android_sdk", Mode.TARGET); + AndroidSdkProvider androidSdk = androidSdkDep == null + ? null : androidSdkDep.getProvider(AndroidSdkProvider.class); + + return androidSdk; + } + + /** + * Signals an error if the Android SDK cannot be found. + */ + public static boolean verifyPresence(RuleContext ruleContext) { + if (fromRuleContext(ruleContext) == null) { + ruleContext.ruleError( + "No Android SDK found. Use the --android_sdk command line option to specify one."); + return false; + } + + return true; + } + public Artifact getFrameworkAidl() { return frameworkAidl; } diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidTools.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidTools.java deleted file mode 100644 index f7a2ab8783..0000000000 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidTools.java +++ /dev/null @@ -1,328 +0,0 @@ -// Copyright 2015 Google Inc. 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.lib.rules.android; - -import com.google.devtools.build.lib.Constants; -import com.google.devtools.build.lib.actions.Action; -import com.google.devtools.build.lib.actions.Artifact; -import com.google.devtools.build.lib.analysis.FilesToRunProvider; -import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; -import com.google.devtools.build.lib.analysis.RuleContext; -import com.google.devtools.build.lib.analysis.TransitiveInfoCollection; -import com.google.devtools.build.lib.analysis.actions.SpawnAction; -import com.google.devtools.build.lib.packages.Type; -import com.google.devtools.build.lib.rules.java.BaseJavaCompilationHelper; -import com.google.devtools.build.lib.rules.java.JavaCompilationHelper; -import com.google.devtools.build.lib.rules.java.Jvm; - -import java.util.List; - -/** A common interface for all the tools used by {@code android_*} rules. */ -public class AndroidTools { - private final RuleContext ruleContext; - private final Artifact dxJar; - private final FilesToRunProvider aapt; - private final Artifact apkBuilderTool; - private final Artifact aidlTool; - private final Artifact frameworkAidl; - private final FilesToRunProvider adb; - private final FilesToRunProvider toolRunner; - private final FilesToRunProvider aaptJavaGenerator; - private final FilesToRunProvider apkGenerator; - private final FilesToRunProvider resourceProcessor; - private final FilesToRunProvider aarGenerator; - private final FilesToRunProvider zipalign; - private final FilesToRunProvider proguard; - private final Artifact androidJar; - private final Artifact shrinkedAndroidJar; - private final Artifact annotationsJar; - private final Artifact mainDexClasses; - private final AndroidSdkProvider androidSdk; - - public static AndroidTools fromRuleContext(RuleContext ruleContext) { - TransitiveInfoCollection androidSdkDep = - ruleContext.getPrerequisite(":android_sdk", Mode.TARGET); - AndroidSdkProvider androidSdk = androidSdkDep == null - ? null - : androidSdkDep.getProvider(AndroidSdkProvider.class); - if (androidSdk == null && !Constants.ANDROID_ALLOW_SDK_FILEGROUP) { - ruleContext.ruleError( - "No Android SDK found. Use the --android_sdk command line option to specify one."); - return null; - } - - return new AndroidTools( - ruleContext, - androidSdk, - getOptionalArtifact(ruleContext, "$android_dx_jar"), - getOptionalArtifact(ruleContext, "$android_jar", Mode.TARGET), - getOptionalArtifact(ruleContext, "$shrinked_android"), - getOptionalArtifact(ruleContext, "$android_annotations_jar"), - getOptionalArtifact(ruleContext, "$multidex_keep_classes"), - getOptionalArtifact(ruleContext, "$android_apkbuilder_tool"), - getOptionalArtifact(ruleContext, "$android_aidl_tool"), - getOptionalArtifact(ruleContext, "$android_aidl_framework"), - getOptionalToolFromArtifact(ruleContext, "$android_aapt"), - getOptionalToolFromArtifact(ruleContext, "$adb"), - getOptionalTool(ruleContext, "$android_tool_runner"), - getOptionalTool(ruleContext, "$android_aapt_java_generator"), - getOptionalTool(ruleContext, "$android_aapt_apk_generator"), - getOptionalTool(ruleContext, ":android_resources_processor"), - getOptionalTool(ruleContext, ":android_aar_generator"), - getOptionalTool(ruleContext, "$zipalign_tool"), - getOptionalTool(ruleContext, ":proguard")); - } - - private static Artifact getOptionalArtifact(RuleContext ruleContext, String attribute) { - return getOptionalArtifact(ruleContext, attribute, Mode.HOST); - } - - private static Artifact getOptionalArtifact( - RuleContext ruleContext, String attribute, Mode mode) { - if (!ruleContext.getRule().isAttrDefined(attribute, Type.LABEL)) { - return null; - } - - List<Artifact> prerequisites = - ruleContext.getPrerequisiteArtifacts(attribute, mode).list(); - - if (prerequisites.isEmpty()) { - return null; - } else if (prerequisites.size() == 1) { - return prerequisites.get(0); - } else { - ruleContext.attributeError(attribute, "expected a single artifact"); - return null; - } - } - - private static FilesToRunProvider getOptionalToolFromArtifact( - RuleContext ruleContext, String attribute) { - if (!ruleContext.getRule().isAttrDefined(attribute, Type.LABEL)) { - return null; - } - - Artifact artifact = getOptionalArtifact(ruleContext, attribute); - if (artifact == null) { - return null; - } - - return FilesToRunProvider.fromSingleArtifact( - ruleContext.attributes().get(attribute, Type.LABEL), - artifact); - } - - private static FilesToRunProvider getOptionalTool(RuleContext ruleContext, String attribute) { - if (!ruleContext.getRule().isAttrDefined(attribute, Type.LABEL)) { - return null; - } - - TransitiveInfoCollection prerequisite = ruleContext.getPrerequisite(attribute, Mode.HOST); - if (prerequisite == null) { - return null; - } - - return prerequisite.getProvider(FilesToRunProvider.class); - } - - public AndroidTools( - RuleContext ruleContext, - AndroidSdkProvider androidSdk, - Artifact dxJar, - Artifact androidJar, - Artifact shrinkedAndroidJar, - Artifact annotationsJar, - Artifact mainDexClasses, - Artifact apkBuilderTool, - Artifact aidlTool, - Artifact frameworkAidl, - FilesToRunProvider aapt, - FilesToRunProvider adb, - FilesToRunProvider toolRunner, - FilesToRunProvider aaptJavaGenerator, - FilesToRunProvider apkGenerator, - FilesToRunProvider resourceProcessor, - FilesToRunProvider aarGenerator, - FilesToRunProvider zipalign, - FilesToRunProvider proguard) { - this.ruleContext = ruleContext; - this.androidSdk = androidSdk; - this.dxJar = dxJar; - this.androidJar = androidJar; - this.shrinkedAndroidJar = shrinkedAndroidJar; - this.mainDexClasses = mainDexClasses; - this.aapt = aapt; - this.annotationsJar = annotationsJar; - this.apkBuilderTool = apkBuilderTool; - this.aidlTool = aidlTool; - this.frameworkAidl = frameworkAidl; - this.adb = adb; - this.toolRunner = toolRunner; - this.aaptJavaGenerator = aaptJavaGenerator; - this.apkGenerator = apkGenerator; - this.resourceProcessor = resourceProcessor; - this.aarGenerator = aarGenerator; - this.zipalign = zipalign; - this.proguard = proguard; - } - - public Artifact getFrameworkAidl() { - return androidSdk != null ? androidSdk.getFrameworkAidl() : frameworkAidl; - } - - public Artifact getAndroidJar() { - return androidSdk != null ? androidSdk.getAndroidJar() : androidJar; - } - - public Artifact getShrinkedAndroidJar() { - return androidSdk != null ? androidSdk.getShrinkedAndroidJar() : shrinkedAndroidJar; - } - - public Artifact getAnnotationsJar() { - return androidSdk != null ? androidSdk.getAnnotationsJar() : annotationsJar; - } - - public Artifact getMainDexClasses() { - return androidSdk != null ? androidSdk.getMainDexClasses() : mainDexClasses; - } - - public FilesToRunProvider getAapt() { - return androidSdk != null ? androidSdk.getAapt() : aapt; - } - - public FilesToRunProvider getAdb() { - return androidSdk != null ? androidSdk.getAdb() : adb; - } - - public FilesToRunProvider getToolRunner() { - return toolRunner; - } - - public FilesToRunProvider getAaptJavaGenerator() { - return aaptJavaGenerator; - } - - public FilesToRunProvider getApkGenerator() { - return apkGenerator; - } - - public FilesToRunProvider getAndroidResourceProcessor() { - return resourceProcessor; - } - - public FilesToRunProvider getAarGenerator() { - return aarGenerator; - } - - public FilesToRunProvider getZipalign() { - return androidSdk != null ? androidSdk.getZipalign() : zipalign; - } - - public FilesToRunProvider getProguard() { - return androidSdk != null ? androidSdk.getProguard() : proguard; - } - - /** - * Creates a {@link com.google.devtools.build.lib.analysis.actions.SpawnAction.Builder} that has - * its executable already set to invoke dx. - */ - public SpawnAction.Builder dxAction(AndroidSemantics semantics) { - return androidSdk != null - ? new SpawnAction.Builder() - .setExecutable(androidSdk.getDx()) - : new SpawnAction.Builder() - .addTransitiveInputs(BaseJavaCompilationHelper.getHostJavabaseInputs(ruleContext)) - .setExecutable(ruleContext.getHostConfiguration() - .getFragment(Jvm.class).getJavaExecutable()) - .addArguments(semantics.getDxJvmArguments()) - .addArgument("-jar") - .addInputArgument(dxJar); - } - - /** - * Creates a {@link com.google.devtools.build.lib.analysis.actions.SpawnAction.Builder} that has - * its executable already set to invoke the main dex list creator. - */ - public Action[] mainDexListAction(Artifact jar, Artifact strippedJar, Artifact mainDexList) { - SpawnAction.Builder builder = new SpawnAction.Builder() - .setMnemonic("MainDexClasses") - .setProgressMessage("Generating main dex classes list"); - - if (androidSdk != null) { - return builder - .setExecutable(androidSdk.getMainDexListCreator()) - .addOutputArgument(mainDexList) - .addInputArgument(strippedJar) - .addInputArgument(jar) - .addArguments(ruleContext.getTokenizedStringListAttr("main_dex_list_opts")) - .build(ruleContext); - } else { - StringBuilder shellCommandBuilder = new StringBuilder() - .append(ruleContext.getHostConfiguration().getFragment(Jvm.class).getJavaExecutable() - .getPathString()) - .append(" -cp ").append(dxJar.getExecPathString()) - .append(" ").append(AndroidBinary.MAIN_DEX_CLASS_BUILDER); - for (String opt : ruleContext.getTokenizedStringListAttr("main_dex_list_opts")) { - shellCommandBuilder.append(" ").append(opt); - } - shellCommandBuilder - .append(" ").append(strippedJar.getExecPathString()) - .append(" ").append(jar.getExecPathString()) - .append(" >").append(mainDexList.getExecPathString()); - - return builder - .addInput(strippedJar) - .addInput(jar) - .addInput(dxJar) - .addTransitiveInputs(BaseJavaCompilationHelper.getHostJavabaseInputs(ruleContext)) - .addOutput(mainDexList) - .setShellCommand(shellCommandBuilder.toString()) - .build(ruleContext); - } - } - - /** - * Creates a {@link com.google.devtools.build.lib.analysis.actions.SpawnAction.Builder} that has - * its executable already set to invoke apkbuilder. - */ - public SpawnAction.Builder apkBuilderAction() { - return androidSdk != null - ? new SpawnAction.Builder() - .setExecutable(androidSdk.getApkBuilder()) - : new SpawnAction.Builder() - .setExecutable( - ruleContext.getHostConfiguration().getFragment(Jvm.class).getJavaExecutable()) - .addTransitiveInputs(JavaCompilationHelper.getHostJavabaseInputs(ruleContext)) - .addArgument("-jar") - .addInputArgument(apkBuilderTool); - } - - /** - * Creates a {@link com.google.devtools.build.lib.analysis.actions.SpawnAction.Builder} that has - * its executable already set to invoke aidl. - */ - public SpawnAction.Builder aidlAction() { - return androidSdk != null - ? new SpawnAction.Builder() - .setExecutable(androidSdk.getAidl()) - : new SpawnAction.Builder() - // Note the below may be an overapproximation of the actual runfiles, due to - // "conditional artifacts" (see Runfiles.PruningManifest). - // TODO(bazel-team): When using getFilesToRun(), the middleman is - // not expanded. Fix by providing code to expand and use getFilesToRun here. - .addInputs(toolRunner.getRunfilesSupport().getRunfilesArtifactsWithoutMiddlemen()) - .setExecutable(toolRunner.getExecutable()) - .addInputArgument(aidlTool); - } -}
\ No newline at end of file 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 b79f54937a..85de50a0fb 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 @@ -203,7 +203,6 @@ public final class ApplicationManifest { Artifact resourceApk, RuleContext ruleContext, NestedSet<ResourceContainer> resourceContainers, - AndroidTools tools, Artifact rTxt, boolean incremental, Artifact proguardCfg) { @@ -220,7 +219,6 @@ public final class ApplicationManifest { return createApk(resourceApk, ruleContext, resourceContainers, - tools, rTxt, null, /* configurationFilters */ ImmutableList.<String>of(), /* uncompressedExtensions */ @@ -243,7 +241,6 @@ public final class ApplicationManifest { Artifact resourceApk, RuleContext ruleContext, NestedSet<ResourceContainer> resourceContainers, - AndroidTools tools, Artifact rTxt, Artifact symbolsTxt, List<String> configurationFilters, @@ -271,7 +268,6 @@ public final class ApplicationManifest { return createApk(resourceApk, ruleContext, resourceContainers, - tools, rTxt, symbolsTxt, configurationFilters, @@ -295,7 +291,6 @@ public final class ApplicationManifest { private ResourceApk createApk(Artifact resourceApk, RuleContext ruleContext, NestedSet<ResourceContainer> resourceContainers, - AndroidTools tools, Artifact rTxt, Artifact symbolsTxt, List<String> configurationFilters, @@ -317,7 +312,7 @@ public final class ApplicationManifest { ruleContext); AndroidResourcesProcessorBuilder builder = - new AndroidResourcesProcessorBuilder(tools, ruleContext) + new AndroidResourcesProcessorBuilder(ruleContext) .setApkOut(resourceContainer.getApk()) .setConfigurationFilters(configurationFilters) .setUncompressedExtensions(uncompressedExtensions) @@ -370,8 +365,7 @@ public final class ApplicationManifest { } /** Uses the resource apk from the resources attribute, as opposed to recompiling. */ - public ResourceApk useCurrentResources(RuleContext ruleContext, AndroidTools tools, - Artifact proguardCfg) { + public ResourceApk useCurrentResources(RuleContext ruleContext, Artifact proguardCfg) { ResourceContainer resourceContainer = Iterables.getOnlyElement( AndroidCommon.getAndroidResources(ruleContext).getTransitiveAndroidResources()); NestedSet<ResourceContainer> resourceContainers = @@ -386,8 +380,7 @@ public final class ApplicationManifest { new AndroidAaptActionHelper( ruleContext, resourceContainer.getManifest(), - Lists.newArrayList(resourceContainer), - tools).createGenerateProguardAction(proguardCfg); + Lists.newArrayList(resourceContainer)).createGenerateProguardAction(proguardCfg); return new ResourceApk( resourceContainer.getApk(), @@ -409,7 +402,6 @@ public final class ApplicationManifest { Artifact resourceApk, RuleContext ruleContext, NestedSet<ResourceContainer> resourceContainers, - AndroidTools tools, boolean createSource, Artifact proguardCfg) { @@ -434,7 +426,7 @@ public final class ApplicationManifest { // resources. The resulting sources and apk will combine all the resources // contained in the transitive closure of the binary. AndroidAaptActionHelper aaptActionHelper = new AndroidAaptActionHelper(ruleContext, - getManifest(), Lists.newArrayList(resourceContainers), tools); + getManifest(), Lists.newArrayList(resourceContainers)); List<String> resourceConfigurationFilters = ruleContext.getTokenizedStringListAttr("resource_configuration_filters"); |