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();
   }