aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/main/java/com/google/devtools/build/lib/Constants.java1
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AarGeneratorBuilder.java11
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidAaptActionHelper.java38
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java150
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java43
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java27
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java25
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesProcessorBuilder.java29
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidSdkProvider.java29
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidTools.java328
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java16
11 files changed, 183 insertions, 514 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/Constants.java b/src/main/java/com/google/devtools/build/lib/Constants.java
index 0b97f5e406..57ef48a1f6 100644
--- a/src/main/java/com/google/devtools/build/lib/Constants.java
+++ b/src/main/java/com/google/devtools/build/lib/Constants.java
@@ -88,6 +88,5 @@ public class Constants {
public static final ImmutableSet<String> IOS_DEVICE_RULE_CLASSES = ImmutableSet.of("ios_device");
public static final String ANDROID_DEFAULT_SDK = "//external:android/sdk".toString();
- public static final boolean ANDROID_ALLOW_SDK_FILEGROUP = Boolean.valueOf(false);
public static final String ANDROID_DEP_PREFIX = "//external:android/".toString();
}
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");