diff options
author | Lukacs Berki <lberki@google.com> | 2015-06-30 14:59:37 +0000 |
---|---|---|
committer | Damien Martin-Guillerez <dmarting@google.com> | 2015-06-30 19:02:46 +0000 |
commit | 0c08fd62f4f37ecd1f2125c349e089233204ed08 (patch) | |
tree | 5602f0c5427653e78ce1d806df5aa7e480da4cfa | |
parent | b13a438be1fbf7ff1b591f689805ad1035c126f6 (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.java | 35 |
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, |