Remove Android jar from android_local_test bootclasspath
Instead, treat it as a regular compile-time library dependency.
This fixes Java8 compilation in android_local_test.
RELNOTES: None
PiperOrigin-RevId: 191359834
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidLocalTest.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidLocalTest.java
index 0f1ef83..7906fcc 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidLocalTest.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidLocalTest.java
@@ -23,10 +23,8 @@
import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode;
import com.google.devtools.build.lib.bazel.rules.java.BazelJavaSemantics;
import com.google.devtools.build.lib.rules.android.AndroidLocalTestBase;
-import com.google.devtools.build.lib.rules.android.AndroidSdkProvider;
import com.google.devtools.build.lib.rules.android.AndroidSemantics;
import com.google.devtools.build.lib.rules.java.JavaCommon;
-import com.google.devtools.build.lib.rules.java.JavaCompilationArgs.ClasspathType;
import com.google.devtools.build.lib.rules.java.JavaCompilationArtifacts.Builder;
import com.google.devtools.build.lib.rules.java.JavaCompilationHelper;
import com.google.devtools.build.lib.rules.java.JavaSemantics;
@@ -82,30 +80,6 @@
}
@Override
- protected JavaCompilationHelper getJavaCompilationHelperWithDependencies(
- RuleContext ruleContext,
- JavaSemantics javaSemantics,
- JavaCommon javaCommon,
- JavaTargetAttributes.Builder javaTargetAttributesBuilder) {
-
- JavaCompilationHelper javaCompilationHelper =
- new JavaCompilationHelper(
- ruleContext, javaSemantics, javaCommon.getJavacOpts(), javaTargetAttributesBuilder);
- javaCompilationHelper.addLibrariesToAttributes(
- ImmutableList.copyOf(javaCommon.targetsTreatedAsDeps(ClasspathType.COMPILE_ONLY)));
-
- javaCompilationHelper.addLibrariesToAttributes(
- ImmutableList.of(getAndCheckTestSupport(ruleContext)));
-
- javaTargetAttributesBuilder.setBootClassPath(
- ImmutableList.of(AndroidSdkProvider.fromRuleContext(ruleContext).getAndroidJar()));
- javaTargetAttributesBuilder.addRuntimeClassPathEntry(
- AndroidSdkProvider.fromRuleContext(ruleContext).getAndroidJar());
-
- return javaCompilationHelper;
- }
-
- @Override
protected TransitiveInfoCollection getAndCheckTestSupport(RuleContext ruleContext) {
// Add the unit test support to the list of dependencies.
return Iterables.getOnlyElement(ruleContext.getPrerequisites("$testsupport", Mode.TARGET));
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidLocalTestRule.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidLocalTestRule.java
index 67228a5..2d91a65 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidLocalTestRule.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidLocalTestRule.java
@@ -69,6 +69,9 @@
ImmutableList.of(
SkylarkProviderIdentifier.forKey(JavaInfo.PROVIDER.getKey())))))
.override(attr("$testsupport", LABEL).value(environment.getToolsLabel(JUNIT_TESTRUNNER)))
+ .add(
+ attr("$robolectric_implicit_classpath", LABEL_LIST)
+ .value(ImmutableList.of(environment.getToolsLabel("//tools/android:android_jar"))))
.override(attr("stamp", TRISTATE).value(TriState.NO))
.removeAttribute("$experimental_testsupport")
.removeAttribute("classpath_resources")
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java
index dca5a7f..ff90341 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java
@@ -13,7 +13,6 @@
// limitations under the License.
package com.google.devtools.build.lib.rules.android;
-import static com.google.devtools.build.lib.packages.BuildType.LABEL_LIST;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
@@ -36,6 +35,7 @@
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.collect.nestedset.Order;
+import com.google.devtools.build.lib.packages.BuildType;
import com.google.devtools.build.lib.rules.android.AndroidConfiguration.AndroidAaptVersion;
import com.google.devtools.build.lib.rules.java.ClasspathConfiguredFragment;
import com.google.devtools.build.lib.rules.java.JavaCommon;
@@ -447,19 +447,17 @@
builder.addRunfiles(ruleContext, RunfilesProvider.DEFAULT_RUNFILES);
builder.add(ruleContext, JavaRunfilesProvider.TO_RUNFILES);
- List<TransitiveInfoCollection> depsForRunfiles = new ArrayList<>();
-
- if (ruleContext.isAttrDefined("$robolectric", LABEL_LIST)) {
- depsForRunfiles.addAll(ruleContext.getPrerequisites("$robolectric", Mode.TARGET));
- }
+ ImmutableList<TransitiveInfoCollection> depsForRunfiles =
+ ImmutableList.<TransitiveInfoCollection>builder()
+ .addAll(ruleContext.getPrerequisites("$robolectric_implicit_classpath", Mode.TARGET))
+ .addAll(ruleContext.getPrerequisites("runtime_deps", Mode.TARGET))
+ .build();
Artifact androidAllJarsPropertiesFile = getAndroidAllJarsPropertiesFile(ruleContext);
if (androidAllJarsPropertiesFile != null) {
builder.addArtifact(androidAllJarsPropertiesFile);
}
- depsForRunfiles.addAll(ruleContext.getPrerequisites("runtime_deps", Mode.TARGET));
-
builder.addArtifacts(getRuntimeJarsForTargets(getAndCheckTestSupport(ruleContext)));
builder.addTargets(depsForRunfiles, JavaRunfilesProvider.TO_RUNFILES);
@@ -566,12 +564,34 @@
*
* @throws RuleErrorException
*/
- protected abstract JavaCompilationHelper getJavaCompilationHelperWithDependencies(
+ private JavaCompilationHelper getJavaCompilationHelperWithDependencies(
RuleContext ruleContext,
JavaSemantics javaSemantics,
JavaCommon javaCommon,
JavaTargetAttributes.Builder javaTargetAttributesBuilder)
- throws RuleErrorException;
+ throws RuleErrorException {
+ JavaCompilationHelper javaCompilationHelper =
+ new JavaCompilationHelper(
+ ruleContext, javaSemantics, javaCommon.getJavacOpts(), javaTargetAttributesBuilder);
+
+ if (ruleContext.isAttrDefined("$junit", BuildType.LABEL)) {
+ // JUnit jar must be ahead of android runtime jars since these contain stubbed definitions
+ // for framework.junit.* classes which Robolectric does not re-write.
+ javaCompilationHelper.addLibrariesToAttributes(
+ ruleContext.getPrerequisites("$junit", Mode.TARGET));
+ }
+ // Robolectric jars must be ahead of other potentially conflicting jars
+ // (e.g., Android runtime jars) in the classpath to make sure they always take precedence.
+ javaCompilationHelper.addLibrariesToAttributes(
+ ruleContext.getPrerequisites("$robolectric_implicit_classpath", Mode.TARGET));
+
+ javaCompilationHelper.addLibrariesToAttributes(
+ javaCommon.targetsTreatedAsDeps(ClasspathType.COMPILE_ONLY));
+
+ javaCompilationHelper.addLibrariesToAttributes(
+ ImmutableList.of(getAndCheckTestSupport(ruleContext)));
+ return javaCompilationHelper;
+ }
/** Get the testrunner from the rule */
protected abstract TransitiveInfoCollection getAndCheckTestSupport(RuleContext ruleContext)
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java b/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java
index 9d89a89..5fef890 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java
@@ -265,7 +265,8 @@
.add(" processor_class = 'android.databinding.annotationprocessor.ProcessDataBinding')")
.add("sh_binary(name = 'jarjar_bin', srcs = ['empty.sh'])")
.add("sh_binary(name = 'instrumentation_test_check', srcs = ['empty.sh'])")
- .add("package_group(name = 'android_device_whitelist', packages = ['//...'])");
+ .add("package_group(name = 'android_device_whitelist', packages = ['//...'])")
+ .add("android_tools_defaults_jar(name = 'android_jar')");
return androidBuildContents.build();
}