aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Lukacs Berki <lberki@google.com>2015-06-30 14:59:37 +0000
committerGravatar Damien Martin-Guillerez <dmarting@google.com>2015-06-30 19:02:46 +0000
commit0c08fd62f4f37ecd1f2125c349e089233204ed08 (patch)
tree5602f0c5427653e78ce1d806df5aa7e480da4cfa
parentb13a438be1fbf7ff1b591f689805ad1035c126f6 (diff)
Avoid crash when the Android stub application is not a Java rule.
-- MOS_MIGRATED_REVID=97227161
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java35
1 files changed, 25 insertions, 10 deletions
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 bf53b0d6a3..c856d52f23 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
@@ -53,7 +53,6 @@ import com.google.devtools.build.lib.rules.cpp.CcToolchainProvider;
import com.google.devtools.build.lib.rules.cpp.CppHelper;
import com.google.devtools.build.lib.rules.java.DeployArchiveBuilder;
import com.google.devtools.build.lib.rules.java.JavaCommon;
-import com.google.devtools.build.lib.rules.java.JavaCompilationArgs;
import com.google.devtools.build.lib.rules.java.JavaCompilationArgsProvider;
import com.google.devtools.build.lib.rules.java.JavaSemantics;
import com.google.devtools.build.lib.rules.java.JavaTargetAttributes;
@@ -375,8 +374,12 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
Artifact stubData = ruleContext.getImplicitOutputArtifact(
AndroidRuleClasses.STUB_APPLICATION_DATA);
+ Artifact stubDex = getStubDex(ruleContext, javaSemantics, false);
+ if (ruleContext.hasErrors()) {
+ return null;
+ }
ruleContext.registerAction(new ApkActionBuilder(ruleContext, androidSemantics)
- .classesDex(getStubDex(ruleContext, javaSemantics, false))
+ .classesDex(stubDex)
.resourceApk(incrementalResourceApk.getArtifact())
.javaResourceZip(dexingOutput.javaResourceJar)
.nativeLibs(nativeLibs)
@@ -459,9 +462,13 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
NestedSet<Artifact> splitApks = splitApkSetBuilder.build();
Artifact splitMainApk = getDxArtifact(ruleContext, "split_main.apk");
+ Artifact splitStubDex = getStubDex(ruleContext, javaSemantics, true);
+ if (ruleContext.hasErrors()) {
+ return null;
+ }
ruleContext.registerAction(new ApkActionBuilder(ruleContext, androidSemantics)
.resourceApk(splitMainApkResources)
- .classesDex(getStubDex(ruleContext, javaSemantics, true))
+ .classesDex(splitStubDex)
.sign(true)
.message("Generating split main apk")
.build(splitMainApk));
@@ -570,15 +577,23 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
private static Artifact getStubDex(
RuleContext ruleContext, JavaSemantics javaSemantics, boolean split) {
- JavaCompilationArgs dep = ruleContext
- .getPrerequisite(
- split ? "$incremental_split_stub_application" : "$incremental_stub_application",
- Mode.TARGET)
- .getProvider(JavaCompilationArgsProvider.class)
- .getJavaCompilationArgs();
+ String attribute =
+ split ? "$incremental_split_stub_application" : "$incremental_stub_application";
+
+ TransitiveInfoCollection dep = ruleContext.getPrerequisite(attribute, Mode.TARGET);
+ if (dep == null) {
+ ruleContext.attributeError(attribute, "Stub application cannot be found");
+ return null;
+ }
+
+ JavaCompilationArgsProvider provider = dep.getProvider(JavaCompilationArgsProvider.class);
+ if (provider == null) {
+ ruleContext.attributeError(attribute, "'" + dep.getLabel() + "' should be a Java target");
+ return null;
+ }
JavaTargetAttributes attributes = new JavaTargetAttributes.Builder(javaSemantics)
- .addRuntimeClassPathEntries(dep.getRuntimeJars())
+ .addRuntimeClassPathEntries(provider.getJavaCompilationArgs().getRuntimeJars())
.build();
Artifact stubDeployJar = getDxArtifact(ruleContext,