Add BootClassPathInfo field to AndroidSdkProvider

PiperOrigin-RevId: 300386532
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 ab874ee..62ea5b8 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
@@ -465,13 +465,21 @@
     classJar = ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_LIBRARY_CLASS_JAR);
     idlHelper = new AndroidIdlHelper(ruleContext, classJar);
 
-    NestedSetBuilder<Artifact> bootclasspath = NestedSetBuilder.<Artifact>stableOrder();
-    if (getAndroidConfig(ruleContext).desugarJava8()) {
-      bootclasspath.addTransitive(
-          PrerequisiteArtifacts.nestedSet(
-              ruleContext, "$desugar_java8_extra_bootclasspath", Mode.HOST));
+    BootClassPathInfo bootClassPathInfo;
+    AndroidSdkProvider androidSdkProvider = AndroidSdkProvider.fromRuleContext(ruleContext);
+    if (androidSdkProvider.getSystem() != null) {
+      bootClassPathInfo = androidSdkProvider.getSystem();
+    } else {
+      NestedSetBuilder<Artifact> bootclasspath = NestedSetBuilder.<Artifact>stableOrder();
+      if (getAndroidConfig(ruleContext).desugarJava8()) {
+        bootclasspath.addTransitive(
+            PrerequisiteArtifacts.nestedSet(
+                ruleContext, "$desugar_java8_extra_bootclasspath", Mode.HOST));
+      }
+      bootclasspath.add(androidSdkProvider.getAndroidJar());
+      bootClassPathInfo = BootClassPathInfo.create(bootclasspath.build());
     }
-    bootclasspath.add(AndroidSdkProvider.fromRuleContext(ruleContext).getAndroidJar());
+
     ImmutableList.Builder<String> javacopts = ImmutableList.builder();
     javacopts.addAll(androidSemantics.getCompatibleJavacOptions(ruleContext));
 
@@ -481,7 +489,7 @@
     JavaTargetAttributes.Builder attributesBuilder =
         javaCommon
             .initCommon(idlHelper.getIdlGeneratedJavaSources(), javacopts.build())
-            .setBootClassPath(BootClassPathInfo.create(bootclasspath.build()));
+            .setBootClassPath(bootClassPathInfo);
 
     resourceApk
         .asDataBindingContext()
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSdkBase.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSdkBase.java
index 87e7d03..b471f8f 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSdkBase.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSdkBase.java
@@ -95,7 +95,8 @@
                 apkBuilder,
                 apkSigner,
                 proguard,
-                zipalign))
+                zipalign,
+                /* system= */ null))
         .addProvider(RunfilesProvider.class, RunfilesProvider.EMPTY)
         .setFilesToBuild(NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER))
         .build();
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 7718367..b1d53b7 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
@@ -24,6 +24,7 @@
 import com.google.devtools.build.lib.packages.BuiltinProvider;
 import com.google.devtools.build.lib.packages.NativeInfo;
 import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
+import com.google.devtools.build.lib.rules.java.BootClassPathInfo;
 import com.google.devtools.build.lib.skylarkbuildapi.android.AndroidSdkProviderApi;
 import com.google.devtools.build.lib.syntax.EvalException;
 import javax.annotation.Nullable;
@@ -52,6 +53,7 @@
   private final FilesToRunProvider apkSigner;
   private final FilesToRunProvider proguard;
   private final FilesToRunProvider zipalign;
+  @Nullable private final BootClassPathInfo system;
 
   public AndroidSdkProvider(
       String buildToolsVersion,
@@ -70,7 +72,8 @@
       @Nullable FilesToRunProvider apkBuilder,
       FilesToRunProvider apkSigner,
       FilesToRunProvider proguard,
-      FilesToRunProvider zipalign) {
+      FilesToRunProvider zipalign,
+      @Nullable BootClassPathInfo system) {
     super(PROVIDER);
     this.buildToolsVersion = buildToolsVersion;
     this.frameworkAidl = frameworkAidl;
@@ -89,6 +92,7 @@
     this.apkSigner = apkSigner;
     this.proguard = proguard;
     this.zipalign = zipalign;
+    this.system = system;
   }
 
   /**
@@ -195,6 +199,10 @@
     return zipalign;
   }
 
+  public BootClassPathInfo getSystem() {
+    return system;
+  }
+
   /** The provider can construct the Android SDK provider. */
   public static class Provider extends BuiltinProvider<AndroidSdkProvider>
       implements AndroidSdkProviderApi.Provider<
@@ -222,7 +230,8 @@
         Object apkBuilder,
         FilesToRunProvider apkSigner,
         FilesToRunProvider proguard,
-        FilesToRunProvider zipalign)
+        FilesToRunProvider zipalign,
+        Object system)
         throws EvalException {
       return new AndroidSdkProvider(
           buildToolsVersion,
@@ -241,7 +250,8 @@
           fromNoneable(apkBuilder, FilesToRunProvider.class),
           apkSigner,
           proguard,
-          zipalign);
+          zipalign,
+          fromNoneable(system, BootClassPathInfo.class));
     }
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidSdkProviderApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidSdkProviderApi.java
index a572724..3e0e821 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidSdkProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidSdkProviderApi.java
@@ -23,6 +23,7 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkConstructor;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.syntax.EvalException;
+import com.google.devtools.build.lib.syntax.StarlarkValue;
 import javax.annotation.Nullable;
 
 /**
@@ -242,6 +243,14 @@
               positional = true,
               named = false,
               type = FilesToRunProviderApi.class),
+          @Param(
+              name = "system",
+              doc = "",
+              noneable = true,
+              defaultValue = "None",
+              positional = true,
+              named = false,
+              type = StarlarkValue.class),
         },
         selfCall = true)
     @SkylarkConstructor(objectType = AndroidSdkProviderApi.class)
@@ -262,7 +271,8 @@
         /*noneable*/ Object apkBuilder,
         FilesToRunProviderT apkSigner,
         FilesToRunProviderT proguard,
-        FilesToRunProviderT zipalign)
+        FilesToRunProviderT zipalign,
+        /*noneable*/ Object system)
         throws EvalException;
   }
 }