Use Android.jar passed as path as much as possible

Bug: b/274414020
Change-Id: I3c7002f231806ae26c3865a1536b1d0736857bc7
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/AbstractGenerateFiles.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/AbstractGenerateFiles.java
index 9c46517d..58f8ac7 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/AbstractGenerateFiles.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/AbstractGenerateFiles.java
@@ -134,6 +134,8 @@
         StringUtils.joinLines(
             "Invalid invocation.",
             "Usage: AbstractGenerateFiles [--generate-api-docs] <desugar configuration> <desugar"
-                + " implementation> <output directory> [<android jar path>]"));
+                + " implementation> <output directory> [<android jar path for Android "
+                + MAX_TESTED_ANDROID_API_LEVEL
+                + " or higher>]"));
   }
 }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/GenerateHtmlDoc.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/GenerateHtmlDoc.java
index 31ba7e1..fab7228 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/GenerateHtmlDoc.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/GenerateHtmlDoc.java
@@ -557,7 +557,7 @@
         new PrintStream(Files.newOutputStream(outputDirectory.resolve(outputFileName)));
 
     SupportedClasses supportedClasses =
-        new SupportedClassesGenerator(options)
+        new SupportedClassesGenerator(options, androidJar)
             .run(desugaredLibraryImplementation, desugaredLibrarySpecificationPath);
 
     // Full classes added.
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/GenerateLintFiles.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/GenerateLintFiles.java
index 4654124d..b5edd71 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/GenerateLintFiles.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/GenerateLintFiles.java
@@ -261,7 +261,7 @@
     AndroidApiLevel compilationLevel =
         desugaredLibrarySpecification.getRequiredCompilationApiLevel();
     SupportedClasses supportedMethods =
-        new SupportedClassesGenerator(options)
+        new SupportedClassesGenerator(options, androidJar)
             .run(desugaredLibraryImplementation, desugaredLibrarySpecificationPath);
     System.out.println("Generating lint files for compile API " + compilationLevel);
     generateLintFiles(compilationLevel, AndroidApiLevel.B, supportedMethods);
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/SupportedClassesGenerator.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/SupportedClassesGenerator.java
index cb24e59..ccbcfed 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/SupportedClassesGenerator.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/SupportedClassesGenerator.java
@@ -58,9 +58,13 @@
   private static final String ANDROID_JAR_PATTERN = "third_party/android_jar/lib-v%d/android.jar";
 
   private final InternalOptions options;
+  private final Path androidJar;
 
-  public SupportedClassesGenerator(InternalOptions options) {
+  private DexApplication loadingAppCache;
+
+  public SupportedClassesGenerator(InternalOptions options, Path androidJar) {
     this.options = options;
+    this.androidJar = androidJar;
   }
 
   public SupportedClasses run(Collection<Path> desugaredLibraryImplementation, Path specification)
@@ -69,10 +73,7 @@
     // First analyze everything which is supported when desugaring for api 1.
     collectSupportedMembersInB(desugaredLibraryImplementation, specification, builder);
     // Second annotate all apis which are partially and/or fully supported.
-    AndroidApp library =
-        AndroidApp.builder()
-            .addProgramFiles(getAndroidJarPath(MAX_TESTED_ANDROID_API_LEVEL))
-            .build();
+    AndroidApp library = AndroidApp.builder().addProgramFiles(androidJar).build();
     DirectMappedDexApplication appForMax =
         new ApplicationReader(library, options, Timing.empty()).read().toDirect();
     annotateMethodsNotOnLatestAndroidJar(appForMax, builder);
@@ -245,10 +246,7 @@
     DirectMappedDexApplication implementationApplication =
         new ApplicationReader(implementation, options, Timing.empty()).read().toDirect();
 
-    AndroidApp library =
-        AndroidApp.builder()
-            .addLibraryFiles(getAndroidJarPath(MAX_TESTED_ANDROID_API_LEVEL))
-            .build();
+    AndroidApp library = AndroidApp.builder().addLibraryFiles(androidJar).build();
     DirectMappedDexApplication amendedAppForMax =
         new ApplicationReader(library, options, Timing.empty()).read().toDirect();
 
@@ -402,15 +400,21 @@
             options.reporter,
             false,
             api.getLevel());
-    Path androidJarPath = getAndroidJarPath(librarySpecification.getRequiredCompilationApiLevel());
-    DexApplication app = createLoadingApp(androidJarPath, options);
+    DexApplication app = getLoadingApp(androidJar, options);
     return librarySpecification.toMachineSpecification(app, Timing.empty());
   }
 
-  private DexApplication createLoadingApp(Path androidLib, InternalOptions options)
+  private DexApplication getLoadingApp(Path androidJar, InternalOptions options)
+      throws IOException {
+    return loadingAppCache == null
+        ? loadingAppCache = createLoadingApp(androidJar, options)
+        : loadingAppCache;
+  }
+
+  private DexApplication createLoadingApp(Path androidJar, InternalOptions options)
       throws IOException {
     AndroidApp.Builder builder = AndroidApp.builder();
-    AndroidApp inputApp = builder.addLibraryFiles(androidLib).build();
+    AndroidApp inputApp = builder.addLibraryFiles(androidJar).build();
     ApplicationReader applicationReader = new ApplicationReader(inputApp, options, Timing.empty());
     ExecutorService executorService = ThreadUtils.getExecutorService(options);
     assert !options.ignoreJavaLibraryOverride;
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/PartialDesugaringTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/PartialDesugaringTest.java
index dd7c1cf..4ad1523 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/PartialDesugaringTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/PartialDesugaringTest.java
@@ -12,6 +12,7 @@
 import static org.junit.Assert.assertEquals;
 
 import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification;
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.DexMember;
@@ -129,7 +130,8 @@
   @Test
   public void test() throws Exception {
     SupportedClasses supportedClasses =
-        new SupportedClassesGenerator(new InternalOptions())
+        new SupportedClassesGenerator(
+                new InternalOptions(), ToolHelper.getAndroidJar(AndroidApiLevel.U))
             .run(librarySpecification.getDesugarJdkLibs(), librarySpecification.getSpecification());
 
     for (AndroidApiLevel api : getRelevantApiLevels()) {
@@ -205,10 +207,6 @@
         && api.isLessThan(AndroidApiLevel.T)) {
       expectedFailures.addAll(FAILURES_TO_ARRAY);
     }
-    if (librarySpecification == JDK8 && api.isLessThan(AndroidApiLevel.T)) {
-      // Interestingly that was added somehow to JDK8 desugared library at some point...
-      expectedFailures.addAll(FAILURES_TO_ARRAY);
-    }
     if (jdk11NonMinimal
         && api.isGreaterThanOrEqualTo(AndroidApiLevel.O)
         && api.isLessThan(AndroidApiLevel.U)) {