Merge commit 'd037b0e217014e1ea7091105cd4751ef7c37c7f1' into dev-release
diff --git a/.gitignore b/.gitignore
index 470dd43..d1bacd1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -41,8 +41,6 @@
 third_party/android_jar/lib.tar.gz
 third_party/android_jar/api-versions.tar.gz
 third_party/android_jar/api-versions
-third_party/android_jar/api-database.tar.gz
-third_party/android_jar/api-database
 third_party/android_sdk
 third_party/android_sdk.tar.gz
 third_party/bazel
diff --git a/build.gradle b/build.gradle
index 0812f9b..007fe58 100644
--- a/build.gradle
+++ b/build.gradle
@@ -247,7 +247,6 @@
     implementation group: 'org.ow2.asm', name: 'asm-tree', version: asmVersion
     implementation group: 'org.ow2.asm', name: 'asm-analysis', version: asmVersion
     implementation group: 'org.ow2.asm', name: 'asm-util', version: asmVersion
-    implementation files('third_party/android_jar/api-database/api-database.jar')
 
     main11Implementation "net.sf.jopt-simple:jopt-simple:$joptSimpleVersion"
     main11Implementation "com.google.code.gson:gson:$gsonVersion"
@@ -267,7 +266,6 @@
     main11Implementation group: 'org.ow2.asm', name: 'asm-tree', version: asmVersion
     main11Implementation group: 'org.ow2.asm', name: 'asm-analysis', version: asmVersion
     main11Implementation group: 'org.ow2.asm', name: 'asm-util', version: asmVersion
-    main11Implementation files('third_party/android_jar/api-database/api-database.jar')
 
     examplesTestNGRunnerCompile group: 'org.testng', name: 'testng', version: testngVersion
     testCompile sourceSets.examples.output
@@ -331,7 +329,6 @@
                 "android_jar/lib-v31",
                 "android_jar/lib-v32",
                 "android_jar/api-versions",
-                "android_jar/api-database",
                 "api-outlining/simple-app-dump",
                 "binary_compatibility_tests/compiler_api_tests",
                 "core-lambda-stubs",
diff --git a/src/library_desugar/jdk11/chm_only_desugar_jdk_libs.json b/src/library_desugar/jdk11/chm_only_desugar_jdk_libs.json
index ad27516..565ffd9 100644
--- a/src/library_desugar/jdk11/chm_only_desugar_jdk_libs.json
+++ b/src/library_desugar/jdk11/chm_only_desugar_jdk_libs.json
@@ -3,7 +3,7 @@
   "group_id" : "com.tools.android",
   "artifact_id" : "chm_only_desugar_jdk_libs",
   "version": "1.0.12",
-  "required_compilation_api_level": 26,
+  "required_compilation_api_level": 31,
   "synthesized_library_classes_package_prefix": "j$.",
   "support_all_callbacks_from_library": false,
   "common_flags": [
diff --git a/src/library_desugar/jdk11/desugar_jdk_libs.json b/src/library_desugar/jdk11/desugar_jdk_libs.json
index 241f740..0744c8f 100644
--- a/src/library_desugar/jdk11/desugar_jdk_libs.json
+++ b/src/library_desugar/jdk11/desugar_jdk_libs.json
@@ -3,7 +3,7 @@
   "group_id" : "com.tools.android",
   "artifact_id" : "desugar_jdk_libs",
   "version": "2.0.0",
-  "required_compilation_api_level": 26,
+  "required_compilation_api_level": 31,
   "synthesized_library_classes_package_prefix": "j$.",
   "support_all_callbacks_from_library": true,
   "common_flags": [
diff --git a/src/library_desugar/jdk11/desugar_jdk_libs_alternative_3.json b/src/library_desugar/jdk11/desugar_jdk_libs_alternative_3.json
index fca8af4..863111d 100644
--- a/src/library_desugar/jdk11/desugar_jdk_libs_alternative_3.json
+++ b/src/library_desugar/jdk11/desugar_jdk_libs_alternative_3.json
@@ -3,7 +3,7 @@
   "group_id" : "com.tools.android",
   "artifact_id" : "desugar_jdk_libs_alternative_3",
   "version": "2.0.0",
-  "required_compilation_api_level": 26,
+  "required_compilation_api_level": 31,
   "synthesized_library_classes_package_prefix": "j$.",
   "support_all_callbacks_from_library": false,
   "common_flags": [
@@ -78,7 +78,8 @@
         "java.net.URLDecoder": "j$.net.URLDecoder",
         "java.net.URLEncoder": "j$.net.URLEncoder",
         "java.lang.Desugar": "j$.lang.Desugar",
-        "java.lang.ref.Cleaner": "j$.lang.ref.Cleaner"
+        "java.lang.ref.Cleaner": "j$.lang.ref.Cleaner",
+        "sun.security.action.": "j$.sun.security.action."
       }
     },
     {
@@ -95,7 +96,6 @@
         "java.io.DesugarFile" : "j$.io.DesugarFile",
         "java.util.Desugar": "j$.util.Desugar",
         "sun.misc.Desugar": "j$.sun.misc.Desugar",
-        "sun.security.action.": "j$.sun.security.action.",
         "jdk.internal.": "j$.jdk.internal.",
         "java.nio.Desugar": "j$.nio.Desugar",
         "java.nio.channels.AsynchronousChannel": "j$.nio.channels.AsynchronousChannel",
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index 1483137..72c0cbb 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -69,7 +69,6 @@
 import com.android.tools.r8.naming.ProguardMapMinifier;
 import com.android.tools.r8.naming.ProguardMapSupplier;
 import com.android.tools.r8.naming.RecordRewritingNamingLens;
-import com.android.tools.r8.naming.SourceFileRewriter;
 import com.android.tools.r8.naming.signature.GenericSignatureRewriter;
 import com.android.tools.r8.optimize.ClassAndMemberPublicizer;
 import com.android.tools.r8.optimize.MemberRebindingAnalysis;
@@ -796,11 +795,6 @@
           LineNumberOptimizer.run(appView, getDirectApp(appView), inputApp, namingLens);
       timing.end();
 
-      // Overwrite SourceFile if specified. This step should be done after IR conversion.
-      timing.begin("Rename SourceFile");
-      new SourceFileRewriter(appView).run();
-      timing.end();
-
       // If a method filter is present don't produce output since the application is likely partial.
       if (options.hasMethodsFilter()) {
         System.out.println("Finished compilation with method filter: ");
diff --git a/src/main/java/com/android/tools/r8/R8Command.java b/src/main/java/com/android/tools/r8/R8Command.java
index 4923f93..cec2d83 100644
--- a/src/main/java/com/android/tools/r8/R8Command.java
+++ b/src/main/java/com/android/tools/r8/R8Command.java
@@ -15,6 +15,7 @@
 import com.android.tools.r8.inspector.Inspector;
 import com.android.tools.r8.inspector.internal.InspectorImpl;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibraryConfiguration;
+import com.android.tools.r8.naming.SourceFileRewriter;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.origin.PathOrigin;
 import com.android.tools.r8.shaking.ProguardConfiguration;
@@ -868,9 +869,6 @@
       internal.enableVerticalClassMerging = false;
     }
 
-    internal.mapIdProvider = getMapIdProvider();
-    internal.sourceFileProvider = getSourceFileProvider();
-
     // Amend the proguard-map consumer with options from the proguard configuration.
     internal.proguardMapConsumer =
         wrapStringConsumer(
@@ -940,6 +938,13 @@
     internal.synthesizedClassPrefix = synthesizedClassPrefix;
     internal.desugaredLibraryKeepRuleConsumer = desugaredLibraryKeepRuleConsumer;
 
+    // Set up the map and source file providers.
+    // Note that minify/optimize settings must be set on internal options before doing this.
+    internal.mapIdProvider = getMapIdProvider();
+    internal.sourceFileProvider =
+        SourceFileRewriter.computeSourceFileProvider(
+            getSourceFileProvider(), proguardConfiguration, internal);
+
     if (!DETERMINISTIC_DEBUGGING) {
       assert internal.threadCount == ThreadUtils.NOT_SPECIFIED;
       internal.threadCount = getThreadCount();
diff --git a/src/main/java/com/android/tools/r8/SourceFileProvider.java b/src/main/java/com/android/tools/r8/SourceFileProvider.java
index 95e127c..a0a58cc 100644
--- a/src/main/java/com/android/tools/r8/SourceFileProvider.java
+++ b/src/main/java/com/android/tools/r8/SourceFileProvider.java
@@ -20,4 +20,17 @@
    * @param environment An environment of values available for use when defining the source file.
    */
   String get(SourceFileEnvironment environment);
+
+  /**
+   * Allow producing outputs that might not always include the source file in stack traces.
+   *
+   * <p>Note that this does not affect the ability to retrace a stack trace. It is indented to
+   * ensure that the non-original/residual source file attribute will be printed in all stack traces
+   * on the supported VMs.
+   *
+   * @return True if the compiler may discard source file information (default false).
+   */
+  default boolean allowDiscardingSourceFile() {
+    return false;
+  }
 }
diff --git a/src/main/java/com/android/tools/r8/androidapi/AndroidApiLevelObjectDatabaseImpl.java b/src/main/java/com/android/tools/r8/androidapi/AndroidApiLevelObjectDatabaseImpl.java
deleted file mode 100644
index e48b221..0000000
--- a/src/main/java/com/android/tools/r8/androidapi/AndroidApiLevelObjectDatabaseImpl.java
+++ /dev/null
@@ -1,171 +0,0 @@
-// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package com.android.tools.r8.androidapi;
-
-import com.android.tools.r8.apimodel.AndroidApiDatabaseBuilder;
-import com.android.tools.r8.graph.DexField;
-import com.android.tools.r8.graph.DexMethod;
-import com.android.tools.r8.graph.DexReference;
-import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.references.ClassReference;
-import com.android.tools.r8.references.FieldReference;
-import com.android.tools.r8.references.MethodReference;
-import com.android.tools.r8.utils.AndroidApiLevel;
-import com.android.tools.r8.utils.Box;
-import com.android.tools.r8.utils.TraversalContinuation;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.function.BiFunction;
-
-public class AndroidApiLevelObjectDatabaseImpl implements AndroidApiLevelDatabase {
-
-  private final Map<DexType, AndroidApiClass> predefinedApiTypeLookup;
-
-  private final AndroidApiClass SENTINEL =
-      new AndroidApiClass(null) {
-
-        @Override
-        public AndroidApiLevel getApiLevel() {
-          return null;
-        }
-
-        @Override
-        public int getMemberCount() {
-          return 0;
-        }
-
-        @Override
-        protected TraversalContinuation visitFields(
-            BiFunction<FieldReference, AndroidApiLevel, TraversalContinuation> visitor,
-            ClassReference holder,
-            int minApiClass) {
-          return null;
-        }
-
-        @Override
-        protected TraversalContinuation visitMethods(
-            BiFunction<MethodReference, AndroidApiLevel, TraversalContinuation> visitor,
-            ClassReference holder,
-            int minApiClass) {
-          return null;
-        }
-      };
-
-  public AndroidApiLevelObjectDatabaseImpl(
-      List<AndroidApiForHashingClass> predefinedApiTypeLookupForHashing) {
-    Map<DexType, AndroidApiClass> predefinedMap = new HashMap<>();
-    for (AndroidApiForHashingClass androidApiClass : predefinedApiTypeLookupForHashing) {
-      predefinedMap.put(
-          androidApiClass.getType(),
-          new AndroidApiClass(androidApiClass.getType().asClassReference()) {
-            @Override
-            public AndroidApiLevel getApiLevel() {
-              return androidApiClass.getApiLevel();
-            }
-
-            @Override
-            public int getMemberCount() {
-              return 0;
-            }
-
-            @Override
-            protected TraversalContinuation visitFields(
-                BiFunction<FieldReference, AndroidApiLevel, TraversalContinuation> visitor,
-                ClassReference holder,
-                int minApiClass) {
-              Box<TraversalContinuation> continuationBox =
-                  new Box<>(TraversalContinuation.CONTINUE);
-              androidApiClass.visitFieldsWithApiLevels(
-                  (field, apiLevel) -> {
-                    if (continuationBox.get().shouldContinue()) {
-                      continuationBox.set(visitor.apply(field.asFieldReference(), apiLevel));
-                    }
-                  });
-              return continuationBox.get();
-            }
-
-            @Override
-            protected TraversalContinuation visitMethods(
-                BiFunction<MethodReference, AndroidApiLevel, TraversalContinuation> visitor,
-                ClassReference holder,
-                int minApiClass) {
-              Box<TraversalContinuation> continuationBox =
-                  new Box<>(TraversalContinuation.CONTINUE);
-              androidApiClass.visitMethodsWithApiLevels(
-                  (method, apiLevel) -> {
-                    if (continuationBox.get().shouldContinue()) {
-                      continuationBox.set(visitor.apply(method.asMethodReference(), apiLevel));
-                    }
-                  });
-              return continuationBox.get();
-            }
-          });
-    }
-    this.predefinedApiTypeLookup = predefinedMap;
-  }
-
-  @Override
-  public AndroidApiLevel getTypeApiLevel(DexType type) {
-    return lookupDefinedApiLevel(type);
-  }
-
-  @Override
-  public AndroidApiLevel getMethodApiLevel(DexMethod method) {
-    return lookupDefinedApiLevel(method);
-  }
-
-  @Override
-  public AndroidApiLevel getFieldApiLevel(DexField field) {
-    return lookupDefinedApiLevel(field);
-  }
-
-  private AndroidApiLevel lookupDefinedApiLevel(DexReference reference) {
-    AndroidApiClass foundClass =
-        predefinedApiTypeLookup.getOrDefault(reference.getContextType(), SENTINEL);
-    if (foundClass == null) {
-      return AndroidApiLevel.UNKNOWN;
-    }
-    AndroidApiClass androidApiClass;
-    if (foundClass == SENTINEL) {
-      androidApiClass =
-          AndroidApiDatabaseBuilder.buildClass(reference.getContextType().asClassReference());
-      if (androidApiClass == null) {
-        predefinedApiTypeLookup.put(reference.getContextType(), null);
-        return AndroidApiLevel.UNKNOWN;
-      }
-    } else {
-      androidApiClass = foundClass;
-    }
-    return reference.apply(
-        type -> androidApiClass.getApiLevel(),
-        field -> {
-          FieldReference fieldReference = field.asFieldReference();
-          Box<AndroidApiLevel> apiLevelBox = new Box<>(AndroidApiLevel.UNKNOWN);
-          androidApiClass.visitFields(
-              (fieldRef, apiLevel) -> {
-                if (fieldReference.equals(fieldRef)) {
-                  apiLevelBox.set(apiLevel);
-                  return TraversalContinuation.BREAK;
-                }
-                return TraversalContinuation.CONTINUE;
-              });
-          return apiLevelBox.get();
-        },
-        method -> {
-          MethodReference methodReference = method.asMethodReference();
-          Box<AndroidApiLevel> apiLevelBox = new Box<>(AndroidApiLevel.UNKNOWN);
-          androidApiClass.visitMethods(
-              (methodRef, apiLevel) -> {
-                if (methodReference.equals(methodRef)) {
-                  apiLevelBox.set(apiLevel);
-                  return TraversalContinuation.BREAK;
-                }
-                return TraversalContinuation.CONTINUE;
-              });
-          return apiLevelBox.get();
-        });
-  }
-}
diff --git a/src/main/java/com/android/tools/r8/androidapi/AndroidApiReferenceLevelCache.java b/src/main/java/com/android/tools/r8/androidapi/AndroidApiReferenceLevelCache.java
index f4049a0..2eed210 100644
--- a/src/main/java/com/android/tools/r8/androidapi/AndroidApiReferenceLevelCache.java
+++ b/src/main/java/com/android/tools/r8/androidapi/AndroidApiReferenceLevelCache.java
@@ -26,15 +26,9 @@
   private AndroidApiReferenceLevelCache(
       AppView<?> appView, List<AndroidApiForHashingClass> predefinedApiTypeLookupForHashing) {
     this.appView = appView;
-    // TODO(b/199934316): When the implementation has been decided on, remove the others.
-    if (appView.options().apiModelingOptions().useHashingDatabase) {
-      androidApiLevelDatabase =
-          new AndroidApiLevelHashingDatabaseImpl(
-              appView.dexItemFactory(), predefinedApiTypeLookupForHashing);
-    } else {
-      androidApiLevelDatabase =
-          new AndroidApiLevelObjectDatabaseImpl(predefinedApiTypeLookupForHashing);
-    }
+    androidApiLevelDatabase =
+        new AndroidApiLevelHashingDatabaseImpl(
+            appView.dexItemFactory(), predefinedApiTypeLookupForHashing);
     desugaredLibraryConfiguration = appView.options().desugaredLibraryConfiguration;
   }
 
diff --git a/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java b/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
index 10e78f3..8209749 100644
--- a/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
+++ b/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
@@ -348,8 +348,8 @@
 
   private void rewriteSourceFile(DexProgramClass clazz, SourceFileEnvironment environment) {
     assert options.sourceFileProvider != null;
-    clazz.setSourceFile(
-        options.itemFactory.createString(options.sourceFileProvider.get(environment)));
+    String sourceFile = options.sourceFileProvider.get(environment);
+    clazz.setSourceFile(sourceFile == null ? null : options.itemFactory.createString(sourceFile));
   }
 
   private void writeVirtualFile(VirtualFile virtualFile, Timing timing) {
diff --git a/src/main/java/com/android/tools/r8/graph/DexEncodedField.java b/src/main/java/com/android/tools/r8/graph/DexEncodedField.java
index 5cfbeeb..56a302d 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedField.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedField.java
@@ -299,15 +299,21 @@
     return null;
   }
 
-  public DexEncodedField toTypeSubstitutedField(DexField field) {
-    return toTypeSubstitutedField(field, ConsumerUtils.emptyConsumer());
+  public DexEncodedField toTypeSubstitutedField(AppView<?> appView, DexField field) {
+    return toTypeSubstitutedField(appView, field, ConsumerUtils.emptyConsumer());
   }
 
-  public DexEncodedField toTypeSubstitutedField(DexField field, Consumer<Builder> consumer) {
+  public DexEncodedField toTypeSubstitutedField(
+      AppView<?> appView, DexField field, Consumer<Builder> consumer) {
     if (this.getReference() == field) {
       return this;
     }
-    return builder(this).setField(field).apply(consumer).build();
+    return builder(this)
+        .setField(field)
+        .disableAndroidApiLevelCheckIf(
+            !appView.options().apiModelingOptions().enableApiCallerIdentification)
+        .apply(consumer)
+        .build();
   }
 
   public boolean validateDexValue(DexItemFactory factory) {
@@ -359,7 +365,7 @@
     private FieldAccessFlags accessFlags;
     private FieldTypeSignature genericSignature = FieldTypeSignature.noSignature();
     private DexValue staticValue = null;
-    private AndroidApiLevel apiLevel = AndroidApiLevel.UNKNOWN;
+    private AndroidApiLevel apiLevel = AndroidApiLevel.NOT_SET;
     private FieldOptimizationInfo optimizationInfo = DefaultFieldOptimizationInfo.getInstance();
     private boolean deprecated;
     private final boolean d8R8Synthesized;
@@ -453,7 +459,13 @@
     }
 
     public Builder disableAndroidApiLevelCheck() {
-      checkAndroidApiLevel = false;
+      return disableAndroidApiLevelCheckIf(true);
+    }
+
+    public Builder disableAndroidApiLevelCheckIf(boolean shouldDisable) {
+      if (shouldDisable) {
+        checkAndroidApiLevel = false;
+      }
       return this;
     }
 
diff --git a/src/main/java/com/android/tools/r8/graph/GenericSignatureEnqueuerAnalysis.java b/src/main/java/com/android/tools/r8/graph/GenericSignatureEnqueuerAnalysis.java
index e889a40..33f6e4d 100644
--- a/src/main/java/com/android/tools/r8/graph/GenericSignatureEnqueuerAnalysis.java
+++ b/src/main/java/com/android/tools/r8/graph/GenericSignatureEnqueuerAnalysis.java
@@ -7,10 +7,13 @@
 import com.android.tools.r8.graph.analysis.EnqueuerAnalysis;
 import com.android.tools.r8.shaking.Enqueuer.EnqueuerDefinitionSupplier;
 import com.android.tools.r8.shaking.EnqueuerWorklist;
+import com.google.common.collect.Sets;
+import java.util.Set;
 
 public class GenericSignatureEnqueuerAnalysis extends EnqueuerAnalysis {
 
   private final EnqueuerDefinitionSupplier enqueuerDefinitionSupplier;
+  private final Set<DexReference> processedSignatures = Sets.newIdentityHashSet();
 
   public GenericSignatureEnqueuerAnalysis(EnqueuerDefinitionSupplier enqueuerDefinitionSupplier) {
     this.enqueuerDefinitionSupplier = enqueuerDefinitionSupplier;
@@ -18,20 +21,45 @@
 
   @Override
   public void processNewlyLiveClass(DexProgramClass clazz, EnqueuerWorklist worklist) {
-    new GenericSignatureTypeVisitor(clazz, enqueuerDefinitionSupplier::definitionFor)
-        .visitClassSignature(clazz.getClassSignature());
+    processSignature(clazz, clazz.getContext());
+  }
+
+  @Override
+  public void notifyMarkFieldAsReachable(ProgramField field) {
+    processSignature(field, field.getContext());
   }
 
   @Override
   public void processNewlyLiveField(ProgramField field, ProgramDefinition context) {
-    new GenericSignatureTypeVisitor(context, enqueuerDefinitionSupplier::definitionFor)
-        .visitFieldTypeSignature(field.getDefinition().getGenericSignature());
+    processSignature(field, context);
+  }
+
+  @Override
+  public void notifyMarkMethodAsTargeted(ProgramMethod method) {
+    processSignature(method, method.getContext());
   }
 
   @Override
   public void processNewlyLiveMethod(ProgramMethod method, ProgramDefinition context) {
-    new GenericSignatureTypeVisitor(context, enqueuerDefinitionSupplier::definitionFor)
-        .visitMethodSignature(method.getDefinition().getGenericSignature());
+    processSignature(method, context);
   }
 
+  private void processSignature(ProgramDefinition signatureHolder, ProgramDefinition context) {
+    if (!processedSignatures.add(signatureHolder.getReference())) {
+      return;
+    }
+    GenericSignatureTypeVisitor genericSignatureTypeVisitor =
+        new GenericSignatureTypeVisitor(context, enqueuerDefinitionSupplier::definitionFor);
+    if (signatureHolder.isClass()) {
+      genericSignatureTypeVisitor.visitClassSignature(
+          signatureHolder.asClass().getClassSignature());
+    } else if (signatureHolder.isMethod()) {
+      genericSignatureTypeVisitor.visitMethodSignature(
+          signatureHolder.asMethod().getDefinition().getGenericSignature());
+    } else {
+      assert signatureHolder.isField();
+      genericSignatureTypeVisitor.visitFieldTypeSignature(
+          signatureHolder.asField().getDefinition().getGenericSignature());
+    }
+  }
 }
diff --git a/src/main/java/com/android/tools/r8/graph/TreeFixerBase.java b/src/main/java/com/android/tools/r8/graph/TreeFixerBase.java
index f3670f3..16427bf 100644
--- a/src/main/java/com/android/tools/r8/graph/TreeFixerBase.java
+++ b/src/main/java/com/android/tools/r8/graph/TreeFixerBase.java
@@ -179,7 +179,7 @@
     DexField fieldReference = field.getReference();
     DexField newFieldReference = fixupFieldReference(fieldReference);
     if (newFieldReference != fieldReference) {
-      return recordFieldChange(field, field.toTypeSubstitutedField(newFieldReference));
+      return recordFieldChange(field, field.toTypeSubstitutedField(appView, newFieldReference));
     }
     return field;
   }
diff --git a/src/main/java/com/android/tools/r8/graph/analysis/InvokeVirtualToInterfaceVerifyErrorWorkaround.java b/src/main/java/com/android/tools/r8/graph/analysis/InvokeVirtualToInterfaceVerifyErrorWorkaround.java
new file mode 100644
index 0000000..7c17e4c
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/graph/analysis/InvokeVirtualToInterfaceVerifyErrorWorkaround.java
@@ -0,0 +1,89 @@
+// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.graph.analysis;
+
+import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
+import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.shaking.Enqueuer;
+import com.android.tools.r8.shaking.KeepInfo.Joiner;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import com.android.tools.r8.utils.InternalOptions;
+
+/**
+ * Workaround for situations where an interface in the framework has been changed into a class. When
+ * compiling against a recent android.jar, virtual invokes to such classes may resolve to interface
+ * methods on older API levels, which can lead to verification errors (see b/206891715).
+ *
+ * <p>To mitigate this issue, we pin methods that have virtual invokes to such classes. This ensures
+ * that we don't move these virtual invokes elsewhere (e.g., due to inlining or class merging),
+ * which would otherwise lead to verification errors in other classes.
+ */
+// TODO(b/206891715): This only mitigates the issue. The user may still need to manually outline
+//  virtual invokes to classes that was once an interface. To avoid this in general (including D8)
+//  the compiler should outline the problematic invokes.
+public class InvokeVirtualToInterfaceVerifyErrorWorkaround implements EnqueuerInvokeAnalysis {
+
+  private final DexType androidHardwareCamera2CameraDeviceType;
+  private final Enqueuer enqueuer;
+  private final InternalOptions options;
+
+  public InvokeVirtualToInterfaceVerifyErrorWorkaround(
+      AppView<? extends AppInfoWithClassHierarchy> appView, Enqueuer enqueuer) {
+    this.androidHardwareCamera2CameraDeviceType =
+        appView.dexItemFactory().createType("Landroid/hardware/camera2/CameraDevice;");
+    this.enqueuer = enqueuer;
+    this.options = appView.options();
+  }
+
+  public static void register(
+      AppView<? extends AppInfoWithClassHierarchy> appView, Enqueuer enqueuer) {
+    if (!isNoop(appView)) {
+      enqueuer.registerInvokeAnalysis(
+          new InvokeVirtualToInterfaceVerifyErrorWorkaround(appView, enqueuer));
+    }
+  }
+
+  private static boolean isNoop(AppView<? extends AppInfoWithClassHierarchy> appView) {
+    return appView.options().getMinApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.L);
+  }
+
+  @Override
+  public void traceInvokeVirtual(DexMethod invokedMethod, ProgramMethod context) {
+    if (isInterfaceInSomeApiLevel(invokedMethod.getHolderType())) {
+      enqueuer.getKeepInfo().joinMethod(context, Joiner::disallowOptimization);
+    }
+  }
+
+  private boolean isInterfaceInSomeApiLevel(DexType type) {
+    // CameraDevice was added as a class in API 21 (L), but was defined as an interface in the
+    // framework before then.
+    return type == androidHardwareCamera2CameraDeviceType
+        && (options.isGeneratingClassFiles()
+            || options.getMinApiLevel().isLessThan(AndroidApiLevel.L));
+  }
+
+  @Override
+  public void traceInvokeDirect(DexMethod invokedMethod, ProgramMethod context) {
+    // Intentionally empty.
+  }
+
+  @Override
+  public void traceInvokeInterface(DexMethod invokedMethod, ProgramMethod context) {
+    // Intentionally empty.
+  }
+
+  @Override
+  public void traceInvokeStatic(DexMethod invokedMethod, ProgramMethod context) {
+    // Intentionally empty.
+  }
+
+  @Override
+  public void traceInvokeSuper(DexMethod invokedMethod, ProgramMethod context) {
+    // Intentionally empty.
+  }
+}
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassInstanceFieldsMerger.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassInstanceFieldsMerger.java
index 21f8a5c..a8b8d30 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassInstanceFieldsMerger.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassInstanceFieldsMerger.java
@@ -151,6 +151,7 @@
     if (needsRelaxedType(targetField, sourceFields)) {
       newField =
           targetField.toTypeSubstitutedField(
+              appView,
               targetField
                   .getReference()
                   .withType(appView.dexItemFactory().objectType, appView.dexItemFactory()));
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassStaticFieldsMerger.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassStaticFieldsMerger.java
index f94d407..5fcbc0d 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassStaticFieldsMerger.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassStaticFieldsMerger.java
@@ -15,6 +15,7 @@
 
 public class ClassStaticFieldsMerger {
 
+  private final AppView<?> appView;
   private final DexItemFactory dexItemFactory;
   private final MergeGroup group;
   private final Builder lensBuilder;
@@ -23,6 +24,7 @@
 
   public ClassStaticFieldsMerger(
       AppView<?> appView, HorizontalClassMergerGraphLens.Builder lensBuilder, MergeGroup group) {
+    this.appView = appView;
     this.dexItemFactory = appView.dexItemFactory();
     this.group = group;
     this.lensBuilder = lensBuilder;
@@ -50,7 +52,7 @@
             field.getName().toString(),
             this::isFresh);
 
-    field = field.toTypeSubstitutedField(newFieldReference);
+    field = field.toTypeSubstitutedField(appView, newFieldReference);
     targetFields.put(newFieldReference, field);
 
     lensBuilder.recordNewFieldSignature(oldFieldReference, newFieldReference);
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/TreeFixer.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/TreeFixer.java
index 7a74a2b..4a3f2ff 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/TreeFixer.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/TreeFixer.java
@@ -430,7 +430,7 @@
 
       if (newFieldReference != oldFieldReference) {
         lensBuilder.fixupField(oldFieldReference, newFieldReference);
-        newFields[i] = oldField.toTypeSubstitutedField(newFieldReference);
+        newFields[i] = oldField.toTypeSubstitutedField(appView, newFieldReference);
       } else {
         newFields[i] = oldField;
       }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java
index d2a73ed..e392248 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java
@@ -468,6 +468,7 @@
     return field
         .getDefinition()
         .toTypeSubstitutedField(
+            appView,
             newFieldSignature,
             builder ->
                 builder
@@ -621,6 +622,7 @@
         lensBuilder.move(field, newField);
         DexEncodedField newEncodedField =
             encodedField.toTypeSubstitutedField(
+                appView,
                 newField,
                 builder ->
                     builder.setAbstractValue(
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/staticizer/StaticizingProcessor.java b/src/main/java/com/android/tools/r8/ir/optimize/staticizer/StaticizingProcessor.java
index 9397cc6..62176cb 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/staticizer/StaticizingProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/staticizer/StaticizingProcessor.java
@@ -832,7 +832,7 @@
       DexEncodedField field = oldFields.get(i);
       DexField newField = mapCandidateField(field.getReference(), candidateClass.type, hostType);
       if (newField != field.getReference()) {
-        newFields[i] = field.toTypeSubstitutedField(newField);
+        newFields[i] = field.toTypeSubstitutedField(appView, newField);
         fieldMapping.put(field.getReference(), newField);
       } else {
         newFields[i] = field;
@@ -844,7 +844,7 @@
         DexEncodedField field = extraFields.get(i);
         DexField newField = mapCandidateField(field.getReference(), candidateClass.type, hostType);
         if (newField != field.getReference()) {
-          newFields[numOfHostStaticFields + i] = field.toTypeSubstitutedField(newField);
+          newFields[numOfHostStaticFields + i] = field.toTypeSubstitutedField(appView, newField);
           fieldMapping.put(field.getReference(), newField);
         } else {
           newFields[numOfHostStaticFields + i] = field;
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinLambdaInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinLambdaInfo.java
index c8cb4d6..b9e4f84 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinLambdaInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinLambdaInfo.java
@@ -73,12 +73,6 @@
         break;
       }
     }
-    if (backing == null) {
-      appView
-          .options()
-          .reporter
-          .info(KotlinMetadataDiagnostic.lambdaBackingNotFound(clazz.type, function.getName()));
-    }
     return function.rewrite(visitorProvider.get()::visitFunction, backing, appView, namingLens);
   }
 
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataDiagnostic.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataDiagnostic.java
index 6c4c963..83947d7 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataDiagnostic.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataDiagnostic.java
@@ -73,17 +73,4 @@
             + StringUtils.LINE_SEPARATOR
             + StringUtils.stacktraceAsString(t));
   }
-
-  static KotlinMetadataDiagnostic lambdaBackingNotFound(DexType type, String functionName) {
-    return new KotlinMetadataDiagnostic(
-        Origin.unknown(),
-        Position.UNKNOWN,
-        "The lambda function "
-            + functionName
-            + " could no longer be found in "
-            + type.toSourceString()
-            + " . The method is most likely pruned and would require a specific keep rule to keep"
-            + " alive. As a result, the metadata information regarding the lambda structure has"
-            + " been discarded.");
-  }
 }
diff --git a/src/main/java/com/android/tools/r8/naming/SourceFileRewriter.java b/src/main/java/com/android/tools/r8/naming/SourceFileRewriter.java
index 13d7fc6..baa2951 100644
--- a/src/main/java/com/android/tools/r8/naming/SourceFileRewriter.java
+++ b/src/main/java/com/android/tools/r8/naming/SourceFileRewriter.java
@@ -5,70 +5,72 @@
 
 import com.android.tools.r8.SourceFileEnvironment;
 import com.android.tools.r8.SourceFileProvider;
-import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexItemFactory;
+import com.android.tools.r8.shaking.ProguardConfiguration;
+import com.android.tools.r8.utils.InternalOptions;
 
 /** Computes the source file provider based on the proguard configuration if none is set. */
 public class SourceFileRewriter {
 
-  private final AppView<?> appView;
-
-  public SourceFileRewriter(AppView<?> appView) {
-    this.appView = appView;
+  public static SourceFileProvider computeSourceFileProvider(
+      SourceFileProvider provider, ProguardConfiguration configuration, InternalOptions options) {
+    if (provider != null) {
+      return provider;
+    }
+    if (!configuration.getKeepAttributes().sourceFile) {
+      return rewriteToDefaultSourceFile(options.dexItemFactory());
+    }
+    if (options.forceProguardCompatibility) {
+      return computeCompatProvider(options);
+    }
+    return computeNonCompatProvider(options);
   }
 
-  public void run() {
-    if (appView.options().sourceFileProvider != null) {
-      return;
-    }
-    appView.options().sourceFileProvider = computeSourceFileProvider();
-  }
-
-  public SourceFileProvider computeSourceFileProvider() {
-    if (!appView.options().getProguardConfiguration().getKeepAttributes().sourceFile) {
-      return rewriteToDefaultSourceFile();
-    }
-    if (appView.options().forceProguardCompatibility) {
-      return computeCompatProvider();
-    }
-    return computeNonCompatProvider();
-  }
-
-  private SourceFileProvider computeCompatProvider() {
+  private static SourceFileProvider computeCompatProvider(InternalOptions options) {
     // Compatibility mode will only apply -renamesourcefileattribute when minifying names.
-    if (appView.options().isMinifying()) {
-      String renaming = getRenameSourceFileAttribute();
+    if (options.isMinifying()) {
+      String renaming = getRenameSourceFileAttribute(options);
       if (renaming != null) {
-        return rewriteTo(renaming);
+        return rewriteTo(renaming, isDefault(renaming, options));
       }
     }
     return null;
   }
 
-  private SourceFileProvider computeNonCompatProvider() {
-    String renaming = getRenameSourceFileAttribute();
+  private static SourceFileProvider computeNonCompatProvider(InternalOptions options) {
+    String renaming = getRenameSourceFileAttribute(options);
     if (renaming != null) {
-      return rewriteTo(renaming);
+      return rewriteTo(renaming, isDefault(renaming, options));
     }
-    if (appView.options().isMinifying() || appView.options().isOptimizing()) {
-      return rewriteToDefaultSourceFile();
+    if (options.isMinifying() || options.isOptimizing()) {
+      return rewriteToDefaultSourceFile(options.dexItemFactory());
     }
     return null;
   }
 
-  private String getRenameSourceFileAttribute() {
-    return appView.options().getProguardConfiguration().getRenameSourceFileAttribute();
+  private static String getRenameSourceFileAttribute(InternalOptions options) {
+    return options.getProguardConfiguration().getRenameSourceFileAttribute();
   }
 
-  private SourceFileProvider rewriteToDefaultSourceFile() {
-    return rewriteTo(appView.dexItemFactory().defaultSourceFileAttributeString);
+  public static boolean isDefault(String sourceFile, InternalOptions options) {
+    return options.dexItemFactory().defaultSourceFileAttributeString.equals(sourceFile);
   }
 
-  private SourceFileProvider rewriteTo(String renaming) {
+  private static SourceFileProvider rewriteToDefaultSourceFile(DexItemFactory factory) {
+    return rewriteTo(factory.defaultSourceFileAttributeString, true);
+  }
+
+  private static SourceFileProvider rewriteTo(String renaming, boolean allowDiscard) {
     return new SourceFileProvider() {
       @Override
       public String get(SourceFileEnvironment environment) {
         return renaming;
       }
+
+      @Override
+      public boolean allowDiscardingSourceFile() {
+        return allowDiscard;
+      }
     };
   }
 }
diff --git a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
index fc81e6c..fdd1b9f 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -84,6 +84,7 @@
 import com.android.tools.r8.graph.analysis.EnqueuerExceptionGuardAnalysis;
 import com.android.tools.r8.graph.analysis.EnqueuerInstanceOfAnalysis;
 import com.android.tools.r8.graph.analysis.EnqueuerInvokeAnalysis;
+import com.android.tools.r8.graph.analysis.InvokeVirtualToInterfaceVerifyErrorWorkaround;
 import com.android.tools.r8.ir.analysis.proto.ProtoEnqueuerUseRegistry;
 import com.android.tools.r8.ir.analysis.proto.schema.ProtoEnqueuerExtension;
 import com.android.tools.r8.ir.code.ArrayPut;
@@ -234,11 +235,11 @@
   private final boolean forceProguardCompatibility;
   private final Mode mode;
 
-  private Set<EnqueuerAnalysis> analyses = Sets.newIdentityHashSet();
-  private Set<EnqueuerInvokeAnalysis> invokeAnalyses = Sets.newIdentityHashSet();
-  private Set<EnqueuerInstanceOfAnalysis> instanceOfAnalyses = Sets.newIdentityHashSet();
-  private Set<EnqueuerExceptionGuardAnalysis> exceptionGuardAnalyses = Sets.newIdentityHashSet();
-  private Set<EnqueuerCheckCastAnalysis> checkCastAnalyses = Sets.newIdentityHashSet();
+  private Set<EnqueuerAnalysis> analyses = new LinkedHashSet<>();
+  private Set<EnqueuerInvokeAnalysis> invokeAnalyses = new LinkedHashSet<>();
+  private Set<EnqueuerInstanceOfAnalysis> instanceOfAnalyses = new LinkedHashSet<>();
+  private Set<EnqueuerExceptionGuardAnalysis> exceptionGuardAnalyses = new LinkedHashSet<>();
+  private Set<EnqueuerCheckCastAnalysis> checkCastAnalyses = new LinkedHashSet<>();
 
   // Don't hold a direct pointer to app info (use appView).
   private AppInfoWithClassHierarchy appInfo;
@@ -479,6 +480,7 @@
             : null;
 
     if (mode.isInitialOrFinalTreeShaking()) {
+      InvokeVirtualToInterfaceVerifyErrorWorkaround.register(appView, this);
       if (options.protoShrinking().enableGeneratedMessageLiteShrinking) {
         registerAnalysis(new ProtoEnqueuerExtension(appView));
       }
@@ -536,7 +538,7 @@
     return this;
   }
 
-  private Enqueuer registerInvokeAnalysis(EnqueuerInvokeAnalysis analysis) {
+  public Enqueuer registerInvokeAnalysis(EnqueuerInvokeAnalysis analysis) {
     invokeAnalyses.add(analysis);
     return this;
   }
@@ -681,6 +683,10 @@
     return clazz;
   }
 
+  public MutableKeepInfoCollection getKeepInfo() {
+    return keepInfo;
+  }
+
   public KeepClassInfo getKeepInfo(DexProgramClass clazz) {
     return keepInfo.getClassInfo(clazz);
   }
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardClassType.java b/src/main/java/com/android/tools/r8/shaking/ProguardClassType.java
index c9ab49b..de70c89 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardClassType.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardClassType.java
@@ -28,7 +28,7 @@
   INTERFACE {
     @Override
     public boolean matches(DexClass clazz) {
-      return clazz.accessFlags.isInterface() && !clazz.accessFlags.isAnnotation();
+      return clazz.accessFlags.isInterface();
     }
   },
   UNSPECIFIED {
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
index 99da4fb..f86a251 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
@@ -79,7 +79,8 @@
       "convert_proto_enum_to_string");
 
   private static final List<String> IGNORED_CLASS_DESCRIPTOR_OPTIONS =
-      ImmutableList.of("isclassnamestring", "whyarenotsimple", "convertchecknotnull");
+      ImmutableList.of(
+          "isclassnamestring", "whyarenotsimple", "convertchecknotnull", "checkenumunboxed");
 
   private static final List<String> IGNORED_RETURN_VALUE_ATTRIBUTES = ImmutableList.of("_NONNULL_");
 
diff --git a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
index 6d90250..4f116de 100644
--- a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
+++ b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
@@ -1673,7 +1673,7 @@
         } while (!availableFieldSignatures.test(newSignature));
       }
 
-      return field.toTypeSubstitutedField(newSignature);
+      return field.toTypeSubstitutedField(appView, newSignature);
     }
 
     private void makeStatic(DexEncodedMethod method) {
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
index fca35a8..727f9c9 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -1472,7 +1472,6 @@
 
     public boolean enableApiCallerIdentification = true;
     public boolean checkAllApiReferencesAreSet = true;
-    public boolean useHashingDatabase = true;
 
     public void visitMockedApiLevelsForReferences(
         DexItemFactory factory, Consumer<AndroidApiForHashingClass> consumer) {
diff --git a/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java b/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java
index e0ecef3..2e9c933 100644
--- a/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java
+++ b/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java
@@ -362,6 +362,10 @@
         }
       }
 
+      boolean canStripDebugInfo =
+          appView.options().sourceFileProvider != null
+              && appView.options().sourceFileProvider.allowDiscardingSourceFile();
+
       if (isSyntheticClass) {
         onDemandClassNamingBuilder
             .get()
@@ -413,7 +417,9 @@
           List<MappedPosition> mappedPositions;
           Code code = method.getCode();
           boolean canUseDexPc =
-              appView.options().canUseDexPcAsDebugInformation() && methods.size() == 1;
+              canStripDebugInfo
+                  && appView.options().canUseDexPcAsDebugInformation()
+                  && methods.size() == 1;
           if (code != null) {
             if (code.isDexCode() && doesContainPositions(code.asDexCode())) {
               if (canUseDexPc) {
@@ -582,7 +588,8 @@
             }
             i = j;
           }
-          if (method.getCode().isDexCode()
+          if (canStripDebugInfo
+              && method.getCode().isDexCode()
               && method.getCode().asDexCode().getDebugInfo()
                   == DexDebugInfoForSingleLineMethod.getInstance()) {
             method.getCode().asDexCode().setDebugInfo(null);
diff --git a/src/test/java/com/android/tools/r8/KotlinTestBase.java b/src/test/java/com/android/tools/r8/KotlinTestBase.java
index 539fe56..8dd8a44 100644
--- a/src/test/java/com/android/tools/r8/KotlinTestBase.java
+++ b/src/test/java/com/android/tools/r8/KotlinTestBase.java
@@ -81,6 +81,10 @@
     }
   }
 
+  public static Path getKotlinResourcesFolder() {
+    return Paths.get(ToolHelper.TESTS_DIR, RSRC);
+  }
+
   protected Path getJavaJarFile(String folder) {
     return Paths.get(ToolHelper.TESTS_BUILD_DIR, RSRC,
         targetVersion.getFolderName(), folder + ".java" + FileUtils.JAR_EXTENSION);
diff --git a/src/test/java/com/android/tools/r8/L8TestBuilder.java b/src/test/java/com/android/tools/r8/L8TestBuilder.java
index cd0036b..072da5a 100644
--- a/src/test/java/com/android/tools/r8/L8TestBuilder.java
+++ b/src/test/java/com/android/tools/r8/L8TestBuilder.java
@@ -8,7 +8,6 @@
 import static junit.framework.TestCase.assertTrue;
 
 import com.android.tools.r8.TestBase.Backend;
-import com.android.tools.r8.desugar.desugaredlibrary.jdk11.DesugaredLibraryJDK11Undesugarer;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.AndroidAppConsumers;
@@ -39,7 +38,7 @@
   private List<Path> additionalProgramFiles = new ArrayList<>();
   private List<byte[]> additionalProgramClassFileData = new ArrayList<>();
   private Consumer<InternalOptions> optionsModifier = ConsumerUtils.emptyConsumer();
-  private Path desugarJDKLibs = DesugaredLibraryJDK11Undesugarer.undesugaredJar();
+  private Path desugarJDKLibs = ToolHelper.getDesugarJDKLibs();
   private Path desugarJDKLibsConfiguration = null;
   private StringResource desugaredLibraryConfiguration =
       StringResource.fromFile(ToolHelper.getDesugarLibJsonForTesting());
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java
index 52b4ac9..53886e2 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -14,6 +14,7 @@
 import com.android.tools.r8.TestBase.Backend;
 import com.android.tools.r8.TestRuntime.CfRuntime;
 import com.android.tools.r8.ToolHelper.DexVm.Kind;
+import com.android.tools.r8.desugar.desugaredlibrary.jdk11.DesugaredLibraryJDK11Undesugarer;
 import com.android.tools.r8.dex.ApplicationReader;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.AppView;
@@ -181,6 +182,10 @@
       Paths.get(LIBS_DIR, "library_desugar_conversions.zip");
 
   public static Path getDesugarJDKLibs() {
+    return DesugaredLibraryJDK11Undesugarer.undesugaredJar();
+  }
+
+  public static Path getDesugarJDKLibsBazelGeneratedFile() {
     return Paths.get(
         System.getProperty(
             "desugar_jdk_libs", "third_party/openjdk/desugar_jdk_libs/desugar_jdk_libs.jar"));
diff --git a/src/test/java/com/android/tools/r8/apimodel/AndroidApiDatabaseBuilderTemplate.java b/src/test/java/com/android/tools/r8/apimodel/AndroidApiDatabaseBuilderTemplate.java
deleted file mode 100644
index 4b21f6e..0000000
--- a/src/test/java/com/android/tools/r8/apimodel/AndroidApiDatabaseBuilderTemplate.java
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package com.android.tools.r8.apimodel;
-
-import com.android.tools.r8.androidapi.AndroidApiClass;
-import com.android.tools.r8.references.ClassReference;
-import com.android.tools.r8.utils.DescriptorUtils;
-import java.util.function.Consumer;
-
-/** This is a template for generating the AndroidApiDatabaseBuilder. */
-public class AndroidApiDatabaseBuilderTemplate /* AndroidApiDatabaseBuilder */ {
-
-  public static void visitApiClasses(Consumer<String> classDescriptorConsumer) {
-    // Code added dynamically in AndroidApiDatabaseBuilderGenerator.
-    placeHolderForVisitApiClasses();
-  }
-
-  public static AndroidApiClass buildClass(ClassReference classReference) {
-    String descriptor = classReference.getDescriptor();
-    String packageName = DescriptorUtils.getPackageNameFromDescriptor(descriptor);
-    String simpleClassName = DescriptorUtils.getSimpleClassNameFromDescriptor(descriptor);
-    // Code added dynamically in AndroidApiDatabaseBuilderGenerator.
-    placeHolderForBuildClass();
-    return null;
-  }
-
-  private static void placeHolderForVisitApiClasses() {}
-
-  private static void placeHolderForBuildClass() {}
-}
diff --git a/src/test/java/com/android/tools/r8/apimodel/AndroidApiDatabaseClassTemplate.java b/src/test/java/com/android/tools/r8/apimodel/AndroidApiDatabaseClassTemplate.java
deleted file mode 100644
index 1a8b7e3..0000000
--- a/src/test/java/com/android/tools/r8/apimodel/AndroidApiDatabaseClassTemplate.java
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package com.android.tools.r8.apimodel;
-
-import com.android.tools.r8.androidapi.AndroidApiClass;
-import com.android.tools.r8.references.ClassReference;
-import com.android.tools.r8.references.FieldReference;
-import com.android.tools.r8.references.MethodReference;
-import com.android.tools.r8.references.Reference;
-import com.android.tools.r8.utils.AndroidApiLevel;
-import com.android.tools.r8.utils.TraversalContinuation;
-import java.util.function.BiFunction;
-
-/** This is a template for generating AndroidApiDatabaseClass extending AndroidApiClass */
-public class AndroidApiDatabaseClassTemplate extends AndroidApiClass {
-
-  protected AndroidApiDatabaseClassTemplate() {
-    // Code added dynamically in AndroidApiDatabaseBuilderGenerator.
-    super(Reference.classFromDescriptor(placeHolderForInit()));
-  }
-
-  @Override
-  public AndroidApiLevel getApiLevel() {
-    // Code added dynamically in AndroidApiDatabaseBuilderGenerator.
-    return placeHolderForGetApiLevel();
-  }
-
-  @Override
-  public int getMemberCount() {
-    // Code added dynamically in AndroidApiDatabaseBuilderGenerator.
-    return placeHolderForGetMemberCount();
-  }
-
-  @Override
-  public TraversalContinuation visitFields(
-      BiFunction<FieldReference, AndroidApiLevel, TraversalContinuation> visitor,
-      ClassReference holder,
-      int minApi) {
-    // Code added dynamically in AndroidApiDatabaseBuilderGenerator.
-    placeHolderForVisitFields();
-    return TraversalContinuation.CONTINUE;
-  }
-
-  @Override
-  public TraversalContinuation visitMethods(
-      BiFunction<MethodReference, AndroidApiLevel, TraversalContinuation> visitor,
-      ClassReference holder,
-      int minApi) {
-    // Code added dynamically in AndroidApiDatabaseBuilderGenerator.
-    placeHolderForVisitMethods();
-    return TraversalContinuation.CONTINUE;
-  }
-
-  private static String placeHolderForInit() {
-    return null;
-  }
-
-  private static AndroidApiLevel placeHolderForGetApiLevel() {
-    return null;
-  }
-
-  private static int placeHolderForGetMemberCount() {
-    return 0;
-  }
-
-  private static void placeHolderForVisitFields() {}
-
-  private static void placeHolderForVisitMethods() {}
-}
diff --git a/src/test/java/com/android/tools/r8/apimodel/AndroidApiDatabasePackageTemplate.java b/src/test/java/com/android/tools/r8/apimodel/AndroidApiDatabasePackageTemplate.java
deleted file mode 100644
index 3919d11..0000000
--- a/src/test/java/com/android/tools/r8/apimodel/AndroidApiDatabasePackageTemplate.java
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package com.android.tools.r8.apimodel;
-
-import com.android.tools.r8.androidapi.AndroidApiClass;
-
-/** This is a template for generating the AndroidApiDatabasePackage. */
-public class AndroidApiDatabasePackageTemplate {
-
-  public static AndroidApiClass buildClass(String className) {
-    // Code added dynamically in AndroidApiDatabaseBuilderGenerator.
-    placeHolder();
-    return null;
-  }
-
-  private static void placeHolder() {}
-}
diff --git a/src/test/java/com/android/tools/r8/apimodel/AndroidApiObjectDatabaseBuilderGenerator.java b/src/test/java/com/android/tools/r8/apimodel/AndroidApiObjectDatabaseBuilderGenerator.java
deleted file mode 100644
index c8b6c24..0000000
--- a/src/test/java/com/android/tools/r8/apimodel/AndroidApiObjectDatabaseBuilderGenerator.java
+++ /dev/null
@@ -1,593 +0,0 @@
-// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package com.android.tools.r8.apimodel;
-
-import static com.android.tools.r8.utils.FunctionUtils.ignoreArgument;
-import static org.objectweb.asm.Opcodes.AASTORE;
-import static org.objectweb.asm.Opcodes.ACONST_NULL;
-import static org.objectweb.asm.Opcodes.ALOAD;
-import static org.objectweb.asm.Opcodes.ANEWARRAY;
-import static org.objectweb.asm.Opcodes.ARETURN;
-import static org.objectweb.asm.Opcodes.DUP;
-import static org.objectweb.asm.Opcodes.F_SAME1;
-import static org.objectweb.asm.Opcodes.IFEQ;
-import static org.objectweb.asm.Opcodes.ILOAD;
-import static org.objectweb.asm.Opcodes.INVOKEINTERFACE;
-import static org.objectweb.asm.Opcodes.INVOKESPECIAL;
-import static org.objectweb.asm.Opcodes.INVOKESTATIC;
-import static org.objectweb.asm.Opcodes.INVOKEVIRTUAL;
-import static org.objectweb.asm.Opcodes.NEW;
-import static org.objectweb.asm.Opcodes.POP;
-
-import com.android.tools.r8.TestBase;
-import com.android.tools.r8.apimodel.AndroidApiVersionsXmlParser.ParsedApiClass;
-import com.android.tools.r8.references.ClassReference;
-import com.android.tools.r8.references.Reference;
-import com.android.tools.r8.references.TypeReference;
-import com.android.tools.r8.transformers.ClassFileTransformer.MethodPredicate;
-import com.android.tools.r8.transformers.MethodTransformer;
-import com.android.tools.r8.utils.AndroidApiLevel;
-import com.android.tools.r8.utils.DescriptorUtils;
-import com.android.tools.r8.utils.IntBox;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.function.BiConsumer;
-import java.util.function.Consumer;
-import java.util.stream.Collectors;
-import org.objectweb.asm.ClassWriter;
-import org.objectweb.asm.Label;
-import org.objectweb.asm.Opcodes;
-
-public class AndroidApiObjectDatabaseBuilderGenerator extends TestBase {
-
-  public static String generatedMainDescriptor() {
-    return descriptor(AndroidApiDatabaseBuilderTemplate.class).replace("Template", "");
-  }
-
-  public static ClassReference ANDROID_API_LEVEL =
-      Reference.classFromBinaryName("com/android/tools/r8/utils/AndroidApiLevel");
-  public static ClassReference ANDROID_API_CLASS =
-      Reference.classFromBinaryName("com/android/tools/r8/androidapi/AndroidApiClass");
-  public static ClassReference TRAVERSAL_CONTINUATION =
-      Reference.classFromBinaryName("com/android/tools/r8/utils/TraversalContinuation");
-
-  /**
-   * Generate the classes needed for looking up api level of references in the android.jar.
-   *
-   * <p>For each api class we generate a from AndroidApiDatabaseClassTemplate, extending
-   * AndroidApiClass, such that all members can be traversed. Looking up the class reference
-   * directly in one method will generate to much code and would probably be inefficient so we first
-   * do a case on the package and then do a check on the simple name.
-   *
-   * <p>We therefore create a class file for each package, based on
-   * AndroidApiDatabasePackageTemplate, that will do the dispatch to create a new
-   * AndroidApiDatabaseClass for class in the package.
-   *
-   * <p>We then have a single entry-point, AndroidApiDatabaseBuilder, based on
-   * AndroidApiDatabaseBuilderTemplate, that will do the dispatch to AndroidApiDatabasePackage based
-   * on the package name.
-   */
-  public static void generate(List<ParsedApiClass> apiClasses, BiConsumer<String, byte[]> consumer)
-      throws Exception {
-    Map<String, List<ParsedApiClass>> packageToClassesMap = new HashMap<>();
-    List<String> packages =
-        apiClasses.stream()
-            .map(
-                apiClass -> {
-                  String packageName =
-                      DescriptorUtils.getPackageNameFromDescriptor(
-                          apiClass.getClassReference().getDescriptor());
-                  packageToClassesMap
-                      .computeIfAbsent(packageName, ignoreArgument(ArrayList::new))
-                      .add(apiClass);
-                  return packageName;
-                })
-            .sorted()
-            .distinct()
-            .collect(Collectors.toList());
-
-    for (ParsedApiClass apiClass : apiClasses) {
-      String apiClassDescriptor = getApiClassReference(apiClass).getDescriptor();
-      consumer.accept(
-          apiClassDescriptor,
-          transformer(AndroidApiDatabaseClassTemplate.class)
-              .setClassDescriptor(apiClassDescriptor)
-              .addMethodTransformer(getInitTransformer(apiClass))
-              .addMethodTransformer(getApiLevelTransformer(apiClass))
-              .addMethodTransformer(getGetMemberCountTransformer(apiClass))
-              .addMethodTransformer(getVisitFieldsTransformer(apiClass))
-              .addMethodTransformer(getVisitMethodsTransformer(apiClass))
-              .removeMethods(MethodPredicate.onName("placeHolderForInit"))
-              .removeMethods(MethodPredicate.onName("placeHolderForGetApiLevel"))
-              .removeMethods(MethodPredicate.onName("placeHolderForGetMemberCount"))
-              .removeMethods(MethodPredicate.onName("placeHolderForVisitFields"))
-              .removeMethods(MethodPredicate.onName("placeHolderForVisitMethods"))
-              .setSourceFile(
-                  DescriptorUtils.getSimpleClassNameFromDescriptor(apiClassDescriptor) + ".java")
-              .computeMaxs()
-              .transform(ClassWriter.COMPUTE_MAXS));
-    }
-
-    for (String pkg : packages) {
-      consumer.accept(
-          getPackageBuilderDescriptor(pkg),
-          transformer(AndroidApiDatabasePackageTemplate.class)
-              .setClassDescriptor(getPackageBuilderDescriptor(pkg))
-              .addMethodTransformer(getBuildClassTransformer(packageToClassesMap.get(pkg)))
-              .removeMethods(MethodPredicate.onName("placeHolder"))
-              .computeMaxs()
-              .transform(ClassWriter.COMPUTE_MAXS));
-    }
-
-    consumer.accept(
-        generatedMainDescriptor(),
-        transformer(AndroidApiDatabaseBuilderTemplate.class)
-            .setClassDescriptor(generatedMainDescriptor())
-            .addMethodTransformer(getVisitApiClassesTransformer(apiClasses))
-            .addMethodTransformer(getBuildPackageTransformer(packages))
-            .removeMethods(MethodPredicate.onName("placeHolderForVisitApiClasses"))
-            .removeMethods(MethodPredicate.onName("placeHolderForBuildClass"))
-            .computeMaxs()
-            .transform(ClassWriter.COMPUTE_MAXS));
-  }
-
-  private static String getPackageBuilderDescriptor(String pkg) {
-    return DescriptorUtils.javaTypeToDescriptor(
-        AndroidApiDatabasePackageTemplate.class
-            .getTypeName()
-            .replace("Template", "ForPackage_" + pkg.replace(".", "_")));
-  }
-
-  private static ClassReference getApiClassReference(ParsedApiClass apiClass) {
-    return fromTemplate(apiClass.getClassReference());
-  }
-
-  private static ClassReference fromTemplate(ClassReference classReference) {
-    String descriptor =
-        DescriptorUtils.javaTypeToDescriptor(
-            AndroidApiDatabaseClassTemplate.class
-                .getTypeName()
-                .replace("Template", "ForClass_" + classReference.getTypeName().replace(".", "_")));
-    return Reference.classFromDescriptor(descriptor);
-  }
-
-  // The transformer below changes AndroidApiDatabaseClassTemplate.<init> from:
-  //     super(Reference.classFromDescriptor(placeHolderForInit()));
-  // into
-  //     super(Reference.classFromDescriptor("<class-descriptor>"));
-  private static MethodTransformer getInitTransformer(ParsedApiClass apiClass) {
-    return replaceCode(
-        "placeHolderForInit",
-        transformer -> {
-          transformer.visitLdcInsn(apiClass.getClassReference().getDescriptor());
-        });
-  }
-
-  // The transformer below changes AndroidApiDatabaseClassTemplate.getApiLevel from:
-  //     return placeHolderForGetApiLevel();
-  // into
-  //    return AndroidApiLevel.getAndroidApiLevel(<apiLevel>);
-  private static MethodTransformer getApiLevelTransformer(ParsedApiClass apiClass) {
-    return replaceCode(
-        "placeHolderForGetApiLevel",
-        transformer -> {
-          transformer.visitLdcInsn(apiClass.getApiLevel().getLevel());
-          transformer.visitMethodInsn(
-              INVOKESTATIC,
-              ANDROID_API_LEVEL.getBinaryName(),
-              "getAndroidApiLevel",
-              "(I)" + ANDROID_API_LEVEL.getDescriptor(),
-              false);
-        });
-  }
-
-  // The transformer below changes AndroidApiDatabaseClassTemplate.getMemberCount from:
-  //     return placeHolderForGetMemberCount();
-  // into
-  //    return <memberCount>;
-  private static MethodTransformer getGetMemberCountTransformer(ParsedApiClass apiClass) {
-    return replaceCode(
-        "placeHolderForGetMemberCount",
-        transformer -> transformer.visitLdcInsn(apiClass.getTotalMemberCount()));
-  }
-
-  // The transformer below changes AndroidApiDatabaseClassTemplate.visitFields from:
-  //     placeHolder();
-  //     return TraversalContinuation.CONTINUE;
-  // into
-  //    TraversalContinuation s1 = visitField(visitor, holder, minApiClass, apiLevel1, "field1",
-  //        "descriptor1")
-  //    if (s1.shouldBreak()) {
-  //       return s1;
-  //    }
-  //    TraversalContinuation s2 = visitField(visitor, holder, minApiClass, apiLevel2, "field2",
-  //   //        "descriptor2")
-  //    if (s2.shouldBreak()) {
-  //       return s2;
-  //    }
-  //    ...
-  //    AndroidApiClassForClass_class_name1() super1 = new AndroidApiClassForClass_class_name1();
-  //    TraversalContinuation sN = super1.visitFields(
-  //        visitor, holder, max(minApiClass, minApiForLink));
-  //    ...
-  //    return TraversalContinuation.CONTINUE;
-  private static MethodTransformer getVisitFieldsTransformer(ParsedApiClass apiClass) {
-    IntBox lineNumberBox = new IntBox(0);
-    return replaceCode(
-        "placeHolderForVisitFields",
-        transformer -> {
-          apiClass.visitFieldReferences(
-              (apiLevel, references) -> {
-                references.forEach(
-                    reference -> {
-                      Label labelStart = new Label();
-                      transformer.visitLabel(labelStart);
-                      transformer.visitLineNumber(lineNumberBox.getAndIncrement(), labelStart);
-                      transformer.visitVarInsn(ALOAD, 0);
-                      transformer.visitVarInsn(ALOAD, 1);
-                      transformer.visitVarInsn(ALOAD, 2);
-                      transformer.visitVarInsn(ILOAD, 3);
-                      transformer.visitLdcInsn(apiLevel.getLevel());
-                      transformer.visitLdcInsn(reference.getFieldName());
-                      transformer.visitLdcInsn(reference.getFieldType().getDescriptor());
-                      transformer.visitMethodInsn(
-                          INVOKEVIRTUAL,
-                          ANDROID_API_CLASS.getBinaryName(),
-                          "visitField",
-                          "(Ljava/util/function/BiFunction;"
-                              + descriptor(ClassReference.class)
-                              + "I"
-                              + "I"
-                              + "Ljava/lang/String;"
-                              + "Ljava/lang/String;)"
-                              + TRAVERSAL_CONTINUATION.getDescriptor(),
-                          false);
-                      // Note that instead of storing the result here, we dup it on the stack.
-                      transformer.visitInsn(DUP);
-                      transformer.visitMethodInsn(
-                          INVOKEVIRTUAL,
-                          TRAVERSAL_CONTINUATION.getBinaryName(),
-                          "shouldBreak",
-                          "()Z",
-                          false);
-                      Label label = new Label();
-                      transformer.visitJumpInsn(IFEQ, label);
-                      transformer.visitInsn(ARETURN);
-                      transformer.visitLabel(label);
-                      transformer.visitFrame(
-                          F_SAME1,
-                          0,
-                          new Object[] {},
-                          1,
-                          new Object[] {TRAVERSAL_CONTINUATION.getBinaryName()});
-                      // The pop here is needed to remove the dupped value in the case we do not
-                      // return.
-                      transformer.visitInsn(POP);
-                    });
-              });
-          if (!apiClass.isInterface()) {
-            apiClass.visitSuperType(
-                (superType, apiLevel) -> {
-                  addMembersForParent(
-                      transformer,
-                      superType,
-                      "visitFields",
-                      apiLevel,
-                      lineNumberBox.getAndIncrement());
-                });
-          }
-          // No need to visit fields on interfaces since they have to be static and should not be
-          // called on a super instance.
-        });
-  }
-
-  // The transformer below changes AndroidApiDatabaseClassTemplate.visitMethods from:
-  //     placeHolderForVisitMethods();
-  //     return TraversalContinuation.CONTINUE;
-  // into
-  //    TraversalContinuation s1 = visitMethod(visitor, holder, minApiClass, apiLevel1,
-  //      "method1", new String[] { "param11", ... , "param1X" }, null/return1)
-  //    if (s1.shouldBreak()) {
-  //       return s1;
-  //    }
-  //    TraversalContinuation s1 = visitMethod(visitor, holder, minApiClass, apiLevel2,
-  //      "method2", new String[] { "param21", ... , "param2X" }, null/return2)
-  //    if (s2.shouldBreak()) {
-  //       return s2;
-  //    }
-  //    ...
-  //    AndroidApiClassForClass_class_name1() super1 = new AndroidApiClassForClass_class_name1();
-  //    TraversalContinuation sN = super1.visitMethods(
-  //      visitor, holder, max(minApiClass, minApiForLink));
-  //    ...
-  //    return TraversalContinuation.CONTINUE;
-  private static MethodTransformer getVisitMethodsTransformer(ParsedApiClass apiClass) {
-    IntBox lineNumberBox = new IntBox(0);
-    return replaceCode(
-        "placeHolderForVisitMethods",
-        transformer -> {
-          apiClass.visitMethodReferences(
-              (apiLevel, references) -> {
-                references.forEach(
-                    reference -> {
-                      Label labelStart = new Label();
-                      transformer.visitLabel(labelStart);
-                      transformer.visitLineNumber(lineNumberBox.getAndIncrement(), labelStart);
-                      transformer.visitVarInsn(ALOAD, 0);
-                      transformer.visitVarInsn(ALOAD, 1);
-                      transformer.visitVarInsn(ALOAD, 2);
-                      transformer.visitVarInsn(ILOAD, 3);
-                      transformer.visitLdcInsn(apiLevel.getLevel());
-                      transformer.visitLdcInsn(reference.getMethodName());
-                      List<TypeReference> formalTypes = reference.getFormalTypes();
-                      transformer.visitLdcInsn(formalTypes.size());
-                      transformer.visitTypeInsn(ANEWARRAY, binaryName(String.class));
-                      for (int i = 0; i < formalTypes.size(); i++) {
-                        transformer.visitInsn(DUP);
-                        transformer.visitLdcInsn(i);
-                        transformer.visitLdcInsn(formalTypes.get(i).getDescriptor());
-                        transformer.visitInsn(AASTORE);
-                      }
-                      if (reference.getReturnType() != null) {
-                        transformer.visitLdcInsn(reference.getReturnType().getDescriptor());
-                      } else {
-                        transformer.visitInsn(ACONST_NULL);
-                      }
-                      transformer.visitMethodInsn(
-                          INVOKEVIRTUAL,
-                          ANDROID_API_CLASS.getBinaryName(),
-                          "visitMethod",
-                          "(Ljava/util/function/BiFunction;"
-                              + descriptor(ClassReference.class)
-                              + "I"
-                              + "I"
-                              + "Ljava/lang/String;"
-                              + "[Ljava/lang/String;"
-                              + "Ljava/lang/String;)"
-                              + TRAVERSAL_CONTINUATION.getDescriptor(),
-                          false);
-                      // Note that instead of storing the result here, we dup it on the stack.
-                      transformer.visitInsn(DUP);
-                      transformer.visitMethodInsn(
-                          INVOKEVIRTUAL,
-                          TRAVERSAL_CONTINUATION.getBinaryName(),
-                          "shouldBreak",
-                          "()Z",
-                          false);
-                      Label label = new Label();
-                      transformer.visitJumpInsn(IFEQ, label);
-                      transformer.visitInsn(ARETURN);
-                      transformer.visitLabel(label);
-                      transformer.visitFrame(
-                          F_SAME1,
-                          0,
-                          new Object[] {},
-                          1,
-                          new Object[] {TRAVERSAL_CONTINUATION.getBinaryName()});
-                      // The pop here is needed to remove the dupped value in the case we do not
-                      // return.
-                      transformer.visitInsn(POP);
-                    });
-              });
-          if (!apiClass.isInterface()) {
-            // Visit super types before interfaces emulating a poor man's resolutions.
-            apiClass.visitSuperType(
-                (superType, apiLevel) -> {
-                  addMembersForParent(
-                      transformer,
-                      superType,
-                      "visitMethods",
-                      apiLevel,
-                      lineNumberBox.getAndIncrement());
-                });
-          }
-          apiClass.visitInterface(
-              (classReference, apiLevel) -> {
-                addMembersForParent(
-                    transformer,
-                    classReference,
-                    "visitMethods",
-                    apiLevel,
-                    lineNumberBox.getAndIncrement());
-              });
-        });
-  }
-
-  private static void addMembersForParent(
-      MethodTransformer transformer,
-      ClassReference classReference,
-      String methodName,
-      AndroidApiLevel minApiLevel,
-      int lineNumber) {
-    String binaryName = fromTemplate(classReference).getBinaryName();
-    Label labelStart = new Label();
-    transformer.visitLabel(labelStart);
-    transformer.visitLineNumber(lineNumber, labelStart);
-    transformer.visitTypeInsn(NEW, binaryName);
-    transformer.visitInsn(DUP);
-    transformer.visitMethodInsn(INVOKESPECIAL, binaryName, "<init>", "()V", false);
-    transformer.visitVarInsn(ALOAD, 1);
-    transformer.visitVarInsn(ALOAD, 2);
-    // Compute the max api level compared to what is passed in.
-    transformer.visitLdcInsn(minApiLevel.getLevel());
-    transformer.visitVarInsn(ILOAD, 3);
-    transformer.visitMethodInsn(INVOKESTATIC, "java/lang/Integer", "max", "(II)I", false);
-    transformer.visitMethodInsn(
-        INVOKEVIRTUAL,
-        binaryName,
-        methodName,
-        "(Ljava/util/function/BiFunction;"
-            + descriptor(ClassReference.class)
-            + "I)"
-            + TRAVERSAL_CONTINUATION.getDescriptor(),
-        false);
-    // Note that instead of storing the result here, we dup it on the stack.
-    transformer.visitInsn(DUP);
-    transformer.visitMethodInsn(
-        INVOKEVIRTUAL, TRAVERSAL_CONTINUATION.getBinaryName(), "shouldBreak", "()Z", false);
-    Label label = new Label();
-    transformer.visitJumpInsn(IFEQ, label);
-    transformer.visitInsn(ARETURN);
-    transformer.visitLabel(label);
-    transformer.visitFrame(
-        F_SAME1, 0, new Object[] {}, 1, new Object[] {TRAVERSAL_CONTINUATION.getBinaryName()});
-    // The pop here is needed to remove the dupped value in the case we do not return.
-    transformer.visitInsn(POP);
-  }
-
-  // The transformer below changes AndroidApiDatabasePackageTemplate.buildClass from:
-  //    placeHolder();
-  //    return null;
-  // into
-  //    if ("<simple_class1>".equals(className)) {
-  //      return new AndroidApiClassForClass_class_name1();
-  //    }
-  //    if ("<simple_class2>".equals(className)) {
-  //      return new AndroidApiClassForClass_class_name2();
-  //    }
-  //    ...
-  //    return null;
-  private static MethodTransformer getBuildClassTransformer(List<ParsedApiClass> classesForPackage)
-      throws NoSuchMethodException {
-    Method equals = Object.class.getMethod("equals", Object.class);
-    return replaceCode(
-        "placeHolder",
-        transformer -> {
-          classesForPackage.forEach(
-              apiClass -> {
-                transformer.visitLdcInsn(
-                    DescriptorUtils.getSimpleClassNameFromDescriptor(
-                        apiClass.getClassReference().getDescriptor()));
-                transformer.visitVarInsn(ALOAD, 0);
-                transformer.visitMethodInsn(
-                    INVOKEVIRTUAL,
-                    binaryName(String.class),
-                    equals.getName(),
-                    methodDescriptor(equals),
-                    false);
-                Label label = new Label();
-                transformer.visitJumpInsn(IFEQ, label);
-                String binaryName = getApiClassReference(apiClass).getBinaryName();
-                transformer.visitTypeInsn(NEW, binaryName);
-                transformer.visitInsn(DUP);
-                transformer.visitMethodInsn(INVOKESPECIAL, binaryName, "<init>", "()V", false);
-                transformer.visitInsn(ARETURN);
-                transformer.visitLabel(label);
-                transformer.visitFrame(Opcodes.F_SAME, 0, new Object[] {}, 0, new Object[0]);
-              });
-        });
-  }
-
-  // The transformer below changes AndroidApiDatabaseBuilderTemplate.buildClass from:
-  //    String descriptor = classReference.getDescriptor();
-  //    String packageName = DescriptorUtils.getPackageNameFromDescriptor(descriptor);
-  //    String simpleClassName = DescriptorUtils.getSimpleClassNameFromDescriptor(descriptor);
-  //    placeHolderForBuildClass();
-  //    return null;
-  // into
-  //    String descriptor = classReference.getDescriptor();
-  //    String packageName = DescriptorUtils.getPackageNameFromDescriptor(descriptor);
-  //    String simpleClassName = DescriptorUtils.getSimpleClassNameFromDescriptor(descriptor);
-  //    if ("<package_name1>".equals(packageName)) {
-  //      return AndroidApiClassForPackage_package_name1(simpleClassName);
-  //    }
-  //    if ("<package_name2>".equals(simpleClassName)) {
-  //      return AndroidApiClassForPackage_package_name2(simpleClassName);
-  //    }
-  //    ...
-  //    return null;
-  private static MethodTransformer getBuildPackageTransformer(List<String> packages)
-      throws NoSuchMethodException {
-    Method equals = String.class.getMethod("equals", Object.class);
-    Method buildClass =
-        AndroidApiDatabasePackageTemplate.class.getMethod("buildClass", String.class);
-    return replaceCode(
-        "placeHolderForBuildClass",
-        transformer -> {
-          packages.forEach(
-              pkg -> {
-                transformer.visitLdcInsn(pkg);
-                transformer.visitVarInsn(ALOAD, 2);
-                transformer.visitMethodInsn(
-                    INVOKEVIRTUAL,
-                    binaryName(String.class),
-                    equals.getName(),
-                    methodDescriptor(equals),
-                    false);
-                Label label = new Label();
-                transformer.visitJumpInsn(IFEQ, label);
-                transformer.visitVarInsn(ALOAD, 3);
-                transformer.visitMethodInsn(
-                    INVOKESTATIC,
-                    DescriptorUtils.getBinaryNameFromDescriptor(getPackageBuilderDescriptor(pkg)),
-                    buildClass.getName(),
-                    methodDescriptor(buildClass),
-                    false);
-                transformer.visitInsn(ARETURN);
-                transformer.visitLabel(label);
-                transformer.visitFrame(
-                    Opcodes.F_FULL,
-                    4,
-                    new Object[] {
-                      binaryName(ClassReference.class),
-                      binaryName(String.class),
-                      binaryName(String.class),
-                      binaryName(String.class)
-                    },
-                    0,
-                    new Object[0]);
-              });
-        });
-  }
-
-  // The transformer below changes AndroidApiDatabaseBuilderTemplate.buildClass from:
-  //    placeHolderForVisitApiClasses();
-  // into
-  //    classDescriptorConsumer.accept("<descriptor_class_1>");
-  //    classDescriptorConsumer.accept("<descriptor_class_2>");
-  //    ...
-  //    return null;
-  private static MethodTransformer getVisitApiClassesTransformer(List<ParsedApiClass> apiClasses) {
-    return replaceCode(
-        "placeHolderForVisitApiClasses",
-        transformer -> {
-          apiClasses.forEach(
-              apiClass -> {
-                transformer.visitVarInsn(ALOAD, 0);
-                transformer.visitLdcInsn(apiClass.getClassReference().getDescriptor());
-                transformer.visitMethodInsn(
-                    INVOKEINTERFACE,
-                    binaryName(Consumer.class),
-                    "accept",
-                    "(Ljava/lang/Object;)V",
-                    true);
-              });
-        });
-  }
-
-  private static MethodTransformer replaceCode(
-      String placeholderName, Consumer<MethodTransformer> consumer) {
-    return new MethodTransformer() {
-
-      @Override
-      public void visitMaxs(int maxStack, int maxLocals) {
-        super.visitMaxs(-1, maxLocals);
-      }
-
-      @Override
-      public void visitMethodInsn(
-          int opcode, String owner, String name, String descriptor, boolean isInterface) {
-        if (name.equals(placeholderName)) {
-          consumer.accept(this);
-        } else {
-          super.visitMethodInsn(opcode, owner, name, descriptor, isInterface);
-        }
-      }
-    };
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/apimodel/AndroidApiObjectDatabaseBuilderGeneratorTest.java b/src/test/java/com/android/tools/r8/apimodel/AndroidApiObjectDatabaseBuilderGeneratorTest.java
deleted file mode 100644
index 40b57c5..0000000
--- a/src/test/java/com/android/tools/r8/apimodel/AndroidApiObjectDatabaseBuilderGeneratorTest.java
+++ /dev/null
@@ -1,421 +0,0 @@
-// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package com.android.tools.r8.apimodel;
-
-import static com.android.tools.r8.apimodel.AndroidApiObjectDatabaseBuilderGenerator.generatedMainDescriptor;
-import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;
-import static org.junit.Assert.assertEquals;
-
-import com.android.tools.r8.CompilationFailedException;
-import com.android.tools.r8.JvmTestBuilder;
-import com.android.tools.r8.JvmTestRunResult;
-import com.android.tools.r8.TestBase;
-import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.TestRuntime;
-import com.android.tools.r8.TestState;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.apimodel.AndroidApiVersionsXmlParser.ParsedApiClass;
-import com.android.tools.r8.references.ClassReference;
-import com.android.tools.r8.references.Reference;
-import com.android.tools.r8.utils.AndroidApiLevel;
-import com.android.tools.r8.utils.BooleanBox;
-import com.android.tools.r8.utils.DescriptorUtils;
-import com.android.tools.r8.utils.IntBox;
-import com.android.tools.r8.utils.ListUtils;
-import com.android.tools.r8.utils.StringUtils;
-import com.android.tools.r8.utils.TraversalContinuation;
-import com.android.tools.r8.utils.ZipUtils;
-import com.android.tools.r8.utils.ZipUtils.ZipBuilder;
-import com.android.tools.r8.utils.codeinspector.CodeInspector;
-import com.google.common.collect.ImmutableList;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ExecutionException;
-import java.util.function.BiFunction;
-import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-
-@RunWith(Parameterized.class)
-public class AndroidApiObjectDatabaseBuilderGeneratorTest extends TestBase {
-
-  protected final TestParameters parameters;
-  private static final Path API_VERSIONS_XML =
-      Paths.get(ToolHelper.THIRD_PARTY_DIR, "android_jar", "api-versions", "api-versions.xml");
-  private static final Path API_DATABASE_JAR =
-      Paths.get(ToolHelper.THIRD_PARTY_DIR, "android_jar", "api-database", "api-database.jar");
-  private static final AndroidApiLevel API_LEVEL = AndroidApiLevel.S;
-
-  @Parameters(name = "{0}")
-  public static TestParametersCollection data() {
-    return getTestParameters().withNoneRuntime().build();
-  }
-
-  public AndroidApiObjectDatabaseBuilderGeneratorTest(TestParameters parameters) {
-    this.parameters = parameters;
-  }
-
-  private static Path generateJar() throws Exception {
-    return generateJar(
-        AndroidApiVersionsXmlParser.getParsedApiClasses(API_VERSIONS_XML.toFile(), API_LEVEL));
-  }
-
-  private static Path generateJar(List<ParsedApiClass> apiClasses) throws Exception {
-    TemporaryFolder temp = new TemporaryFolder();
-    temp.create();
-    ZipBuilder builder = ZipBuilder.builder(temp.newFile("out.jar").toPath());
-    AndroidApiObjectDatabaseBuilderGenerator.generate(
-        apiClasses,
-        (descriptor, content) -> {
-          try {
-            String binaryName = DescriptorUtils.getBinaryNameFromDescriptor(descriptor) + ".class";
-            builder.addBytes(binaryName, content);
-          } catch (IOException exception) {
-            throw new RuntimeException(exception);
-          }
-        });
-    return builder.build();
-  }
-
-  @Test
-  public void testCanParseApiVersionsXml() throws Exception {
-    // This tests makes a rudimentary check on the number of classes, fields and methods in
-    // api-versions.xml to ensure that the runtime tests do not vacuously succeed.
-    List<ParsedApiClass> parsedApiClasses =
-        AndroidApiVersionsXmlParser.getParsedApiClasses(API_VERSIONS_XML.toFile(), API_LEVEL);
-    IntBox numberOfFields = new IntBox(0);
-    IntBox numberOfMethods = new IntBox(0);
-    parsedApiClasses.forEach(
-        apiClass -> {
-          apiClass.visitFieldReferences(
-              ((apiLevel, fieldReferences) -> {
-                fieldReferences.forEach(field -> numberOfFields.increment());
-              }));
-          apiClass.visitMethodReferences(
-              ((apiLevel, methodReferences) -> {
-                methodReferences.forEach(field -> numberOfMethods.increment());
-              }));
-        });
-    // These numbers will change when updating api-versions.xml
-    assertEquals(5037, parsedApiClasses.size());
-    assertEquals(26362, numberOfFields.get());
-    assertEquals(40416, numberOfMethods.get());
-  }
-
-  @Test
-  public void testDatabaseGenerationUpToDate() throws Exception {
-    TestBase.filesAreEqual(generateJar(), API_DATABASE_JAR);
-  }
-
-  /**
-   * Main entry point for building a database over references in framework to the api level they
-   * were introduced. Running main will generate a new jar and run tests on it to ensure it is
-   * compatible with R8 sources and works as expected.
-   *
-   * <p>The generated jar depends on r8NoManifestWithoutDeps.
-   *
-   * <p>If the generated jar passes tests it will be moved to third_party/android_jar/api-database/
-   * and override the current file in there.
-   */
-  public static void main(String[] args) throws Exception {
-    List<ParsedApiClass> parsedApiClasses =
-        AndroidApiVersionsXmlParser.getParsedApiClasses(API_VERSIONS_XML.toFile(), API_LEVEL);
-    Path generatedJar = generateJar(parsedApiClasses);
-    validateJar(generatedJar, parsedApiClasses);
-    Files.move(generatedJar, API_DATABASE_JAR, REPLACE_EXISTING);
-  }
-
-  private static void validateJar(Path generated, List<ParsedApiClass> apiClasses) {
-    List<BiFunction<Path, List<ParsedApiClass>, Boolean>> tests =
-        ImmutableList.of(
-            AndroidApiObjectDatabaseBuilderGeneratorTest::testGeneratedOutputForVisitClasses,
-            AndroidApiObjectDatabaseBuilderGeneratorTest::testBuildClassesContinue,
-            AndroidApiObjectDatabaseBuilderGeneratorTest::testBuildClassesBreak,
-            AndroidApiObjectDatabaseBuilderGeneratorTest::testNoPlaceHolder);
-    tests.forEach(
-        test -> {
-          try {
-            if (!test.apply(generated, apiClasses)) {
-              throw new RuntimeException("Generated jar did not pass tests");
-            }
-          } catch (Exception e) {
-            throw new RuntimeException("Generated jar did not pass tests", e);
-          }
-        });
-  }
-
-  private static boolean testGeneratedOutputForVisitClasses(
-      Path generated, List<ParsedApiClass> parsedApiClasses) {
-    String expectedOutput =
-        StringUtils.lines(
-            ListUtils.map(
-                parsedApiClasses, apiClass -> apiClass.getClassReference().getDescriptor()));
-    return runTest(generated, TestGeneratedMainVisitClasses.class)
-        .getStdOut()
-        .equals(expectedOutput);
-  }
-
-  private static boolean testBuildClassesContinue(
-      Path generated, List<ParsedApiClass> parsedApiClasses) {
-    return runTest(generated, TestBuildClassesContinue.class)
-        .getStdOut()
-        .equals(getExpected(parsedApiClasses, false));
-  }
-
-  private static boolean testBuildClassesBreak(
-      Path generated, List<ParsedApiClass> parsedApiClasses) {
-    return runTest(generated, TestBuildClassesBreak.class)
-        .getStdOut()
-        .equals(getExpected(parsedApiClasses, true));
-  }
-
-  private static boolean testNoPlaceHolder(Path generated, List<ParsedApiClass> parsedApiClasses) {
-    try {
-      CodeInspector inspector = new CodeInspector(generated);
-      inspector
-          .allClasses()
-          .forEach(
-              clazz -> {
-                clazz.forAllMethods(
-                    methods -> {
-                      if (methods.getFinalName().startsWith("placeHolder")) {
-                        throw new RuntimeException("Found placeHolder method in generated jar");
-                      }
-                    });
-              });
-    } catch (Exception ex) {
-      throw new RuntimeException(ex);
-    }
-    return true;
-  }
-
-  private static JvmTestRunResult runTest(Path generated, Class<?> testClass) {
-    try {
-      TemporaryFolder temporaryFolder = new TemporaryFolder();
-      temporaryFolder.create();
-      return JvmTestBuilder.create(new TestState(temporaryFolder))
-          .addProgramClassFileData(
-              transformer(testClass)
-                  .replaceClassDescriptorInMethodInstructions(
-                      descriptor(AndroidApiDatabaseBuilderTemplate.class),
-                      generatedMainDescriptor())
-                  .transform())
-          .addLibraryFiles(
-              generated,
-              ToolHelper.R8_WITHOUT_DEPS_JAR,
-              getDepsWithoutGeneratedApiModelClasses(),
-              ToolHelper.getJava8RuntimeJar())
-          .run(TestRuntime.getSystemRuntime(), testClass)
-          .apply(
-              result -> {
-                if (result.getExitCode() != 0) {
-                  throw new RuntimeException(result.getStdErr());
-                }
-              });
-    } catch (IOException | ExecutionException | CompilationFailedException ex) {
-      throw new RuntimeException(ex);
-    }
-  }
-
-  private static Path getDepsWithoutGeneratedApiModelClasses() throws IOException {
-    Path tempDeps = Files.createTempDirectory("temp_deps");
-    ZipUtils.unzip(
-        ToolHelper.DEPS.toString(),
-        tempDeps.toFile(),
-        entry -> !entry.getName().startsWith("com/android/tools/r8/apimodel/"));
-    Path modifiedDeps = Files.createTempFile("modified_deps", ".jar");
-    ZipUtils.zip(modifiedDeps, tempDeps);
-    return modifiedDeps;
-  }
-
-  private static String getExpected(List<ParsedApiClass> parsedApiClasses, boolean abort) {
-    Map<ClassReference, ParsedApiClass> parsedApiClassMap = new HashMap<>(parsedApiClasses.size());
-    parsedApiClasses.forEach(
-        parsedClass -> parsedApiClassMap.put(parsedClass.getClassReference(), parsedClass));
-    List<String> expected = new ArrayList<>();
-    parsedApiClasses.forEach(
-        apiClass -> {
-          expected.add("CLASS: " + apiClass.getClassReference().getDescriptor());
-          expected.add(apiClass.getApiLevel().getName());
-          expected.add(apiClass.getTotalMemberCount() + "");
-          visitApiClass(expected, parsedApiClassMap, apiClass, apiClass.getApiLevel(), true, abort);
-          visitApiClass(
-              expected, parsedApiClassMap, apiClass, apiClass.getApiLevel(), false, abort);
-        });
-    return StringUtils.lines(expected);
-  }
-
-  private static boolean visitApiClass(
-      List<String> expected,
-      Map<ClassReference, ParsedApiClass> parsedApiClassMap,
-      ParsedApiClass apiClass,
-      AndroidApiLevel apiLevel,
-      boolean visitFields,
-      boolean abort) {
-    BooleanBox added = new BooleanBox(false);
-    if (visitFields) {
-      added.set(visitFields(expected, apiClass, apiLevel, abort));
-    } else {
-      added.set(visitMethods(expected, apiClass, apiLevel, abort));
-    }
-    if (added.isTrue() && abort) {
-      return true;
-    }
-    // Go through super type methods if not interface.
-    if (!apiClass.isInterface()) {
-      apiClass.visitSuperType(
-          (classReference, linkApiLevel) -> {
-            if (added.isTrue() && abort) {
-              return;
-            }
-            ParsedApiClass superApiClass = parsedApiClassMap.get(classReference);
-            assert superApiClass != null;
-            added.set(
-                visitApiClass(
-                    expected,
-                    parsedApiClassMap,
-                    superApiClass,
-                    linkApiLevel.max(apiLevel),
-                    visitFields,
-                    abort));
-          });
-    }
-    if (!visitFields) {
-      apiClass.visitInterface(
-          (classReference, linkApiLevel) -> {
-            if (added.isTrue() && abort) {
-              return;
-            }
-            ParsedApiClass ifaceApiClass = parsedApiClassMap.get(classReference);
-            assert ifaceApiClass != null;
-            added.set(
-                visitApiClass(
-                    expected,
-                    parsedApiClassMap,
-                    ifaceApiClass,
-                    linkApiLevel.max(apiLevel),
-                    visitFields,
-                    abort));
-          });
-    }
-    return added.get();
-  }
-
-  private static boolean visitFields(
-      List<String> expected, ParsedApiClass apiClass, AndroidApiLevel minApiLevel, boolean abort) {
-    BooleanBox added = new BooleanBox(false);
-    apiClass.visitFieldReferences(
-        (apiLevel, fieldReferences) -> {
-          fieldReferences.forEach(
-              fieldReference -> {
-                if (added.isTrue() && abort) {
-                  return;
-                }
-                added.set();
-                expected.add(fieldReference.getFieldType().getDescriptor());
-                expected.add(fieldReference.getFieldName());
-                expected.add(apiLevel.max(minApiLevel).getName());
-              });
-        });
-    return added.get();
-  }
-
-  private static boolean visitMethods(
-      List<String> expected, ParsedApiClass apiClass, AndroidApiLevel minApiLevel, boolean abort) {
-    BooleanBox added = new BooleanBox(false);
-    apiClass.visitMethodReferences(
-        (apiLevel, methodReferences) -> {
-          methodReferences.forEach(
-              methodReference -> {
-                if (added.isTrue() && abort) {
-                  return;
-                }
-                added.set();
-                expected.add(methodReference.getMethodDescriptor());
-                expected.add(methodReference.getMethodName());
-                expected.add(apiLevel.max(minApiLevel).getName());
-              });
-        });
-    return added.get();
-  }
-
-  public static class TestGeneratedMainVisitClasses {
-
-    public static void main(String[] args) {
-      AndroidApiDatabaseBuilderTemplate.visitApiClasses(System.out::println);
-    }
-  }
-
-  public static class TestBuildClassesContinue {
-
-    public static void main(String[] args) {
-      AndroidApiDatabaseBuilderTemplate.visitApiClasses(
-          descriptor -> {
-            com.android.tools.r8.androidapi.AndroidApiClass apiClass =
-                AndroidApiDatabaseBuilderTemplate.buildClass(
-                    Reference.classFromDescriptor(descriptor));
-            if (apiClass != null) {
-              System.out.println("CLASS: " + descriptor);
-              System.out.println(apiClass.getApiLevel().getName());
-              System.out.println(apiClass.getMemberCount());
-              apiClass.visitFields(
-                  (reference, apiLevel) -> {
-                    System.out.println(reference.getFieldType().getDescriptor());
-                    System.out.println(reference.getFieldName());
-                    System.out.println(apiLevel.getName());
-                    return TraversalContinuation.CONTINUE;
-                  });
-              apiClass.visitMethods(
-                  (reference, apiLevel) -> {
-                    System.out.println(reference.getMethodDescriptor());
-                    System.out.println(reference.getMethodName());
-                    System.out.println(apiLevel.getName());
-                    return TraversalContinuation.CONTINUE;
-                  });
-            }
-          });
-    }
-  }
-
-  public static class TestBuildClassesBreak {
-
-    public static void main(String[] args) {
-      AndroidApiDatabaseBuilderTemplate.visitApiClasses(
-          descriptor -> {
-            com.android.tools.r8.androidapi.AndroidApiClass apiClass =
-                AndroidApiDatabaseBuilderTemplate.buildClass(
-                    Reference.classFromDescriptor(descriptor));
-            if (apiClass != null) {
-              System.out.println("CLASS: " + descriptor);
-              System.out.println(apiClass.getApiLevel().getName());
-              System.out.println(apiClass.getMemberCount());
-              apiClass.visitFields(
-                  (reference, apiLevel) -> {
-                    System.out.println(reference.getFieldType().getDescriptor());
-                    System.out.println(reference.getFieldName());
-                    System.out.println(apiLevel.getName());
-                    return TraversalContinuation.BREAK;
-                  });
-              apiClass.visitMethods(
-                  (reference, apiLevel) -> {
-                    System.out.println(reference.getMethodDescriptor());
-                    System.out.println(reference.getMethodName());
-                    System.out.println(apiLevel.getName());
-                    return TraversalContinuation.BREAK;
-                  });
-            }
-          });
-    }
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/debug/DebugInfoWhenInliningTest.java b/src/test/java/com/android/tools/r8/debug/DebugInfoWhenInliningTest.java
deleted file mode 100644
index ef9112c..0000000
--- a/src/test/java/com/android/tools/r8/debug/DebugInfoWhenInliningTest.java
+++ /dev/null
@@ -1,179 +0,0 @@
-// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.debug;
-
-import static org.junit.Assume.assumeTrue;
-
-import com.android.tools.r8.R8TestCompileResult;
-import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.TestParametersBuilder;
-import com.android.tools.r8.debug.DebugTestBase.JUnit3Wrapper.Command;
-import com.android.tools.r8.naming.ClassNameMapper.MissingFileAction;
-import com.android.tools.r8.utils.BooleanUtils;
-import com.android.tools.r8.utils.InternalOptions.LineNumberOptimization;
-import com.google.common.collect.ImmutableList;
-import java.util.ArrayList;
-import java.util.List;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-
-/** Tests source file and line numbers on inlined methods. */
-@RunWith(Parameterized.class)
-public class DebugInfoWhenInliningTest extends DebugTestBase {
-
-  private static final String CLASS_NAME = "Inlining1";
-  private static final String SOURCE_FILE = "SourceFile";
-
-  private DebugTestConfig makeConfig(
-      LineNumberOptimization lineNumberOptimization, boolean writeProguardMap) throws Exception {
-    R8TestCompileResult result =
-        testForR8(parameters.getBackend())
-            .addProgramFiles(DEBUGGEE_JAR)
-            .addKeepMainRule(CLASS_NAME)
-            .noMinification()
-            .addKeepAttributeSourceFile()
-            .addKeepAttributeLineNumberTable()
-            .setMinApi(parameters.getApiLevel())
-            .addOptionsModification(
-                options -> {
-                  options.lineNumberOptimization = lineNumberOptimization;
-                  options.testing.forceJumboStringProcessing = forceJumboStringProcessing;
-                  // TODO(b/117848700): Can we make these tests neutral to inlining threshold?
-                  // Also CF needs improvements here.
-                  options.inlinerOptions().simpleInliningInstructionLimit =
-                      parameters.isCfRuntime() ? 5 : 4;
-                })
-            .compile();
-    DebugTestConfig config = result.debugConfig();
-    if (writeProguardMap) {
-      config.setProguardMap(result.writeProguardMap(), MissingFileAction.MISSING_FILE_IS_EMPTY_MAP);
-    }
-    return config;
-  }
-
-  private final TestParameters parameters;
-  private final boolean forceJumboStringProcessing;
-
-  @Parameters(name = "{0}, force-jumbo: {1}")
-  public static List<Object[]> data() {
-    return buildParameters(
-        TestParametersBuilder.builder().withAllRuntimesAndApiLevels().build(),
-        BooleanUtils.values());
-  }
-
-  public DebugInfoWhenInliningTest(TestParameters parameters, boolean forceJumboString) {
-    assumeTrue(!parameters.isCfRuntime() || !forceJumboString);
-    this.parameters = parameters;
-    this.forceJumboStringProcessing = forceJumboString;
-  }
-
-  private void assumeMappingIsNotToPCs() {
-    assumeTrue(
-        "Ignoring test when the line number table is removed.",
-        parameters.isCfRuntime()
-            || parameters.getApiLevel().isLessThan(apiLevelWithPcAsLineNumberSupport()));
-  }
-
-  @Test
-  public void testEachLineNotOptimized() throws Throwable {
-    assumeMappingIsNotToPCs();
-    // The reason why the not-optimized test contains half as many line numbers as the optimized
-    // one:
-    //
-    // In the Java source (Inlining1) each call is duplicated. Since they end up on the same line
-    // (innermost callee) the line numbers are actually 7, 7, 32, 32, ... but even if the positions
-    // are emitted duplicated in the dex code, the debugger stops only when there's a change.
-    int[] lineNumbers = {7, 32, 11, 7};
-    testEachLine(makeConfig(LineNumberOptimization.OFF, false), lineNumbers);
-  }
-
-  @Test
-  public void testEachLineNotOptimizedWithMap() throws Throwable {
-    assumeMappingIsNotToPCs();
-    // The reason why the not-optimized test contains half as many line numbers as the optimized
-    // one:
-    //
-    // In the Java source (Inlining1) each call is duplicated. Since they end up on the same line
-    // (innermost callee) the line numbers are actually 7, 7, 32, 32, ... but even if the positions
-    // are emitted duplicated in the dex code, the debugger stops only when there's a change.
-    int[] lineNumbers = {7, 32, 11, 7};
-    testEachLine(makeConfig(LineNumberOptimization.OFF, true), lineNumbers);
-  }
-
-  @Test
-  public void testEachLineOptimized() throws Throwable {
-    assumeMappingIsNotToPCs();
-    int[] lineNumbers = {1, 2, 3, 4, 5, 6, 7, 8};
-    testEachLine(makeConfig(LineNumberOptimization.ON, false), lineNumbers);
-  }
-
-  @Test
-  public void testEachLineOptimizedWithMap() throws Throwable {
-    assumeMappingIsNotToPCs();
-    int[] lineNumbers = {7, 7, 32, 32, 11, 11, 7, 7};
-    List<List<SignatureAndLine>> inlineFramesList =
-        ImmutableList.of(
-            ImmutableList.of(
-                new SignatureAndLine("void inlineThisFromSameFile()", 7),
-                new SignatureAndLine("void main(java.lang.String[])", 19)),
-            ImmutableList.of(
-                new SignatureAndLine("void inlineThisFromSameFile()", 7),
-                new SignatureAndLine("void main(java.lang.String[])", 20)),
-            ImmutableList.of(
-                new SignatureAndLine("void Inlining2.inlineThisFromAnotherFile()", 32),
-                new SignatureAndLine("void main(java.lang.String[])", 21)),
-            ImmutableList.of(
-                new SignatureAndLine("void Inlining2.inlineThisFromAnotherFile()", 32),
-                new SignatureAndLine("void main(java.lang.String[])", 22)),
-            ImmutableList.of(
-                new SignatureAndLine("void sameFileMultilevelInliningLevel2()", 11),
-                new SignatureAndLine("void sameFileMultilevelInliningLevel1()", 15),
-                new SignatureAndLine("void main(java.lang.String[])", 23)),
-            ImmutableList.of(
-                new SignatureAndLine("void sameFileMultilevelInliningLevel2()", 11),
-                new SignatureAndLine("void sameFileMultilevelInliningLevel1()", 15),
-                new SignatureAndLine("void main(java.lang.String[])", 24)),
-            ImmutableList.of(
-                new SignatureAndLine("void Inlining3.differentFileMultilevelInliningLevel2()", 7),
-                new SignatureAndLine("void Inlining2.differentFileMultilevelInliningLevel1()", 36),
-                new SignatureAndLine("void main(java.lang.String[])", 25)),
-            ImmutableList.of(
-                new SignatureAndLine("void Inlining3.differentFileMultilevelInliningLevel2()", 7),
-                new SignatureAndLine("void Inlining2.differentFileMultilevelInliningLevel1()", 36),
-                new SignatureAndLine("void main(java.lang.String[])", 26)));
-    testEachLine(makeConfig(LineNumberOptimization.ON, true), lineNumbers, inlineFramesList);
-  }
-
-  private void testEachLine(DebugTestConfig config, int[] lineNumbers) throws Throwable {
-    testEachLine(config, lineNumbers, null);
-  }
-
-  private void testEachLine(
-      DebugTestConfig config, int[] lineNumbers, List<List<SignatureAndLine>> inlineFramesList)
-      throws Throwable {
-    final String mainSignature = "([Ljava/lang/String;)V";
-
-    List<Command> commands = new ArrayList<Command>();
-    commands.add(breakpoint(CLASS_NAME, "main", mainSignature));
-    commands.add(run());
-    boolean first = true;
-    assert inlineFramesList == null || inlineFramesList.size() == lineNumbers.length;
-    for (int idx = 0; idx < lineNumbers.length; ++idx) {
-      if (first) {
-        first = false;
-      } else {
-        commands.add(stepOver());
-      }
-      commands.add(checkMethod(CLASS_NAME, "main", mainSignature));
-      commands.add(checkLine(SOURCE_FILE, lineNumbers[idx]));
-      if (inlineFramesList != null) {
-        commands.add(checkInlineFrames(inlineFramesList.get(idx)));
-      }
-    }
-    commands.add(run());
-    runDebugTest(config, CLASS_NAME, commands);
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/debuginfo/EnsureNoDebugInfoEmittedForPcOnlyTestRunner.java b/src/test/java/com/android/tools/r8/debuginfo/EnsureNoDebugInfoEmittedForPcOnlyTestRunner.java
index a91f006..30505ab 100644
--- a/src/test/java/com/android/tools/r8/debuginfo/EnsureNoDebugInfoEmittedForPcOnlyTestRunner.java
+++ b/src/test/java/com/android/tools/r8/debuginfo/EnsureNoDebugInfoEmittedForPcOnlyTestRunner.java
@@ -12,6 +12,8 @@
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assume.assumeTrue;
 
+import com.android.tools.r8.SourceFileEnvironment;
+import com.android.tools.r8.SourceFileProvider;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
@@ -77,7 +79,22 @@
         .applyIf(
             apiLevelSupportsPcOutput(),
             builder ->
-                builder.addOptionsModification(options -> options.lineNumberOptimization = ON))
+                builder.addOptionsModification(
+                    options -> {
+                      options.sourceFileProvider =
+                          new SourceFileProvider() {
+                            @Override
+                            public String get(SourceFileEnvironment environment) {
+                              return null;
+                            }
+
+                            @Override
+                            public boolean allowDiscardingSourceFile() {
+                              return true;
+                            }
+                          };
+                      options.lineNumberOptimization = ON;
+                    }))
         .run(parameters.getRuntime(), MAIN)
         .inspectFailure(
             inspector -> {
diff --git a/src/test/java/com/android/tools/r8/debuginfo/InliningWithoutPositionsTestRunner.java b/src/test/java/com/android/tools/r8/debuginfo/InliningWithoutPositionsTestRunner.java
index e1b76d6..b683d7d 100644
--- a/src/test/java/com/android/tools/r8/debuginfo/InliningWithoutPositionsTestRunner.java
+++ b/src/test/java/com/android/tools/r8/debuginfo/InliningWithoutPositionsTestRunner.java
@@ -4,33 +4,23 @@
 
 package com.android.tools.r8.debuginfo;
 
+import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
-import com.android.tools.r8.CompilationMode;
-import com.android.tools.r8.R8TestRunResult;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersBuilder;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.debuginfo.InliningWithoutPositionsTestSourceDump.Location;
-import com.android.tools.r8.naming.ClassNameMapper;
-import com.android.tools.r8.naming.ClassNamingForNameMapper;
-import com.android.tools.r8.naming.ClassNamingForNameMapper.MappedRange;
-import com.android.tools.r8.naming.ClassNamingForNameMapper.MappedRangesOfName;
-import com.android.tools.r8.naming.Range;
+import com.android.tools.r8.naming.retrace.StackTrace;
+import com.android.tools.r8.naming.retrace.StackTrace.StackTraceLine;
 import com.android.tools.r8.utils.AndroidApiLevel;
-import java.nio.file.Files;
-import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
-import org.junit.Assert;
-import org.junit.ClassRule;
+import org.hamcrest.CoreMatchers;
 import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 import org.junit.runners.Parameterized.Parameters;
@@ -38,11 +28,10 @@
 @RunWith(Parameterized.class)
 public class InliningWithoutPositionsTestRunner extends TestBase {
 
-  private static final String TEST_CLASS = "InliningWithoutPositionsTestSource";
+  private static final String TEST_SIMPLE_NAME = "InliningWithoutPositionsTestSource";
   private static final String TEST_PACKAGE = "com.android.tools.r8.debuginfo";
-  private static final String MAIN_CLASS = TEST_PACKAGE + "." + TEST_CLASS;
-
-  @ClassRule public static TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
+  private static final String TEST_FILE = TEST_SIMPLE_NAME + ".java";
+  private static final String TEST_CLASS = TEST_PACKAGE + "." + TEST_SIMPLE_NAME;
 
   private final TestParameters parameters;
   private final boolean mainPos;
@@ -56,16 +45,16 @@
     List<Object[]> testCases = new ArrayList<>();
     for (TestParameters parameters :
         TestParametersBuilder.builder().withAllRuntimes().withApiLevel(AndroidApiLevel.B).build()) {
-    for (int i = 0; i < 16; ++i) {
-      for (Location throwLocation : Location.values()) {
-        if (throwLocation != Location.MAIN) {
+      for (int i = 0; i < 16; ++i) {
+        for (Location throwLocation : Location.values()) {
+          if (throwLocation != Location.MAIN) {
             testCases.add(
                 new Object[] {
                   parameters, (i & 1) != 0, (i & 2) != 0, (i & 4) != 0, (i & 8) != 0, throwLocation
                 });
+          }
         }
       }
-      }
     }
     return testCases;
   }
@@ -87,118 +76,81 @@
 
   @Test
   public void testStackTrace() throws Exception {
-    // See InliningWithoutPositionsTestSourceDump for the code compiled here.
-    Path testClassDir = temp.newFolder().toPath();
-    Path testClassPath = testClassDir.resolve(TEST_CLASS + ".class");
-    Files.write(
-        testClassPath,
-        InliningWithoutPositionsTestSourceDump.dump(
-            mainPos, foo1Pos, barPos, foo2Pos, throwLocation));
-
-    R8TestRunResult result =
-        testForR8(parameters.getBackend())
-            .setMinApi(parameters.getApiLevel())
-            .addProgramFiles(testClassPath)
-            .setMode(CompilationMode.RELEASE)
-            .addKeepMainRule(MAIN_CLASS)
-            .noMinification()
-            .addKeepAttributeSourceFile()
-            .addKeepAttributeLineNumberTable()
-            .addOptionsModification(
-                options -> options.inlinerOptions().simpleInliningInstructionLimit = 40)
-            .run(parameters.getRuntime(), MAIN_CLASS)
-            .assertFailure();
-
-    // Verify stack trace.
-    // result.stderr looks like this:
-    //
-    //     Exception in thread "main" java.lang.RuntimeException: <FOO1-exception>
-    //       at
-    // com.android.tools.r8.debuginfo.InliningWithoutPositionsTestSource.main(InliningWithoutPositionsTestSource.java:1)
-    String[] lines = result.getStdErr().split("\n");
-
-    // The line containing 'java.lang.RuntimeException' should contain the expected message, which
-    // is "LOCATIONCODE-exception>"
-    int i = 0;
-    boolean foundException = false;
-    for (; i < lines.length && !foundException; ++i) {
-      boolean hasExpectedException = lines[i].contains("<" + throwLocation + "-exception>");
-      if (lines[i].contains("java.lang.RuntimeException")) {
-        assertTrue(hasExpectedException);
-        foundException = true;
-      } else {
-        assertFalse(hasExpectedException);
-      }
-    }
-    assertTrue(foundException);
-
-    // The next line, the stack trace, must always be the same, indicating 'main' and line = 1 or 2.
-    Assert.assertTrue(i < lines.length);
-    String line = lines[i].trim();
-    assertTrue(line.startsWith("at " + TEST_PACKAGE + "." + TEST_CLASS + "." + "main"));
-
-    // It must contain the '<source-file>:1' or ':2', if we're throwing at foo2.
-    int expectedLineNumber = throwLocation == Location.FOO2 ? 2 : 1;
-    String expectedFilePos = TEST_CLASS + ".java:" + expectedLineNumber;
-    int idx = line.indexOf(expectedFilePos);
-
-    // And the next character must be a non-digit or nothing.
-    int idxAfter = idx + expectedFilePos.length();
-    assertTrue(idxAfter == line.length() || !Character.isDigit(line.charAt(idxAfter)));
-
-    // Reading the Proguard map. An example map (only the relevant part, 'main'):
-    //
-    //     1:1:void bar():0:0 -> main
-    //     1:1:void foo(boolean):0 -> main
-    //     1:1:void main(java.lang.String[]):0 -> main
-    ClassNameMapper mapper = ClassNameMapper.mapperFromString(result.proguardMap());
-    assertNotNull(mapper);
-
-    ClassNamingForNameMapper classNaming = mapper.getClassNaming(TEST_PACKAGE + "." + TEST_CLASS);
-    assertNotNull(classNaming);
-
-    MappedRangesOfName rangesForMain = classNaming.mappedRangesByRenamedName.get("main");
-    assertNotNull(rangesForMain);
-
-    List<MappedRange> frames = rangesForMain.allRangesForLine(expectedLineNumber);
-
-    switch (throwLocation) {
-      case FOO1:
-        assertEquals(2, frames.size());
-        assertFrame(true, "foo", Location.FOO1, foo1Pos, frames.get(0));
-        break;
-      case BAR:
-        assertEquals(3, frames.size());
-        assertFrame(true, "bar", Location.BAR, barPos, frames.get(0));
-        assertFrame(false, "foo", Location.FOO1, foo1Pos, frames.get(1));
-        break;
-      case FOO2:
-        assertEquals(2, frames.size());
-        // If there's no foo2Pos then we expect foo1 pos at this location.
-        if (foo2Pos) {
-          assertFrame(true, "foo", Location.FOO2, true, frames.get(0));
-        } else {
-          assertFrame(true, "foo", Location.FOO1, foo1Pos, frames.get(0));
-        }
-        break;
-      default:
-        Assert.fail();
-    }
-    assertFrame(false, "main", Location.MAIN, mainPos, frames.get(frames.size() - 1));
+    testForR8(parameters.getBackend())
+        .setMinApi(parameters.getApiLevel())
+        .addProgramClassFileData(
+            InliningWithoutPositionsTestSourceDump.dump(
+                mainPos, foo1Pos, barPos, foo2Pos, throwLocation))
+        .addKeepMainRule(TEST_CLASS)
+        .addKeepAttributeSourceFile()
+        .addKeepAttributeLineNumberTable()
+        .addOptionsModification(
+            options -> options.inlinerOptions().simpleInliningInstructionLimit = 40)
+        .run(parameters.getRuntime(), TEST_CLASS)
+        .assertFailure()
+        .inspectOriginalStackTrace(
+            rawStackTrace -> {
+              assertThat(
+                  rawStackTrace.getExceptionLine(),
+                  CoreMatchers.containsString("<" + throwLocation + "-exception>"));
+              assertTrue(rawStackTrace.size() > 1);
+              StackTraceLine line = rawStackTrace.get(0);
+              assertEquals(TEST_CLASS, line.className);
+              assertEquals("main", line.methodName);
+              // Expected line number could be PC based or increments.
+              // The test need not check what it is, just that all methods have been fully inlined.
+              assertEquals(2, rawStackTrace.size());
+            })
+        .inspectStackTrace(
+            retracedStackTrace -> {
+              assertThat(
+                  retracedStackTrace.getExceptionLine(),
+                  CoreMatchers.containsString("<" + throwLocation + "-exception>"));
+              switch (throwLocation) {
+                case FOO1:
+                  assertThat(
+                      retracedStackTrace,
+                      StackTrace.isSame(
+                          StackTrace.builder()
+                              .add(line("foo", Location.FOO1, foo1Pos))
+                              .add(line("main", Location.MAIN, mainPos))
+                              .build()));
+                  break;
+                case BAR:
+                  assertThat(
+                      retracedStackTrace,
+                      StackTrace.isSame(
+                          StackTrace.builder()
+                              .add(line("bar", Location.BAR, barPos))
+                              .add(line("foo", Location.FOO1, foo1Pos))
+                              .add(line("main", Location.MAIN, mainPos))
+                              .build()));
+                  break;
+                case FOO2:
+                  assertThat(
+                      retracedStackTrace,
+                      StackTrace.isSame(
+                          StackTrace.builder()
+                              .add(
+                                  line(
+                                      "foo",
+                                      foo2Pos ? Location.FOO2 : Location.FOO1,
+                                      foo2Pos || foo1Pos))
+                              .add(line("main", Location.MAIN, mainPos))
+                              .build()));
+                  break;
+                default:
+                  fail();
+              }
+            });
   }
 
-  private void assertFrame(
-      boolean innermostFrame,
-      String function,
-      Location location,
-      boolean hasPosition,
-      MappedRange range) {
-    assertEquals(function, range.signature.name);
-    int expectedLineNumber = hasPosition ? location.line : 0;
-    Range expectedOriginalRange =
-        innermostFrame
-            ? new Range(expectedLineNumber, expectedLineNumber)
-            : new Range(expectedLineNumber);
-    assertEquals(expectedOriginalRange, range.originalRange);
+  private StackTraceLine line(String methodName, Location location, boolean hasPosition) {
+    return StackTraceLine.builder()
+        .setClassName(TEST_CLASS)
+        .setFileName(TEST_FILE)
+        .setMethodName(methodName)
+        .setLineNumber(hasPosition ? location.line : 0)
+        .build();
   }
 }
diff --git a/src/test/java/com/android/tools/r8/debuginfo/SingleLineInfoInlineRemoveTest.java b/src/test/java/com/android/tools/r8/debuginfo/SingleLineInfoInlineRemoveTest.java
index dd9bcc7..64ed426 100644
--- a/src/test/java/com/android/tools/r8/debuginfo/SingleLineInfoInlineRemoveTest.java
+++ b/src/test/java/com/android/tools/r8/debuginfo/SingleLineInfoInlineRemoveTest.java
@@ -52,7 +52,7 @@
   }
 
   @Test
-  public void testR8() throws Exception {
+  public void testDefaultSourceFile() throws Exception {
     testForR8(parameters.getBackend())
         .addInnerClasses(getClass())
         .setMinApi(parameters.getApiLevel())
@@ -74,6 +74,55 @@
             });
   }
 
+  @Test
+  public void testManuallySetDefaultSourceFile() throws Exception {
+    testForR8(parameters.getBackend())
+        .addInnerClasses(getClass())
+        .setMinApi(parameters.getApiLevel())
+        .addKeepMainRule(Main.class)
+        .addKeepAttributeSourceFile()
+        .addKeepAttributeLineNumberTable()
+        .addKeepRules("-renamesourcefileattribute SourceFile")
+        .enableInliningAnnotations()
+        .run(parameters.getRuntime(), Main.class)
+        .assertFailureWithErrorThatThrows(NullPointerException.class)
+        .inspectStackTrace(
+            (stackTrace, inspector) -> {
+              assertThat(stackTrace, isSame(expectedStackTrace));
+              ClassSubject mainSubject = inspector.clazz(Main.class);
+              assertThat(mainSubject, isPresent());
+              assertThat(mainSubject.uniqueMethodWithName("inlinee"), not(isPresent()));
+              assertThat(
+                  mainSubject.uniqueMethodWithName("shouldRemoveLineNumberForInline"),
+                  notIf(hasLineNumberTable(), parameters.isDexRuntime()));
+            });
+  }
+
+  @Test
+  public void testNonDefaultSourceFile() throws Exception {
+    testForR8(parameters.getBackend())
+        .addInnerClasses(getClass())
+        .setMinApi(parameters.getApiLevel())
+        .addKeepMainRule(Main.class)
+        .addKeepAttributeSourceFile()
+        .addKeepAttributeLineNumberTable()
+        .addKeepRules("-renamesourcefileattribute SomeBuildTaggedSourceFile")
+        .enableInliningAnnotations()
+        .run(parameters.getRuntime(), Main.class)
+        .assertFailureWithErrorThatThrows(NullPointerException.class)
+        .inspectStackTrace(
+            (stackTrace, inspector) -> {
+              assertThat(stackTrace, isSame(expectedStackTrace));
+              ClassSubject mainSubject = inspector.clazz(Main.class);
+              assertThat(mainSubject, isPresent());
+              assertThat(mainSubject.uniqueMethodWithName("inlinee"), not(isPresent()));
+              assertThat(
+                  mainSubject.uniqueMethodWithName("shouldRemoveLineNumberForInline"),
+                  // TODO(b/146565491): Update to allow dropping the table once supported by ART.
+                  hasLineNumberTable());
+            });
+  }
+
   public static class Main {
 
     @NeverInline
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/BackwardsCompatibleSpecificationTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/BackwardsCompatibleSpecificationTest.java
index a922636..817268d 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/BackwardsCompatibleSpecificationTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/BackwardsCompatibleSpecificationTest.java
@@ -5,7 +5,6 @@
 
 import static org.junit.Assert.assertEquals;
 
-import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.ProcessResult;
@@ -13,12 +12,13 @@
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.List;
+import org.junit.Assume;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 
 @RunWith(Parameterized.class)
-public class BackwardsCompatibleSpecificationTest extends TestBase {
+public class BackwardsCompatibleSpecificationTest extends DesugaredLibraryTestBase {
 
   private static final List<String> RELEASES = ImmutableList.of("2.0.74");
 
@@ -42,6 +42,9 @@
 
   @Test
   public void test() throws Exception {
+    Assume.assumeFalse(
+        "When using JDK11 desugared library, we're not backward compatible to 2.0.74.",
+        isJDK11DesugaredLibrary());
     ProcessResult result =
         ToolHelper.runJava(
             getReleaseJar(),
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/BufferedReaderTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/BufferedReaderTest.java
index fdca331..f1ac89f 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/BufferedReaderTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/BufferedReaderTest.java
@@ -140,7 +140,7 @@
     Assume.assumeTrue(parameters.getRuntime().isDex());
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addOptionsModification(
             options ->
                 options.desugaredLibraryConfiguration =
@@ -169,7 +169,7 @@
     Assume.assumeTrue(parameters.getRuntime().isDex());
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForR8(parameters.getBackend())
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addOptionsModification(
             options ->
                 options.desugaredLibraryConfiguration =
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ConcurrentHashMapSubclassTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ConcurrentHashMapSubclassTest.java
index 696de2e..6b4cf39 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ConcurrentHashMapSubclassTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ConcurrentHashMapSubclassTest.java
@@ -7,8 +7,6 @@
 import static org.junit.Assert.assertEquals;
 
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.StringUtils;
 import java.nio.file.Path;
@@ -48,7 +46,7 @@
     Assume.assumeTrue(parameters.getRuntime().isDex());
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addInnerClasses(ConcurrentHashMapSubclassTest.class)
         .setMinApi(parameters.getApiLevel())
         .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -105,7 +103,7 @@
     Assume.assumeTrue(parameters.getRuntime().isDex());
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForR8(Backend.DEX)
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addInnerClasses(ConcurrentHashMapSubclassTest.class)
         .setMinApi(parameters.getApiLevel())
         .addKeepClassAndMembersRules(Executor.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionForwardingTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionForwardingTest.java
index 10a127d..f2beac6 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionForwardingTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionForwardingTest.java
@@ -5,8 +5,6 @@
 package com.android.tools.r8.desugar.desugaredlibrary;
 
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.StringUtils;
 import java.util.ArrayList;
@@ -42,7 +40,7 @@
   public void testCustomCollectionD8() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addInnerClasses(CustomCollectionForwardingTest.class)
         .setMinApi(parameters.getApiLevel())
         .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -61,7 +59,7 @@
   public void testCustomCollectionR8() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForR8(parameters.getBackend())
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addInnerClasses(CustomCollectionForwardingTest.class)
         .addKeepMainRule(Executor.class)
         .setMinApi(parameters.getApiLevel())
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionInterfaceSuperTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionInterfaceSuperTest.java
index 10d91fa..371b114 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionInterfaceSuperTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionInterfaceSuperTest.java
@@ -7,8 +7,6 @@
 import static org.junit.Assume.assumeTrue;
 
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.StringUtils;
 import java.util.Collection;
@@ -59,7 +57,7 @@
     }
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addInnerClasses(CustomCollectionInterfaceSuperTest.class)
         .setMinApi(parameters.getApiLevel())
         .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -81,7 +79,7 @@
     assumeTrue(parameters.isDexRuntime());
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForR8(parameters.getBackend())
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addInnerClasses(CustomCollectionInterfaceSuperTest.class)
         .addKeepMainRule(Main.class)
         .setMinApi(parameters.getApiLevel())
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionSuperCallsTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionSuperCallsTest.java
index e917cd3..d770fdb 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionSuperCallsTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionSuperCallsTest.java
@@ -9,8 +9,6 @@
 import com.android.tools.r8.D8TestRunResult;
 import com.android.tools.r8.R8TestRunResult;
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
 import java.nio.file.Path;
 import java.util.ArrayList;
@@ -44,7 +42,7 @@
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     D8TestRunResult d8TestRunResult =
         testForD8()
-            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+            .addLibraryFiles(getLibraryFile())
             .addInnerClasses(CustomCollectionSuperCallsTest.class)
             .setMinApi(parameters.getApiLevel())
             .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -107,7 +105,7 @@
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     R8TestRunResult r8TestRunResult =
         testForR8(parameters.getBackend())
-            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+            .addLibraryFiles(getLibraryFile())
             .addInnerClasses(CustomCollectionSuperCallsTest.class)
             .addKeepMainRule(Executor.class)
             .setMinApi(parameters.getApiLevel())
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionTest.java
index d24f4dd..b3eb86b 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionTest.java
@@ -10,8 +10,6 @@
 import com.android.tools.r8.D8TestRunResult;
 import com.android.tools.r8.R8TestRunResult;
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.android.tools.r8.utils.codeinspector.InstructionSubject;
@@ -56,7 +54,7 @@
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     D8TestRunResult d8TestRunResult =
         testForD8()
-            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+            .addLibraryFiles(getLibraryFile())
             .addInnerClasses(CustomCollectionTest.class)
             .setMinApi(parameters.getApiLevel())
             .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -133,7 +131,7 @@
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     R8TestRunResult r8TestRunResult =
         testForR8(Backend.DEX)
-            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+            .addLibraryFiles(getLibraryFile())
             .addInnerClasses(CustomCollectionTest.class)
             .setMinApi(parameters.getApiLevel())
             .addKeepClassAndMembersRules(Executor.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomMapHierarchyTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomMapHierarchyTest.java
index a1c19eb..c4e379c 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomMapHierarchyTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomMapHierarchyTest.java
@@ -8,9 +8,7 @@
 
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.shaking.ProguardKeepAttributes;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.StringUtils;
 import java.nio.file.Path;
@@ -62,7 +60,7 @@
     Assume.assumeTrue(parameters.getRuntime().isDex());
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addInnerClasses(CustomMapHierarchyTest.class)
         .setMinApi(parameters.getApiLevel())
         .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -124,7 +122,7 @@
     Assume.assumeTrue(parameters.getRuntime().isDex());
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForR8(parameters.getBackend())
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addInnerClasses(CustomMapHierarchyTest.class)
         .addKeepMainRule(Main.class)
         .addKeepAllClassesRuleWithAllowObfuscation()
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DefaultMethodOverrideConflictWithLibrary2Test.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DefaultMethodOverrideConflictWithLibrary2Test.java
index a67f335..e836c76 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DefaultMethodOverrideConflictWithLibrary2Test.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DefaultMethodOverrideConflictWithLibrary2Test.java
@@ -13,8 +13,6 @@
 import com.android.tools.r8.TestRunResult;
 import com.android.tools.r8.TestRuntime;
 import com.android.tools.r8.TestRuntime.CfVm;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.google.common.collect.ImmutableList;
 import java.io.IOException;
 import java.lang.reflect.Method;
@@ -79,7 +77,7 @@
           .apply(this::checkResult);
     } else {
       testForD8()
-          .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+          .addLibraryFiles(getLibraryFile())
           .addProgramClasses(getClasses())
           .addProgramClassFileData(getTransforms())
           .setMinApi(parameters.getApiLevel())
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DefaultMethodOverrideConflictWithLibraryTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DefaultMethodOverrideConflictWithLibraryTest.java
index 691ef4a..21abdb5 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DefaultMethodOverrideConflictWithLibraryTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DefaultMethodOverrideConflictWithLibraryTest.java
@@ -13,8 +13,6 @@
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.TestRuntime;
 import com.android.tools.r8.TestRuntime.CfVm;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.google.common.collect.ImmutableList;
 import java.io.IOException;
 import java.lang.reflect.Method;
@@ -80,7 +78,7 @@
           .assertFailureWithErrorThatMatches(getExpectedError());
     } else {
       testForD8()
-          .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+          .addLibraryFiles(getLibraryFile())
           .setMinApi(parameters.getApiLevel())
           .addProgramClasses(CLASSES)
           .addProgramClassFileData(getTransforms())
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DefaultMethodOverrideInLibraryTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DefaultMethodOverrideInLibraryTest.java
index a23a6d8..14d4f62 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DefaultMethodOverrideInLibraryTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DefaultMethodOverrideInLibraryTest.java
@@ -12,7 +12,6 @@
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.TestRuntime;
 import com.android.tools.r8.TestRuntime.CfVm;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.DexVm.Version;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
@@ -67,7 +66,7 @@
           .assertSuccessWithOutput(EXPECTED);
     } else {
       testForD8()
-          .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+          .addLibraryFiles(getLibraryFile())
           .setMinApi(parameters.getApiLevel())
           .addInnerClasses(DefaultMethodOverrideInLibraryTest.class)
           .enableCoreLibraryDesugaring(
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredGenericSignatureTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredGenericSignatureTest.java
index 3e23d64..912e353 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredGenericSignatureTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredGenericSignatureTest.java
@@ -11,7 +11,6 @@
 import com.android.tools.r8.NeverInline;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.shaking.ProguardKeepAttributes;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
@@ -56,7 +55,7 @@
     Assume.assumeTrue(parameters.getRuntime().isDex());
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addInnerClasses(DesugaredGenericSignatureTest.class)
         .setMinApi(parameters.getApiLevel())
         .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -120,7 +119,7 @@
     Assume.assumeTrue(parameters.getRuntime().isDex());
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForR8(parameters.getBackend())
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addInnerClasses(DesugaredGenericSignatureTest.class)
         .addKeepMainRule(Main.class)
         .addKeepAllClassesRuleWithAllowObfuscation()
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryChecksumsTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryChecksumsTest.java
index bcefe74..e2565d6 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryChecksumsTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryChecksumsTest.java
@@ -8,7 +8,6 @@
 import com.android.tools.r8.L8Command;
 import com.android.tools.r8.OutputMode;
 import com.android.tools.r8.StringResource;
-import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.ToolHelper;
@@ -21,7 +20,7 @@
 import org.junit.runners.Parameterized;
 
 @RunWith(Parameterized.class)
-public class DesugaredLibraryChecksumsTest extends TestBase {
+public class DesugaredLibraryChecksumsTest extends DesugaredLibraryTestBase {
 
   @Parameterized.Parameters(name = "{0}")
   public static TestParametersCollection data() {
@@ -38,7 +37,7 @@
     L8.run(
         L8Command.builder()
             .setIncludeClassesChecksum(true)
-            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+            .addLibraryFiles(getLibraryFile())
             .addProgramFiles(ToolHelper.getDesugarJDKLibs())
             .addProgramFiles(ToolHelper.DESUGAR_LIB_CONVERSIONS)
             .setMode(CompilationMode.DEBUG)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryCloneTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryCloneTest.java
index c4c0c13..b7a9374 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryCloneTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryCloneTest.java
@@ -5,8 +5,6 @@
 package com.android.tools.r8.desugar.desugaredlibrary;
 
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
 import java.time.DayOfWeek;
 import java.util.List;
@@ -37,7 +35,7 @@
   public void testD8() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addInnerClasses(getClass())
         .setMinApi(parameters.getApiLevel())
         .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -55,7 +53,7 @@
   public void testR8() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForR8(parameters.getBackend())
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addInnerClasses(getClass())
         .addKeepMainRule(Main.class)
         .setMinApi(parameters.getApiLevel())
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryContentTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryContentTest.java
index f0f4e90..e353126 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryContentTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryContentTest.java
@@ -78,7 +78,7 @@
     Path desugaredLib = temp.newFolder().toPath().resolve("desugar_jdk_libs_dex.zip");
     L8Command.Builder l8Builder =
         L8Command.builder(diagnosticsHandler)
-            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+            .addLibraryFiles(getLibraryFile())
             .addProgramFiles(ToolHelper.getDesugarJDKLibs())
             .addProgramFiles(ToolHelper.DESUGAR_LIB_CONVERSIONS)
             .addLibraryFiles(ToolHelper.getCoreLambdaStubs())
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryMismatchTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryMismatchTest.java
index 2cc0f87..91b87a0 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryMismatchTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryMismatchTest.java
@@ -13,7 +13,6 @@
 import com.android.tools.r8.LibraryDesugaringTestConfiguration;
 import com.android.tools.r8.StringResource;
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.errors.DesugaredLibraryMismatchDiagnostic;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibraryConfiguration;
 import com.android.tools.r8.origin.Origin;
@@ -59,7 +58,7 @@
     // Combine DEX input without library desugaring with dexing with library desugaring.
     try {
       testForD8()
-          .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+          .addLibraryFiles(getLibraryFile())
           .addProgramFiles(libraryDex)
           .addProgramClasses(TestRunner.class)
           .setMinApi(apiLevel)
@@ -92,7 +91,7 @@
 
     // Combine CF desugared input without library desugaring with dexing with library desugaring.
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addProgramFiles(desugaredLibrary)
         .addProgramClasses(TestRunner.class)
         .setMinApi(apiLevel)
@@ -120,7 +119,7 @@
             .writeToZip();
 
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addProgramFiles(desugaredLibraryDex)
         .addProgramClasses(TestRunner.class)
         .setMinApi(apiLevel)
@@ -160,7 +159,7 @@
     // DEX code with library desugaring.
     Path libraryDex =
         testForD8(Backend.DEX)
-            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+            .addLibraryFiles(getLibraryFile())
             .addProgramClasses(Library.class)
             .setMinApi(apiLevel)
             .enableCoreLibraryDesugaring(LibraryDesugaringTestConfiguration.forApiLevel(apiLevel))
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryTestBase.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryTestBase.java
index 4ab080f..67cce40 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryTestBase.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryTestBase.java
@@ -87,6 +87,12 @@
     throw new Error("Unsupported conversion parameters");
   }
 
+  protected Path getLibraryFile() {
+    return isJDK11DesugaredLibrary()
+        ? ToolHelper.getAndroidJar(AndroidApiLevel.S)
+        : ToolHelper.getAndroidJar(AndroidApiLevel.P);
+  }
+
   protected boolean requiresEmulatedInterfaceCoreLibDesugaring(TestParameters parameters) {
     return parameters.getApiLevel().isLessThan(apiLevelWithDefaultInterfaceMethodsSupport());
   }
@@ -138,7 +144,7 @@
     try {
       return testForL8(apiLevel)
           .addProgramFiles(additionalProgramFiles)
-          .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+          .addLibraryFiles(getLibraryFile())
           .applyIf(
               release,
               builder -> {
@@ -204,7 +210,7 @@
     Path desugaredLib = temp.newFolder().toPath().resolve("desugar_jdk_libs.jar");
     L8Command.Builder l8Builder =
         L8Command.builder()
-            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+            .addLibraryFiles(getLibraryFile())
             .addProgramFiles(ToolHelper.getDesugarJDKLibs())
             .addProgramFiles(ToolHelper.DESUGAR_LIB_CONVERSIONS)
             .setMode(CompilationMode.DEBUG)
@@ -243,7 +249,7 @@
     desugaredLib = temp.newFolder().toPath().resolve("desugar_jdk_libs.jar");
     L8Command.Builder l8Builder =
         L8Command.builder()
-            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+            .addLibraryFiles(getLibraryFile())
             .addProgramFiles(ToolHelper.getDesugarJDKLibs())
             .addProgramFiles(ToolHelper.DESUGAR_LIB_CONVERSIONS)
             .setMode(CompilationMode.DEBUG)
@@ -262,7 +268,7 @@
     TraceReferences.run(
         "--keep-rules",
         "--lib",
-        ToolHelper.getAndroidJar(AndroidApiLevel.P).toString(),
+        getLibraryFile().toString(),
         "--target",
         desugaredLibraryClassFile.toString(),
         "--source",
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryWarningTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryWarningTest.java
index 04411fb..0c61a06 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryWarningTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryWarningTest.java
@@ -12,7 +12,6 @@
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.origin.Origin;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
 import java.nio.file.Path;
 import java.util.Arrays;
@@ -53,7 +52,7 @@
     Path desugaredLib = temp.newFolder().toPath().resolve("desugar_jdk_libs_dex.zip");
     L8Command.Builder l8Builder =
         L8Command.builder(diagnosticsHandler)
-            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+            .addLibraryFiles(getLibraryFile())
             .addProgramFiles(ToolHelper.getDesugarJDKLibs())
             .addProgramFiles(ToolHelper.DESUGAR_LIB_CONVERSIONS)
             .setMode(shrinkDesugaredLibrary ? CompilationMode.RELEASE : CompilationMode.DEBUG)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLocalDateReflectedTypePassedToStaticType.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLocalDateReflectedTypePassedToStaticType.java
index 7a7ae9f..8e1ab72 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLocalDateReflectedTypePassedToStaticType.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLocalDateReflectedTypePassedToStaticType.java
@@ -9,7 +9,6 @@
 import com.android.tools.r8.D8TestRunResult;
 import com.android.tools.r8.R8TestRunResult;
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.StringUtils;
@@ -44,7 +43,7 @@
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     D8TestRunResult runResult =
         testForD8()
-            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+            .addLibraryFiles(getLibraryFile())
             .addInnerClasses(DesugaredLocalDateReflectedTypePassedToStaticType.class)
             .setMinApi(parameters.getApiLevel())
             .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -69,7 +68,7 @@
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     R8TestRunResult runResult =
         testForR8(parameters.getBackend())
-            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+            .addLibraryFiles(getLibraryFile())
             .addInnerClasses(DesugaredLocalDateReflectedTypePassedToStaticType.class)
             .addKeepMainRule(Main.class)
             .setMinApi(parameters.getApiLevel())
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLocalDateReflectionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLocalDateReflectionTest.java
index 15d312d..ebc0f68 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLocalDateReflectionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLocalDateReflectionTest.java
@@ -9,9 +9,7 @@
 import com.android.tools.r8.D8TestRunResult;
 import com.android.tools.r8.R8TestRunResult;
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.DexVm;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.StringUtils;
 import java.util.List;
@@ -44,7 +42,7 @@
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     D8TestRunResult runResult =
         testForD8()
-            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+            .addLibraryFiles(getLibraryFile())
             .addInnerClasses(DesugaredLocalDateReflectionTest.class)
             .setMinApi(parameters.getApiLevel())
             .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -69,7 +67,7 @@
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     R8TestRunResult runResult =
         testForR8(parameters.getBackend())
-            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+            .addLibraryFiles(getLibraryFile())
             .addInnerClasses(DesugaredLocalDateReflectionTest.class)
             .addKeepMainRule(Main.class)
             .setMinApi(parameters.getApiLevel())
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredReflectedDesugaredTypePassedToStaticTypeTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredReflectedDesugaredTypePassedToStaticTypeTest.java
index bb2da3c..78d3317 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredReflectedDesugaredTypePassedToStaticTypeTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredReflectedDesugaredTypePassedToStaticTypeTest.java
@@ -9,7 +9,6 @@
 import com.android.tools.r8.D8TestRunResult;
 import com.android.tools.r8.R8TestRunResult;
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.StringUtils;
@@ -45,7 +44,7 @@
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     D8TestRunResult runResult =
         testForD8()
-            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+            .addLibraryFiles(getLibraryFile())
             .addInnerClasses(DesugaredReflectedDesugaredTypePassedToStaticTypeTest.class)
             .setMinApi(parameters.getApiLevel())
             .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -70,7 +69,7 @@
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     R8TestRunResult runResult =
         testForR8(parameters.getBackend())
-            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+            .addLibraryFiles(getLibraryFile())
             .addInnerClasses(DesugaredReflectedDesugaredTypePassedToStaticTypeTest.class)
             .addKeepMainRule(Main.class)
             .setMinApi(parameters.getApiLevel())
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DontKeepBootstrapClassesTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DontKeepBootstrapClassesTest.java
index 057d37f..7e94671 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DontKeepBootstrapClassesTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DontKeepBootstrapClassesTest.java
@@ -9,7 +9,6 @@
 import com.android.tools.r8.LibraryDesugaringTestConfiguration.PresentKeepRuleConsumer;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import java.util.Arrays;
 import java.util.function.Consumer;
@@ -35,7 +34,7 @@
   public void test() throws Exception {
     KeepRuleConsumer keepRuleConsumer = new PresentKeepRuleConsumer();
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addProgramClasses(TestClass.class)
         .setMinApi(minApiLevel)
         .addLibraryClasses(CustomLibClass.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DoubleUtilityClassTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DoubleUtilityClassTest.java
index 0737de9..89b293f 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DoubleUtilityClassTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DoubleUtilityClassTest.java
@@ -10,8 +10,6 @@
 import com.android.tools.r8.LibraryDesugaringTestConfiguration;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import java.time.LocalDateTime;
 import java.time.ZoneOffset;
 import java.time.zone.ZoneOffsetTransition;
@@ -39,7 +37,7 @@
   public void testDoubleUtility() throws Exception {
     for (Class<?> executor : new Class<?>[] {ExecutorV1.class, ExecutorV2.class}) {
       testForD8()
-          .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+          .addLibraryFiles(getLibraryFile())
           .addProgramClasses(executor)
           .enableCoreLibraryDesugaring(
               LibraryDesugaringTestConfiguration.forApiLevel(parameters.getApiLevel()))
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/EmptyDesugaredLibrary.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/EmptyDesugaredLibrary.java
index 1352a82..2411f70 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/EmptyDesugaredLibrary.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/EmptyDesugaredLibrary.java
@@ -14,12 +14,13 @@
 import com.android.tools.r8.OutputMode;
 import com.android.tools.r8.StringResource;
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Set;
 import java.util.zip.ZipFile;
 import org.junit.Test;
@@ -30,18 +31,34 @@
 @RunWith(Parameterized.class)
 public class EmptyDesugaredLibrary extends DesugaredLibraryTestBase {
 
-  @Parameters(name = "{0}")
-  public static TestParametersCollection data() {
-    return getTestParameters().withNoneRuntime().build();
+  private final AndroidApiLevel apiLevel;
+
+  @Parameters(name = "api: {0}")
+  public static List<Object[]> data() {
+    return buildParameters(
+        range(AndroidApiLevel.K, AndroidApiLevel.ANDROID_PLATFORM),
+        getTestParameters().withNoneRuntime().build());
   }
 
-  public EmptyDesugaredLibrary(TestParameters parameters) {
+  private static List<AndroidApiLevel> range(
+      AndroidApiLevel fromIncluding, AndroidApiLevel toExcluding) {
+    ArrayList<AndroidApiLevel> result = new ArrayList<>();
+    for (AndroidApiLevel apiLevel : AndroidApiLevel.values()) {
+      if (apiLevel.isGreaterThanOrEqualTo(fromIncluding) && apiLevel.isLessThan(toExcluding)) {
+        result.add(apiLevel);
+      }
+    }
+    return result;
+  }
+
+  public EmptyDesugaredLibrary(AndroidApiLevel apiLevel, TestParameters parameters) {
     parameters.assertNoneRuntime();
+    this.apiLevel = apiLevel;
   }
 
   private L8Command.Builder prepareL8Builder(AndroidApiLevel minApiLevel) {
     return L8Command.builder()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addProgramFiles(ToolHelper.getDesugarJDKLibs())
         .addDesugaredLibraryConfiguration(
             StringResource.fromFile(ToolHelper.getDesugarLibJsonForTesting()))
@@ -63,60 +80,42 @@
     }
   }
 
-  private int firstEmptyLevel() {
-    return isJDK11DesugaredLibrary()
-        // Some desugarings are required on all API levels including UNKNOWN.
-        ? AndroidApiLevel.NOT_SET.getLevel()
-        : AndroidApiLevel.O.getLevel();
+  private boolean expectsEmptyDesugaredLibrary(AndroidApiLevel apiLevel) {
+    if (isJDK11DesugaredLibrary()) {
+      return false;
+    }
+    return apiLevel.isGreaterThanOrEqualTo(AndroidApiLevel.O);
   }
 
   @Test
   public void testEmptyDesugaredLibrary() throws Exception {
-    for (AndroidApiLevel apiLevel : AndroidApiLevel.values()) {
-      if (apiLevel.getLevel() < AndroidApiLevel.K.getLevel()) {
-        // No need to test all API levels.
-        continue;
-      }
-      CountingProgramConsumer programConsumer = new CountingProgramConsumer();
-      ToolHelper.runL8(prepareL8Builder(apiLevel).setProgramConsumer(programConsumer).build());
-      assertEquals(apiLevel.getLevel() >= firstEmptyLevel() ? 0 : 1, programConsumer.count);
-    }
+    CountingProgramConsumer programConsumer = new CountingProgramConsumer();
+    ToolHelper.runL8(prepareL8Builder(apiLevel).setProgramConsumer(programConsumer).build());
+    assertEquals(expectsEmptyDesugaredLibrary(apiLevel) ? 0 : 1, programConsumer.count);
   }
 
   @Test
   public void testEmptyDesugaredLibraryDexZip() throws Exception {
-    for (AndroidApiLevel apiLevel : AndroidApiLevel.values()) {
-      if (apiLevel.getLevel() < AndroidApiLevel.K.getLevel()) {
-        // No need to test all API levels.
-        continue;
-      }
-      Path desugaredLibraryZip = temp.newFolder().toPath().resolve("desugar_jdk_libs_dex.zip");
-      ToolHelper.runL8(
-          prepareL8Builder(apiLevel).setOutput(desugaredLibraryZip, OutputMode.DexIndexed).build());
-      assertTrue(Files.exists(desugaredLibraryZip));
-      assertEquals(
-          apiLevel.getLevel() >= firstEmptyLevel() ? 0 : 1,
-          new ZipFile(desugaredLibraryZip.toFile(), StandardCharsets.UTF_8).size());
-    }
+    Path desugaredLibraryZip = temp.newFolder().toPath().resolve("desugar_jdk_libs_dex.zip");
+    ToolHelper.runL8(
+        prepareL8Builder(apiLevel).setOutput(desugaredLibraryZip, OutputMode.DexIndexed).build());
+    assertTrue(Files.exists(desugaredLibraryZip));
+    assertEquals(
+        expectsEmptyDesugaredLibrary(apiLevel) ? 0 : 1,
+        new ZipFile(desugaredLibraryZip.toFile(), StandardCharsets.UTF_8).size());
   }
 
   @Test
   public void testEmptyDesugaredLibraryDexDirectory() throws Exception {
-    for (AndroidApiLevel apiLevel : AndroidApiLevel.values()) {
-      if (apiLevel.getLevel() < AndroidApiLevel.K.getLevel()) {
-        // No need to test all API levels.
-        continue;
-      }
-      Path desugaredLibraryDirectory = temp.newFolder().toPath();
-      ToolHelper.runL8(
-          prepareL8Builder(apiLevel)
-              .setOutput(desugaredLibraryDirectory, OutputMode.DexIndexed)
-              .build());
-      assertEquals(
-          apiLevel.getLevel() >= firstEmptyLevel() ? 0 : 1,
-          Files.walk(desugaredLibraryDirectory)
-              .filter(path -> path.toString().endsWith(".dex"))
-              .count());
-    }
+    Path desugaredLibraryDirectory = temp.newFolder().toPath();
+    ToolHelper.runL8(
+        prepareL8Builder(apiLevel)
+            .setOutput(desugaredLibraryDirectory, OutputMode.DexIndexed)
+            .build());
+    assertEquals(
+        expectsEmptyDesugaredLibrary(apiLevel) ? 0 : 1,
+        Files.walk(desugaredLibraryDirectory)
+            .filter(path -> path.toString().endsWith(".dex"))
+            .count());
   }
 }
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/FeatureSplitTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/FeatureSplitTest.java
index f7eecc8..88580f5 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/FeatureSplitTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/FeatureSplitTest.java
@@ -236,7 +236,7 @@
 
       KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
       testForR8(parameters.getBackend())
-          .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+          .addLibraryFiles(getLibraryFile())
           .addProgramClasses(BaseClass.class, RunInterface.class, SplitRunner.class)
           .setMinApi(parameters.getApiLevel())
           .addFeatureSplit(
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/FreezePeriodTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/FreezePeriodTest.java
index ac48549..8a04ae3 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/FreezePeriodTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/FreezePeriodTest.java
@@ -6,7 +6,6 @@
 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.DesugaredLibraryTestBase;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
@@ -59,7 +58,7 @@
   public void testD8() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .setMinApi(parameters.getApiLevel())
         .addProgramClasses(Executor.class, MyFreezePeriod.class)
         .addLibraryClasses(FreezePeriod.class)
@@ -80,7 +79,7 @@
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     Path jar =
         testForD8(Backend.CF)
-            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+            .addLibraryFiles(getLibraryFile())
             .setMinApi(parameters.getApiLevel())
             .addProgramClasses(Executor.class, MyFreezePeriod.class)
             .addLibraryClasses(FreezePeriod.class)
@@ -121,7 +120,7 @@
   public void testR8() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForR8(parameters.getBackend())
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .setMinApi(parameters.getApiLevel())
         .addKeepMainRule(Executor.class)
         .addProgramClasses(Executor.class, MyFreezePeriod.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ImplementedInterfacesTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ImplementedInterfacesTest.java
index 75692a2..90a302f 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ImplementedInterfacesTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ImplementedInterfacesTest.java
@@ -10,8 +10,6 @@
 import static org.hamcrest.MatcherAssert.assertThat;
 
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import java.io.Serializable;
@@ -69,7 +67,7 @@
   public void testInterfaces() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForD8(parameters.getBackend())
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addInnerClasses(ImplementedInterfacesTest.class)
         .setMinApi(parameters.getApiLevel())
         .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/InstantTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/InstantTest.java
index a99d29c..d3c8a4d 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/InstantTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/InstantTest.java
@@ -5,8 +5,6 @@
 package com.android.tools.r8.desugar.desugaredlibrary;
 
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
 import java.time.Instant;
 import java.time.ZoneOffset;
@@ -37,7 +35,7 @@
   public void testInstantD8() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addInnerClasses(InstantTest.class)
         .setMinApi(parameters.getApiLevel())
         .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -55,7 +53,7 @@
   public void testInstantR8() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForR8(parameters.getBackend())
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addInnerClasses(InstantTest.class)
         .setMinApi(parameters.getApiLevel())
         .addKeepClassAndMembersRules(Executor.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/InvalidLibraryTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/InvalidLibraryTest.java
index 8ef34bb..760fc1c 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/InvalidLibraryTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/InvalidLibraryTest.java
@@ -8,7 +8,6 @@
 
 import com.android.tools.r8.TestDiagnosticMessages;
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.errors.InvalidLibrarySuperclassDiagnostic;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
@@ -67,7 +66,7 @@
   public void testProgramSupertype() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .setMinApi(parameters.getApiLevel())
         .addProgramClasses(
             Executor.class, SuperLibraryClass.class, LocalClass.class, LocalClassOverride.class)
@@ -89,7 +88,7 @@
     Assume.assumeTrue(requiresAnyCoreLibDesugaring(parameters));
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .setMinApi(parameters.getApiLevel())
         .addProgramClasses(Executor.class, LocalClass.class, LocalClassOverride.class)
         .addClasspathClasses(SuperLibraryClass.class)
@@ -116,7 +115,7 @@
     Assume.assumeTrue(requiresAnyCoreLibDesugaring(parameters));
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .setMinApi(parameters.getApiLevel())
         .addProgramClasses(Executor.class, LocalClass.class, LocalClassOverride.class)
         .addLibraryClasses(CustomLibraryClass.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/IterableTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/IterableTest.java
index 59a6b5b..e2cdf17 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/IterableTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/IterableTest.java
@@ -8,8 +8,6 @@
 
 import com.android.tools.r8.LibraryDesugaringTestConfiguration;
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
@@ -108,7 +106,7 @@
     }
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addInnerClasses(IterableTest.class)
         .setMinApi(parameters.getApiLevel())
         .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/IterateTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/IterateTest.java
index 86ef0d5..daa7978 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/IterateTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/IterateTest.java
@@ -6,8 +6,6 @@
 
 import com.android.tools.r8.LibraryDesugaringTestConfiguration;
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.StringUtils;
 import java.nio.file.Path;
@@ -83,7 +81,7 @@
     }
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addInnerClasses(IterateTest.class)
         .setMinApi(parameters.getApiLevel())
         .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/IteratorTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/IteratorTest.java
index 976f00e..3664076 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/IteratorTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/IteratorTest.java
@@ -12,7 +12,6 @@
 import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.LibraryDesugaringTestConfiguration.AbsentKeepRuleConsumer;
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.DescriptorUtils;
@@ -63,7 +62,7 @@
     }
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addInnerClasses(IteratorTest.class)
         .setMinApi(parameters.getApiLevel())
         .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/J$ExtensionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/J$ExtensionTest.java
index 5d0cea7..253763b 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/J$ExtensionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/J$ExtensionTest.java
@@ -143,7 +143,7 @@
 
     try {
       testForD8()
-          .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+          .addLibraryFiles(getLibraryFile())
           .addProgramFiles(compiledClasses)
           .setMinApi(parameters.getApiLevel())
           .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaTimeTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaTimeTest.java
index f86dacf..0e9d632 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaTimeTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaTimeTest.java
@@ -15,7 +15,6 @@
 import com.android.tools.r8.NoVerticalClassMerging;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
@@ -246,7 +245,7 @@
     testForD8()
         .addInnerClasses(JavaTimeTest.class)
         .setMinApi(parameters.getApiLevel())
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .enableLibraryDesugaring(
             LibraryDesugaringTestConfiguration.builder()
                 .setMinApi(parameters.getApiLevel())
@@ -269,7 +268,7 @@
         .addKeepMainRule(TestClass.class)
         .enableNoVerticalClassMergingAnnotations()
         .setMinApi(parameters.getApiLevel())
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .enableLibraryDesugaring(
             LibraryDesugaringTestConfiguration.builder()
                 .setMinApi(parameters.getApiLevel())
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaUtilFunctionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaUtilFunctionTest.java
index 2e0481d..b8fd76f 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaUtilFunctionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaUtilFunctionTest.java
@@ -11,8 +11,6 @@
 import com.android.tools.r8.KeepConstantArguments;
 import com.android.tools.r8.NeverInline;
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
@@ -64,7 +62,7 @@
   public void testJavaUtilFunctionD8() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addInnerClasses(JavaUtilFunctionTest.class)
         .setMinApi(parameters.getApiLevel())
         .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -84,7 +82,7 @@
   public void testJavaUtilFunctionR8() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForR8(parameters.getBackend())
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .enableInliningAnnotations()
         .noMinification()
         .addKeepMainRule(TestClass.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaUtilOptionalTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaUtilOptionalTest.java
index ccac378..e2271ae 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaUtilOptionalTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaUtilOptionalTest.java
@@ -13,7 +13,6 @@
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
@@ -81,7 +80,7 @@
             "42.42");
     testForD8()
         .addInnerClasses(JavaUtilOptionalTest.class)
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .setMinApi(parameters.getApiLevel())
         .enableCoreLibraryDesugaring(
             LibraryDesugaringTestConfiguration.forApiLevel(parameters.getApiLevel()))
@@ -94,7 +93,7 @@
   @Test
   public void testJavaOptionalJava9() throws Exception {
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addProgramFiles(
             Paths.get(ToolHelper.EXAMPLES_JAVA9_BUILD_DIR).resolve("backport" + JAR_EXTENSION))
         .setMinApi(parameters.getApiLevel())
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LibraryEmptySubclassInterfaceTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LibraryEmptySubclassInterfaceTest.java
index 172d7f9..18989a3 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LibraryEmptySubclassInterfaceTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LibraryEmptySubclassInterfaceTest.java
@@ -8,8 +8,6 @@
 import static org.hamcrest.MatcherAssert.assertThat;
 
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
 import java.util.List;
 import java.util.concurrent.ConcurrentHashMap;
@@ -40,7 +38,7 @@
   public void testD8() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addInnerClasses(LibraryEmptySubclassInterfaceTest.class)
         .setMinApi(parameters.getApiLevel())
         .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -67,7 +65,7 @@
   public void testR8() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForR8(Backend.DEX)
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addInnerClasses(LibraryEmptySubclassInterfaceTest.class)
         .addKeepMainRule(Executor.class)
         .noMinification()
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LinkedHashSetTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LinkedHashSetTest.java
index d551a20..981edea 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LinkedHashSetTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LinkedHashSetTest.java
@@ -7,8 +7,6 @@
 import com.android.tools.r8.LibraryDesugaringTestConfiguration;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import java.util.LinkedHashSet;
 import java.util.Set;
 import java.util.Spliterator;
@@ -35,7 +33,7 @@
   public void testLinkedHashSetOverrides() throws Exception {
     String stdOut =
         testForD8()
-            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+            .addLibraryFiles(getLibraryFile())
             .addInnerClasses(LinkedHashSetTest.class)
             .setMinApi(parameters.getApiLevel())
             .enableCoreLibraryDesugaring(
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LintFilesTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LintFilesTest.java
index f84c38c..283900e 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LintFilesTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LintFilesTest.java
@@ -10,7 +10,6 @@
 
 import com.android.tools.r8.GenerateLintFiles;
 import com.android.tools.r8.StringResource;
-import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.ToolHelper;
@@ -32,7 +31,7 @@
 import org.junit.runners.Parameterized.Parameters;
 
 @RunWith(Parameterized.class)
-public class LintFilesTest extends TestBase {
+public class LintFilesTest extends DesugaredLibraryTestBase {
 
   @Parameters(name = "{0}")
   public static TestParametersCollection data() {
@@ -51,8 +50,9 @@
     assertTrue(methods.contains("java/util/Optional"));
     assertTrue(methods.contains("java/util/OptionalInt"));
 
-    // ConcurrentHashMap is not fully supported.
-    assertFalse(methods.contains("java/util/concurrent/ConcurrentHashMap"));
+    // ConcurrentHashMap is fully supported on JDK 11.
+    assertEquals(
+        isJDK11DesugaredLibrary(), methods.contains("java/util/concurrent/ConcurrentHashMap"));
 
     // No parallel* methods pre L, and all stream methods supported from L.
     assertEquals(
@@ -79,6 +79,11 @@
         methods.contains(
             "java/util/stream/IntStream#allMatch(Ljava/util/function/IntPredicate;)Z"));
 
+    if (isJDK11DesugaredLibrary()) {
+      // TODO(b/203382252): Investigate why the following assertions are not working on JDK 11.
+      return;
+    }
+
     // Supported methods on ConcurrentHashMap.
     assertTrue(
         methods.contains(
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MergingJ$Test.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MergingJ$Test.java
index a8462e1..d5300ad 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MergingJ$Test.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MergingJ$Test.java
@@ -52,7 +52,7 @@
         () ->
             testForD8()
                 .addProgramFiles(mergerInputPart1, mergerInputPart2)
-                .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+                .addLibraryFiles(getLibraryFile())
                 .compileWithExpectedDiagnostics(
                     diagnostics -> {
                       diagnostics
@@ -69,7 +69,7 @@
     D8Command command =
         D8Command.builder()
             .addProgramFiles(mergerInputPart1, mergerInputPart2)
-            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+            .addLibraryFiles(getLibraryFile())
             .setOutput(merged, OutputMode.DexIndexed)
             .build();
     try {
@@ -103,7 +103,7 @@
     Path outputDex = temp.newFolder().toPath().resolve("merger-input-dex.zip");
     L8.run(
         L8Command.builder()
-            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+            .addLibraryFiles(getLibraryFile())
             .addProgramFiles(ToolHelper.getDesugarJDKLibs())
             .addDesugaredLibraryConfiguration(
                 StringResource.fromFile(ToolHelper.getDesugarLibJsonForTesting()))
@@ -117,7 +117,7 @@
     Path outputDex = temp.newFolder().toPath().resolve("merger-input-split-dex.zip");
     L8.run(
         L8Command.builder()
-            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+            .addLibraryFiles(getLibraryFile())
             .addProgramFiles(JDK_11_JAVA_BASE_EXTENSION_COMPILED_FILES)
             .addClasspathFiles(ToolHelper.getDesugarJDKLibs())
             .addDesugaredLibraryConfiguration(
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MergingWithDesugaredLibraryTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MergingWithDesugaredLibraryTest.java
index dd89992..05282d5 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MergingWithDesugaredLibraryTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MergingWithDesugaredLibraryTest.java
@@ -26,7 +26,6 @@
 import com.android.tools.r8.TestDiagnosticMessages;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.desugar.desugaredlibrary.jdktests.Jdk11DesugaredLibraryTestBase;
 import com.android.tools.r8.dex.Marker;
 import com.android.tools.r8.dex.Marker.Tool;
@@ -63,9 +62,8 @@
     try {
       compileResult =
           testForD8()
-              .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+              .addLibraryFiles(getLibraryFile())
               .addProgramFiles(buildPart1DesugaredLibrary(), buildPart2NoDesugaredLibrary())
-              .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
               .setMinApi(parameters.getApiLevel())
               .applyIf(
                   someLibraryDesugaringRequired(),
@@ -111,7 +109,7 @@
     Path app =
         testForD8()
             .addProgramFiles(buildPart1DesugaredLibrary(), shrunkenLib)
-            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+            .addLibraryFiles(getLibraryFile())
             .setMinApi(parameters.getApiLevel())
             .applyIf(
                 someLibraryDesugaringRequired(),
@@ -222,7 +220,7 @@
         testForD8()
             .addProgramFiles(buildPart1DesugaredLibrary())
             .addProgramClasses(Part2.class)
-            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+            .addLibraryFiles(getLibraryFile())
             .setMinApi(parameters.getApiLevel())
             .applyIf(
                 someLibraryDesugaringRequired(),
@@ -260,7 +258,7 @@
 
   private Path buildPart1DesugaredLibrary() throws Exception {
     return testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addProgramClasses(Part1.class)
         .setMinApi(parameters.getApiLevel())
         .applyIf(
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MinimalInterfaceSuperTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MinimalInterfaceSuperTest.java
index 697253b..6ab6b2f 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MinimalInterfaceSuperTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MinimalInterfaceSuperTest.java
@@ -7,8 +7,6 @@
 import com.android.tools.r8.LibraryDesugaringTestConfiguration;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import java.util.AbstractCollection;
 import java.util.Collection;
@@ -46,7 +44,7 @@
       return;
     }
     testForR8(parameters.getBackend())
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addInnerClasses(MinimalInterfaceSuperTest.class)
         .addKeepMainRule(Main.class)
         .setMinApi(parameters.getApiLevel())
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MonthTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MonthTest.java
index df67d51..f5b2096 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MonthTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MonthTest.java
@@ -8,8 +8,6 @@
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.TestRuntime;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import java.time.Month;
 import java.time.format.TextStyle;
@@ -60,7 +58,7 @@
       return;
     }
     testForD8(parameters.getBackend())
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addInnerClasses(MonthTest.class)
         .setMinApi(parameters.getApiLevel())
         .enableCoreLibraryDesugaring(
@@ -74,7 +72,7 @@
   public void testMonthR8() throws Exception {
     Assume.assumeTrue(parameters.isDexRuntime());
     testForR8(parameters.getBackend())
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addInnerClasses(MonthTest.class)
         .addKeepMainRule(MonthTest.Main.class)
         .setMinApi(parameters.getApiLevel())
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/NeverMergeCoreLibDesugarClasses.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/NeverMergeCoreLibDesugarClasses.java
index 4bee0d3..fbb422a 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/NeverMergeCoreLibDesugarClasses.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/NeverMergeCoreLibDesugarClasses.java
@@ -12,9 +12,7 @@
 import com.android.tools.r8.LibraryDesugaringTestConfiguration;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.smali.SmaliBuilder;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.google.common.collect.ImmutableList;
 import org.junit.Assume;
 import org.junit.Test;
@@ -69,18 +67,19 @@
     try {
       testForD8()
           .addInnerClasses(NeverMergeCoreLibDesugarClasses.class)
-          .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+          .addLibraryFiles(getLibraryFile())
           .setMinApi(parameters.getRuntime())
           .addProgramFiles(buildDesugaredLibrary(parameters.getApiLevel()))
-          .compileWithExpectedDiagnostics(diagnostics -> {
-            diagnostics.assertErrorsCount(1);
-            String message = diagnostics.getErrors().get(0).getDiagnosticMessage();
-            assertThat(
-                message,
-                containsString(
-                    "Merging dex file containing classes with prefix 'j$.' "
-                        + "with classes with any other prefixes is not allowed."));
-          });
+          .compileWithExpectedDiagnostics(
+              diagnostics -> {
+                diagnostics.assertErrorsCount(1);
+                String message = diagnostics.getErrors().get(0).getDiagnosticMessage();
+                assertThat(
+                    message,
+                    containsString(
+                        "Merging dex file containing classes with prefix 'j$.' "
+                            + "with classes with any other prefixes is not allowed."));
+              });
     } catch (CompilationFailedException e) {
       // Expected compilation failed.
       return;
@@ -94,7 +93,7 @@
     Assume.assumeTrue(parameters.getApiLevel().getLevel() < 24);
     testForD8()
         .addInnerClasses(NeverMergeCoreLibDesugarClasses.class)
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .setMinApi(parameters.getApiLevel())
         .enableCoreLibraryDesugaring(
             LibraryDesugaringTestConfiguration.forApiLevel(parameters.getApiLevel()))
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/NoDefaultMethodOverrideInLibraryTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/NoDefaultMethodOverrideInLibraryTest.java
index c562357..87d0bbd 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/NoDefaultMethodOverrideInLibraryTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/NoDefaultMethodOverrideInLibraryTest.java
@@ -12,8 +12,6 @@
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.TestRuntime;
 import com.android.tools.r8.TestRuntime.CfVm;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import java.lang.reflect.Method;
 import java.util.Collection;
@@ -72,7 +70,7 @@
           .assertSuccessWithOutput(EXPECTED);
     } else {
       testForD8()
-          .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+          .addLibraryFiles(getLibraryFile())
           .setMinApi(parameters.getApiLevel())
           .addInnerClasses(NoDefaultMethodOverrideInLibraryTest.class)
           .enableCoreLibraryDesugaring(
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/NoDesugaredLibraryDexFileTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/NoDesugaredLibraryDexFileTest.java
index 4d99161..3c83b83 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/NoDesugaredLibraryDexFileTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/NoDesugaredLibraryDexFileTest.java
@@ -7,8 +7,6 @@
 import static org.junit.Assert.assertTrue;
 
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import java.util.ArrayList;
@@ -46,7 +44,7 @@
     Assume.assumeTrue(requiresEmulatedInterfaceCoreLibDesugaring(parameters));
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addInnerClasses(NoDesugaredLibraryDexFileTest.class)
         .setMinApi(parameters.getApiLevel())
         .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -62,7 +60,7 @@
     Assume.assumeTrue(requiresEmulatedInterfaceCoreLibDesugaring(parameters));
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForR8(parameters.getBackend())
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addInnerClasses(NoDesugaredLibraryDexFileTest.class)
         .setMinApi(parameters.getApiLevel())
         .addKeepClassAndMembersRules(Executor.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/NoForwardingMethodsTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/NoForwardingMethodsTest.java
index 81457f6..298b653 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/NoForwardingMethodsTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/NoForwardingMethodsTest.java
@@ -7,8 +7,6 @@
 import static org.junit.Assert.assertTrue;
 
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import java.util.ArrayList;
@@ -45,7 +43,7 @@
   public void testCustomCollectionD8() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addInnerClasses(NoForwardingMethodsTest.class)
         .setMinApi(parameters.getApiLevel())
         .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -64,7 +62,7 @@
   public void testCustomCollectionR8() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForR8(parameters.getBackend())
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addInnerClasses(NoForwardingMethodsTest.class)
         .setMinApi(parameters.getApiLevel())
         .addKeepClassAndMembersRules(Executor.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/PriorityQueueSubclassTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/PriorityQueueSubclassTest.java
index 8cd0cca..72c8729 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/PriorityQueueSubclassTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/PriorityQueueSubclassTest.java
@@ -5,8 +5,6 @@
 package com.android.tools.r8.desugar.desugaredlibrary;
 
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
 import java.util.List;
 import java.util.PriorityQueue;
@@ -37,7 +35,7 @@
   public void testPriorityQueueD8() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addInnerClasses(PriorityQueueSubclassTest.class)
         .setMinApi(parameters.getApiLevel())
         .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -55,7 +53,7 @@
   public void testPriorityQueueR8() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForR8(Backend.DEX)
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addInnerClasses(PriorityQueueSubclassTest.class)
         .setMinApi(parameters.getApiLevel())
         .addKeepClassAndMembersRules(Executor.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ProgramInterfaceWithLibraryMethod.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ProgramInterfaceWithLibraryMethod.java
index 089f18a..daf4da7 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ProgramInterfaceWithLibraryMethod.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ProgramInterfaceWithLibraryMethod.java
@@ -59,7 +59,7 @@
   public void testD8() throws Exception {
     assumeTrue(parameters.isDexRuntime());
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addLibraryClasses(LibraryClass.class)
         .setMinApi(parameters.getApiLevel())
         .addProgramClasses(Executor.class, ProgramInterface.class, ProgramClass.class)
@@ -78,7 +78,7 @@
   public void testD8CfToCf() throws Exception {
     Path jar =
         testForD8(Backend.CF)
-            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+            .addLibraryFiles(getLibraryFile())
             .addLibraryClasses(LibraryClass.class)
             .addProgramClasses(Executor.class, ProgramInterface.class, ProgramClass.class)
             .setMinApi(parameters.getApiLevel())
@@ -116,7 +116,7 @@
   @Test
   public void testR8() throws Exception {
     testForR8(parameters.getBackend())
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addLibraryClasses(LibraryClass.class)
         .setMinApi(parameters.getApiLevel())
         .addProgramClasses(Executor.class, ProgramInterface.class, ProgramClass.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ProgramRewritingTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ProgramRewritingTest.java
index ee66aab..20e5408 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ProgramRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ProgramRewritingTest.java
@@ -60,7 +60,7 @@
       KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
       D8TestCompileResult compileResult =
           testForD8()
-              .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+              .addLibraryFiles(getLibraryFile())
               .addProgramFiles(Paths.get(ToolHelper.EXAMPLES_JAVA9_BUILD_DIR + "stream.jar"))
               .setMinApi(parameters.getApiLevel())
               .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -119,7 +119,7 @@
       KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
       R8TestRunResult runResult =
           testForR8(parameters.getBackend())
-              .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+              .addLibraryFiles(getLibraryFile())
               .minification(minifying)
               .addKeepMainRule(TEST_CLASS)
               .addProgramFiles(Paths.get(ToolHelper.EXAMPLES_JAVA9_BUILD_DIR + "stream.jar"))
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ReleasedVersionsSmokeTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ReleasedVersionsSmokeTest.java
index 8713609..44625b1 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ReleasedVersionsSmokeTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ReleasedVersionsSmokeTest.java
@@ -8,7 +8,6 @@
 import com.android.tools.r8.LibraryDesugaringTestConfiguration;
 import com.android.tools.r8.LibraryDesugaringTestConfiguration.Configuration;
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import java.time.Clock;
@@ -59,7 +58,7 @@
   @Test
   public void testD8() throws Exception {
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addInnerClasses(ReleasedVersionsSmokeTest.class)
         .setMinApi(parameters.getApiLevel())
         .enableCoreLibraryDesugaring(
@@ -77,7 +76,7 @@
   @Test
   public void testR8() throws Exception {
     testForR8(parameters.getBackend())
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addInnerClasses(ReleasedVersionsSmokeTest.class)
         .addKeepMainRule(TestClass.class)
         .setMinApi(parameters.getApiLevel())
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RequiredNonNullWithSupplierTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RequiredNonNullWithSupplierTest.java
index e1b302d..5780701 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RequiredNonNullWithSupplierTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RequiredNonNullWithSupplierTest.java
@@ -5,8 +5,6 @@
 package com.android.tools.r8.desugar.desugaredlibrary;
 
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.StringUtils;
 import java.util.List;
@@ -47,7 +45,7 @@
     }
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addInnerClasses(RequiredNonNullWithSupplierTest.class)
         .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
         .setMinApi(parameters.getApiLevel())
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RetargetAndBackportTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RetargetAndBackportTest.java
index 05fdd28..6b29a83 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RetargetAndBackportTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RetargetAndBackportTest.java
@@ -7,7 +7,6 @@
 import static org.junit.Assert.assertTrue;
 
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibraryConfiguration;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApiLevel;
@@ -41,7 +40,7 @@
     testForL8(AndroidApiLevel.B, backend)
         .noDefaultDesugarJDKLibs()
         .addProgramClassFileData(dump())
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         /*
          Add this library desugaring configuration:
          "library_flags": [
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RetargetOverrideTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RetargetOverrideTest.java
index e1592c0..61a1bf8 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RetargetOverrideTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RetargetOverrideTest.java
@@ -5,8 +5,6 @@
 package com.android.tools.r8.desugar.desugaredlibrary;
 
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
 import java.nio.file.Path;
 import java.time.Instant;
@@ -45,10 +43,10 @@
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     Path desugaredTwice =
         testForD8(Backend.CF)
-            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+            .addLibraryFiles(getLibraryFile())
             .addProgramFiles(
                 testForD8(Backend.CF)
-                    .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+                    .addLibraryFiles(getLibraryFile())
                     .addInnerClasses(RetargetOverrideTest.class)
                     .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
                     .setMinApi(parameters.getApiLevel())
@@ -103,7 +101,7 @@
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     String stdout =
         testForD8()
-            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+            .addLibraryFiles(getLibraryFile())
             .addInnerClasses(RetargetOverrideTest.class)
             .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
             .setMinApi(parameters.getApiLevel())
@@ -128,7 +126,7 @@
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     String stdout =
         testForR8(Backend.DEX)
-            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+            .addLibraryFiles(getLibraryFile())
             .addKeepMainRule(Executor.class)
             .addInnerClasses(RetargetOverrideTest.class)
             .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/SimpleStreamTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/SimpleStreamTest.java
index 60fb964..ffd4166 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/SimpleStreamTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/SimpleStreamTest.java
@@ -5,8 +5,6 @@
 package com.android.tools.r8.desugar.desugaredlibrary;
 
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.StringUtils;
 import java.util.ArrayList;
@@ -40,7 +38,7 @@
   public void testStreamD8() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addInnerClasses(SimpleStreamTest.class)
         .setMinApi(parameters.getApiLevel())
         .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -58,7 +56,7 @@
   public void testStreamR8() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForR8(Backend.DEX)
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addInnerClasses(SimpleStreamTest.class)
         .setMinApi(parameters.getApiLevel())
         .addKeepClassAndMembersRules(Executor.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/SpliteratorTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/SpliteratorTest.java
index 28387d4..1fc77de 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/SpliteratorTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/SpliteratorTest.java
@@ -8,8 +8,6 @@
 
 import com.android.tools.r8.LibraryDesugaringTestConfiguration;
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import java.util.ArrayList;
@@ -52,7 +50,7 @@
   public void testSpliterator() throws Exception {
     Assume.assumeTrue(requiresEmulatedInterfaceCoreLibDesugaring(parameters));
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addInnerClasses(SpliteratorTest.class)
         .setMinApi(parameters.getApiLevel())
         .enableCoreLibraryDesugaring(
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/StaticInterfaceMethodTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/StaticInterfaceMethodTest.java
index 9c06716..f36ae99 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/StaticInterfaceMethodTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/StaticInterfaceMethodTest.java
@@ -7,8 +7,6 @@
 import static org.junit.Assert.assertEquals;
 
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.StringUtils;
 import java.nio.file.Path;
@@ -52,7 +50,7 @@
     }
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addInnerClasses(StaticInterfaceMethodTest.class)
         .setMinApi(parameters.getApiLevel())
         .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -112,7 +110,7 @@
     Assume.assumeFalse(parameters.isCfRuntime());
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForR8(parameters.getBackend())
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addKeepMainRule(Executor.class)
         .addInnerClasses(StaticInterfaceMethodTest.class)
         .setMinApi(parameters.getApiLevel())
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/SynchronizedCollectionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/SynchronizedCollectionTest.java
index feaa98a..025740b 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/SynchronizedCollectionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/SynchronizedCollectionTest.java
@@ -7,7 +7,6 @@
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestRuntime.CfVm;
 import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.StringUtils;
 import java.nio.file.Path;
@@ -58,7 +57,7 @@
     }
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addProgramFiles(INPUT_JAR)
         .setMinApi(parameters.getApiLevel())
         .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -79,7 +78,7 @@
     Assume.assumeFalse(parameters.isCfRuntime());
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForR8(parameters.getBackend())
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addProgramFiles(INPUT_JAR)
         .addKeepMainRule(MAIN_CLASS)
         .setMinApi(parameters.getApiLevel())
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/APIConversionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/APIConversionTest.java
index 3a864c2..4da71b0 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/APIConversionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/APIConversionTest.java
@@ -7,7 +7,6 @@
 import static org.hamcrest.core.StringContains.containsString;
 
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
@@ -64,7 +63,7 @@
   public void testAPIConversionDesugaringD8() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addInnerClasses(APIConversionTest.class)
         .setMinApi(parameters.getApiLevel())
         .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/AccessModeConversionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/AccessModeConversionTest.java
new file mode 100644
index 0000000..10a563d
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/AccessModeConversionTest.java
@@ -0,0 +1,131 @@
+// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.desugar.desugaredlibrary.conversiontests;
+
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
+import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibraryConfiguration;
+import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import com.android.tools.r8.utils.BooleanUtils;
+import com.android.tools.r8.utils.InternalOptions;
+import com.android.tools.r8.utils.StringUtils;
+import java.nio.file.AccessMode;
+import java.nio.file.Path;
+import java.util.List;
+import org.junit.Assume;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class AccessModeConversionTest extends DesugaredLibraryTestBase {
+
+  private final TestParameters parameters;
+  private final boolean shrinkDesugaredLibrary;
+
+  private static final AndroidApiLevel MIN_SUPPORTED = AndroidApiLevel.O;
+  private static final String EXPECTED_RESULT = StringUtils.lines("WRITE", "WRITE");
+
+  private static Path CUSTOM_LIB;
+
+  @Parameters(name = "{0}, shrinkDesugaredLibrary: {1}")
+  public static List<Object[]> data() {
+    return buildParameters(
+        getConversionParametersUpToExcluding(MIN_SUPPORTED), BooleanUtils.values());
+  }
+
+  public AccessModeConversionTest(TestParameters parameters, boolean shrinkDesugaredLibrary) {
+    this.shrinkDesugaredLibrary = shrinkDesugaredLibrary;
+    this.parameters = parameters;
+  }
+
+  @BeforeClass
+  public static void compileCustomLib() throws Exception {
+    CUSTOM_LIB =
+        testForD8(getStaticTemp())
+            .addProgramClasses(CustomLibClass.class)
+            .setMinApi(MIN_SUPPORTED)
+            .compile()
+            .writeToZip();
+  }
+
+  private void configureDesugaredLibrary(InternalOptions options) {
+    options.desugaredLibraryConfiguration =
+        DesugaredLibraryConfiguration.builder(
+                options.itemFactory, options.reporter, Origin.unknown())
+            .putRewritePrefix("java.nio.file.AccessMode", "j$.nio.file.AccessMode")
+            .addWrapperConversion("java.nio.file.AccessMode")
+            .build();
+  }
+
+  @Test
+  public void testD8() throws Exception {
+    Assume.assumeTrue(false);
+    KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
+    testForD8()
+        .addLibraryFiles(getLibraryFile())
+        .setMinApi(parameters.getApiLevel())
+        .addProgramClasses(Executor.class)
+        .addLibraryClasses(CustomLibClass.class)
+        .addOptionsModification(this::configureDesugaredLibrary)
+        .compile()
+        .addDesugaredCoreLibraryRunClassPath(
+            this::buildDesugaredLibrary,
+            parameters.getApiLevel(),
+            keepRuleConsumer.get(),
+            shrinkDesugaredLibrary)
+        .addRunClasspathFiles(CUSTOM_LIB)
+        .run(parameters.getRuntime(), Executor.class)
+        .assertSuccessWithOutput(EXPECTED_RESULT);
+  }
+
+  @Test
+  public void testR8() throws Exception {
+    Assume.assumeTrue(false);
+    KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
+    testForR8(parameters.getBackend())
+        .addLibraryFiles(getLibraryFile())
+        .setMinApi(parameters.getApiLevel())
+        .addKeepMainRule(Executor.class)
+        .addProgramClasses(Executor.class)
+        .addLibraryClasses(CustomLibClass.class)
+        .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
+        .addOptionsModification(this::configureDesugaredLibrary)
+        .compile()
+        .addDesugaredCoreLibraryRunClassPath(
+            this::buildDesugaredLibrary,
+            parameters.getApiLevel(),
+            keepRuleConsumer.get(),
+            shrinkDesugaredLibrary)
+        .addRunClasspathFiles(CUSTOM_LIB)
+        .run(parameters.getRuntime(), Executor.class)
+        .assertSuccessWithOutput(EXPECTED_RESULT);
+  }
+
+  static class Executor {
+
+    public static void main(String[] args) {
+      System.out.println(CustomLibClass.get(AccessMode.READ));
+      System.out.println(CustomLibClass.get(new AccessMode[] {AccessMode.READ})[0]);
+    }
+  }
+
+  // This class will be put at compilation time as library and on the runtime class path.
+  // This class is convenient for easy testing. Each method plays the role of methods in the
+  // platform APIs for which argument/return values need conversion.
+  static class CustomLibClass {
+
+    public static AccessMode get(AccessMode mode) {
+      return AccessMode.WRITE;
+    }
+
+    public static AccessMode[] get(AccessMode[] modes) {
+      return new AccessMode[] {AccessMode.WRITE};
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/AllOptionalConversionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/AllOptionalConversionTest.java
index e301fd1..87720a2 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/AllOptionalConversionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/AllOptionalConversionTest.java
@@ -5,7 +5,6 @@
 package com.android.tools.r8.desugar.desugaredlibrary.conversiontests;
 
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
@@ -65,7 +64,7 @@
   public void testRewrittenAPICallsD8() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .setMinApi(parameters.getApiLevel())
         .addProgramClasses(Executor.class)
         .addLibraryClasses(CustomLibClass.class)
@@ -85,7 +84,7 @@
   public void testRewrittenAPICallsR8() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForR8(parameters.getBackend())
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .setMinApi(parameters.getApiLevel())
         .addKeepMainRule(Executor.class)
         .addProgramClasses(Executor.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/AllTimeConversionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/AllTimeConversionTest.java
index 143f18b..1c2cdf9 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/AllTimeConversionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/AllTimeConversionTest.java
@@ -10,7 +10,6 @@
 import com.android.tools.r8.Diagnostic;
 import com.android.tools.r8.TestDiagnosticMessages;
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
@@ -73,7 +72,7 @@
   public void testRewrittenAPICallsD8() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .setMinApi(parameters.getApiLevel())
         .addProgramClasses(Executor.class)
         .addLibraryClasses(CustomLibClass.class)
@@ -95,7 +94,7 @@
   public void testRewrittenAPICallsR8() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForR8(parameters.getBackend())
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .setMinApi(parameters.getApiLevel())
         .addKeepMainRule(Executor.class)
         .addProgramClasses(Executor.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/BasicLongDoubleConversionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/BasicLongDoubleConversionTest.java
index 3c0ad88..5503e13 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/BasicLongDoubleConversionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/BasicLongDoubleConversionTest.java
@@ -5,7 +5,6 @@
 package com.android.tools.r8.desugar.desugaredlibrary.conversiontests;
 
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
@@ -58,7 +57,7 @@
   public void testRewrittenAPICallsD8() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .setMinApi(parameters.getApiLevel())
         .addProgramClasses(Executor.class)
         .addLibraryClasses(CustomLibClass.class)
@@ -78,7 +77,7 @@
   public void testRewrittenAPICallsR8() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForR8(parameters.getBackend())
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .setMinApi(parameters.getApiLevel())
         .addProgramClasses(Executor.class)
         .addKeepMainRule(Executor.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/CallBackConversionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/CallBackConversionTest.java
index bf148dc..1e09850 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/CallBackConversionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/CallBackConversionTest.java
@@ -9,7 +9,6 @@
 
 import com.android.tools.r8.LibraryDesugaringTestConfiguration.AbsentKeepRuleConsumer;
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
@@ -89,7 +88,7 @@
   public void testCallBack() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .setMinApi(parameters.getApiLevel())
         .addProgramClasses(Impl.class)
         .addLibraryClasses(CustomLibClass.class)
@@ -111,7 +110,7 @@
     // Use D8 to desugar with Java classfile output.
     Path firstJar =
         testForD8(Backend.CF)
-            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+            .addLibraryFiles(getLibraryFile())
             .setMinApi(parameters.getApiLevel())
             .addProgramClasses(Impl.class)
             .addLibraryClasses(CustomLibClass.class)
@@ -131,7 +130,7 @@
     // Use D8 to desugar with Java classfile output.
     Path secondJar =
         testForD8(Backend.CF)
-            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+            .addLibraryFiles(getLibraryFile())
             .addOptionsModification(
                 options -> options.desugarSpecificOptions().allowAllDesugaredInput = true)
             .setMinApi(parameters.getApiLevel())
@@ -152,7 +151,7 @@
 
     // Convert to DEX without desugaring and run.
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addProgramFiles(firstJar)
         .setMinApi(parameters.getApiLevel())
         .disableDesugaring()
@@ -173,7 +172,7 @@
   public void testCallBackR8() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForR8(Backend.DEX)
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addKeepMainRule(Impl.class)
         .noMinification()
         .setMinApi(parameters.getApiLevel())
@@ -192,7 +191,7 @@
   public void testCallBackR8Minifying() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForR8(Backend.DEX)
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addKeepMainRule(Impl.class)
         .setMinApi(parameters.getApiLevel())
         .addProgramClasses(Impl.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ClockAPIConversionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ClockAPIConversionTest.java
index 37ed786..724886c 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ClockAPIConversionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ClockAPIConversionTest.java
@@ -5,7 +5,6 @@
 package com.android.tools.r8.desugar.desugaredlibrary.conversiontests;
 
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
@@ -53,7 +52,7 @@
   public void testClockD8() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .setMinApi(parameters.getApiLevel())
         .addProgramClasses(Executor.class)
         .addLibraryClasses(CustomLibClass.class)
@@ -74,7 +73,7 @@
   public void testClockR8() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForR8(parameters.getBackend())
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addKeepMainRule(Executor.class)
         .setMinApi(parameters.getApiLevel())
         .addProgramClasses(Executor.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionAndMergeTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionAndMergeTest.java
index 7341aae..f04504a 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionAndMergeTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionAndMergeTest.java
@@ -7,7 +7,6 @@
 import com.android.tools.r8.LibraryDesugaringTestConfiguration;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
@@ -39,7 +38,7 @@
     Path extra = buildClass(ExtraClass.class);
     Path convClass = buildClass(APIConversionClass.class);
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .setMinApi(parameters.getApiLevel())
         .addProgramFiles(extra, convClass)
         .enableCoreLibraryDesugaring(
@@ -51,7 +50,7 @@
 
   private Path buildClass(Class<?> cls) throws Exception {
     return testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .setMinApi(parameters.getApiLevel())
         .addProgramClasses(cls)
         .enableCoreLibraryDesugaring(
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionErrorMessageTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionErrorMessageTest.java
index 043e0ff..4002646 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionErrorMessageTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionErrorMessageTest.java
@@ -7,7 +7,6 @@
 import com.android.tools.r8.LibraryDesugaringTestConfiguration;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
@@ -77,7 +76,7 @@
     //  NoSuchMethodError instead of NoClassDefFoundError on the wrapper.
     Assume.assumeTrue(hasRequiredAPI());
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addProgramClasses(Executor.class, MyIntUnaryOperator.class)
         .setMinApi(parameters.getApiLevel())
         .enableCoreLibraryDesugaring(
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionIntroduceInterfaceMethodTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionIntroduceInterfaceMethodTest.java
index 254ef6d..a205079 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionIntroduceInterfaceMethodTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionIntroduceInterfaceMethodTest.java
@@ -9,7 +9,6 @@
 import static org.junit.Assert.assertTrue;
 
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
@@ -80,7 +79,7 @@
   public void testNoInterfaceMethodsD8() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .setMinApi(parameters.getApiLevel())
         .addProgramClasses(MyCollectionInterface.class, MyCollection.class, Executor.class)
         .addLibraryClasses(CustomLibClass.class)
@@ -144,7 +143,7 @@
   public void testNoInterfaceMethodsR8() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForR8(parameters.getBackend())
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .setMinApi(parameters.getApiLevel())
         .addProgramClasses(MyCollectionInterface.class, MyCollection.class, Executor.class)
         .addKeepMainRule(Executor.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionsPresentTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionsPresentTest.java
index 3fe90f3..a045372 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionsPresentTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionsPresentTest.java
@@ -45,7 +45,7 @@
     Path desugaredLib = temp.newFolder().toPath().resolve("conversion_dex.zip");
     L8Command.Builder l8Builder =
         L8Command.builder(diagnosticsHandler)
-            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+            .addLibraryFiles(getLibraryFile())
             .addProgramFiles(ToolHelper.DESUGAR_LIB_CONVERSIONS)
             .addDesugaredLibraryConfiguration(
                 StringResource.fromFile(ToolHelper.getDesugarLibJsonForTesting()))
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/DuplicateAPIDesugaredLibTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/DuplicateAPIDesugaredLibTest.java
index 86bd652..1fa4a7c 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/DuplicateAPIDesugaredLibTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/DuplicateAPIDesugaredLibTest.java
@@ -9,7 +9,6 @@
 import com.android.tools.r8.LibraryDesugaringTestConfiguration;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestRuntime.DexRuntime;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.DexVm;
 import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
 import com.android.tools.r8.utils.AndroidApiLevel;
@@ -56,7 +55,7 @@
               .writeToZip();
       String stdOut =
           testForD8()
-              .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+              .addLibraryFiles(getLibraryFile())
               .setMinApi(AndroidApiLevel.B)
               .addProgramClasses(Executor.class)
               .addLibraryClasses(CustomLibClass.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/DuplicateAPIProgramTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/DuplicateAPIProgramTest.java
index 38b7c3f..d9a57e9 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/DuplicateAPIProgramTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/DuplicateAPIProgramTest.java
@@ -7,7 +7,6 @@
 import static junit.framework.TestCase.assertEquals;
 
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
@@ -57,7 +56,7 @@
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     String stdOut =
         testForD8()
-            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+            .addLibraryFiles(getLibraryFile())
             .setMinApi(parameters.getApiLevel())
             .addProgramClasses(Executor.class, MyMap.class)
             .addLibraryClasses(CustomLibClass.class)
@@ -81,7 +80,7 @@
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     String stdOut =
         testForR8(parameters.getBackend())
-            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+            .addLibraryFiles(getLibraryFile())
             .setMinApi(parameters.getApiLevel())
             .addKeepMainRule(Executor.class)
             .addProgramClasses(Executor.class, MyMap.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/FunctionConversionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/FunctionConversionTest.java
index 5800cf5..9cdb56e 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/FunctionConversionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/FunctionConversionTest.java
@@ -7,7 +7,6 @@
 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.DesugaredLibraryTestBase;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
@@ -65,7 +64,7 @@
   public void testFunctionCompositionD8() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .setMinApi(parameters.getApiLevel())
         .addProgramClasses(
             Executor.class, Executor.Object1.class, Executor.Object2.class, Executor.Object3.class)
@@ -88,7 +87,7 @@
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     Path jar =
         testForD8(Backend.CF)
-            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+            .addLibraryFiles(getLibraryFile())
             .setMinApi(parameters.getApiLevel())
             .addProgramClasses(
                 Executor.class,
@@ -134,7 +133,7 @@
   public void testFunctionCompositionR8() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForR8(parameters.getBackend())
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .setMinApi(parameters.getApiLevel())
         .addKeepMainRule(Executor.class)
         .addProgramClasses(
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/MoreFunctionConversionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/MoreFunctionConversionTest.java
index ba7f28d..4800500 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/MoreFunctionConversionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/MoreFunctionConversionTest.java
@@ -8,7 +8,6 @@
 
 import com.android.tools.r8.D8TestCompileResult;
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
@@ -61,7 +60,7 @@
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     D8TestCompileResult compileResult =
         testForD8()
-            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+            .addLibraryFiles(getLibraryFile())
             .setMinApi(parameters.getApiLevel())
             .addProgramClasses(Executor.class)
             .addLibraryClasses(CustomLibClass.class)
@@ -84,7 +83,7 @@
   public void testFunctionR8() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForR8(parameters.getBackend())
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .setMinApi(parameters.getApiLevel())
         .addProgramClasses(Executor.class)
         .addKeepMainRule(Executor.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/SummaryStatisticsConversionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/SummaryStatisticsConversionTest.java
index 4d5f8d1..762a86e 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/SummaryStatisticsConversionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/SummaryStatisticsConversionTest.java
@@ -5,7 +5,6 @@
 package com.android.tools.r8.desugar.desugaredlibrary.conversiontests;
 
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
@@ -69,7 +68,7 @@
   public void testStatsD8() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .setMinApi(parameters.getApiLevel())
         .addProgramClasses(Executor.class)
         .addLibraryClasses(CustomLibClass.class)
@@ -89,7 +88,7 @@
   public void testStatsR8() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForR8(parameters.getBackend())
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .setMinApi(parameters.getApiLevel())
         .addProgramClasses(Executor.class)
         .addKeepMainRule(Executor.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/SuperAPIConversionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/SuperAPIConversionTest.java
index 657115c..3224879 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/SuperAPIConversionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/SuperAPIConversionTest.java
@@ -4,7 +4,6 @@
 package com.android.tools.r8.desugar.desugaredlibrary.conversiontests;
 
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
@@ -66,7 +65,7 @@
     Assume.assumeFalse("TODO(b/189435770): fix", shrinkDesugaredLibrary);
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addProgramClasses(Executor.class, ParallelRandom.class)
         .setMinApi(parameters.getApiLevel())
         .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -85,7 +84,7 @@
     Assume.assumeFalse("TODO(b/189435770): fix", shrinkDesugaredLibrary);
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForR8(parameters.getBackend())
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addProgramClasses(Executor.class, ParallelRandom.class)
         .setMinApi(parameters.getApiLevel())
         .addKeepMainRule(Executor.class)
@@ -105,7 +104,7 @@
     Assume.assumeFalse("TODO(b/189435770): fix", shrinkDesugaredLibrary);
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addLibraryClasses(CustomLibClass.class)
         .addProgramClasses(ExecutorB192351030.class, A.class, B.class, C.class)
         .setMinApi(parameters.getApiLevel())
@@ -126,7 +125,7 @@
     Assume.assumeFalse("TODO(b/189435770): fix", shrinkDesugaredLibrary);
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForR8(parameters.getBackend())
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addLibraryClasses(CustomLibClass.class)
         .addProgramClasses(ExecutorB192351030.class, A.class, B.class, C.class)
         .setMinApi(parameters.getApiLevel())
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/TryCatchTimeConversionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/TryCatchTimeConversionTest.java
index b7c33c4..a669527 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/TryCatchTimeConversionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/TryCatchTimeConversionTest.java
@@ -5,7 +5,6 @@
 package com.android.tools.r8.desugar.desugaredlibrary.conversiontests;
 
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
@@ -75,7 +74,7 @@
   public void testBaselineR8() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForR8(parameters.getBackend())
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .setMinApi(parameters.getApiLevel())
         .addProgramClasses(BaselineExecutor.class)
         .addKeepMainRule(BaselineExecutor.class)
@@ -115,7 +114,7 @@
   public void testTryCatchR8() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForR8(parameters.getBackend())
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .setMinApi(parameters.getApiLevel())
         .addProgramClasses(TryCatchExecutor.class)
         .addKeepMainRule(TryCatchExecutor.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/UnwrapConversionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/UnwrapConversionTest.java
index ed2db6a..888400d 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/UnwrapConversionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/UnwrapConversionTest.java
@@ -5,7 +5,6 @@
 package com.android.tools.r8.desugar.desugaredlibrary.conversiontests;
 
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
@@ -54,7 +53,7 @@
   public void testUnwrapD8() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .setMinApi(parameters.getApiLevel())
         .addProgramClasses(Executor.class)
         .addLibraryClasses(CustomLibClass.class)
@@ -74,7 +73,7 @@
   public void testUnwrapR8() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForR8(parameters.getBackend())
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .setMinApi(parameters.getApiLevel())
         .addProgramClasses(Executor.class)
         .addKeepMainRule(Executor.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/WrapperPlacementTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/WrapperPlacementTest.java
index c4d2370..bda8534 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/WrapperPlacementTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/WrapperPlacementTest.java
@@ -11,7 +11,6 @@
 import com.android.tools.r8.LibraryDesugaringTestConfiguration;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
 import com.android.tools.r8.synthesis.SyntheticItemsTestUtils;
 import com.android.tools.r8.testing.AndroidBuildVersion;
@@ -63,7 +62,7 @@
     Path path1 = compileWithCoreLibraryDesugaring(MyArrays1.class);
     Path path2 = compileWithCoreLibraryDesugaring(MyArrays2.class);
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addProgramClasses(TestClass.class)
         .addAndroidBuildVersion()
         .enableCoreLibraryDesugaring(
@@ -90,7 +89,7 @@
 
   private Path compileWithCoreLibraryDesugaring(Class<?> clazz) throws Exception {
     return testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addProgramClassesAndInnerClasses(clazz)
         .setMinApi(parameters.getApiLevel())
         .enableCoreLibraryDesugaring(
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/ConcurrentHashMapFileSerializationTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/ConcurrentHashMapFileSerializationTest.java
index 5c1e73d..9fad03e 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/ConcurrentHashMapFileSerializationTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/ConcurrentHashMapFileSerializationTest.java
@@ -5,10 +5,8 @@
 package com.android.tools.r8.desugar.desugaredlibrary.gson;
 
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.DexVm.Version;
 import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.StringUtils;
 import java.io.File;
@@ -54,7 +52,7 @@
   public void testMapSerializationD8() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addInnerClasses(ConcurrentHashMapFileSerializationTest.class)
         .setMinApi(parameters.getApiLevel())
         .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -74,7 +72,7 @@
   public void testMapSerializationR8() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForR8(Backend.DEX)
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addInnerClasses(ConcurrentHashMapFileSerializationTest.class)
         .addKeepMainRule(Executor.class)
         .noMinification()
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/GetGenericInterfaceTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/GetGenericInterfaceTest.java
index fd1b30b..34c5fd8 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/GetGenericInterfaceTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/GetGenericInterfaceTest.java
@@ -8,9 +8,7 @@
 import static org.junit.Assert.assertTrue;
 
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
 import dalvik.system.PathClassLoader;
 import java.sql.SQLDataException;
@@ -53,7 +51,7 @@
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     String stdOut =
         testForD8()
-            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+            .addLibraryFiles(getLibraryFile())
             .addInnerClasses(GetGenericInterfaceTest.class)
             .setMinApi(parameters.getApiLevel())
             .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -74,7 +72,7 @@
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     String stdOut =
         testForR8(Backend.DEX)
-            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+            .addLibraryFiles(getLibraryFile())
             .addInnerClasses(GetGenericInterfaceTest.class)
             .addKeepMainRule(Executor.class)
             .noMinification()
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/GsonAllMapsTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/GsonAllMapsTest.java
index a6a460d..3755fea 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/GsonAllMapsTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/GsonAllMapsTest.java
@@ -4,8 +4,6 @@
 package com.android.tools.r8.desugar.desugaredlibrary.gson;
 
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
 import java.util.List;
 import org.junit.Assume;
@@ -40,7 +38,7 @@
     Assume.assumeTrue(requiresEmulatedInterfaceCoreLibDesugaring(parameters));
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForD8(parameters.getBackend())
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addProgramClassesAndInnerClasses(AllMapsTestClass.class)
         .addProgramFiles(GSON_2_8_1_JAR)
         .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -60,7 +58,7 @@
     Assume.assumeTrue(requiresEmulatedInterfaceCoreLibDesugaring(parameters));
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForR8(parameters.getBackend())
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addProgramClassesAndInnerClasses(AllMapsTestClass.class)
         .addProgramFiles(GSON_2_8_1_JAR)
         .addKeepMainRule(AllMapsTestClass.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/GsonEnumTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/GsonEnumTest.java
index 584c3f3..515a99c 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/GsonEnumTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/GsonEnumTest.java
@@ -5,9 +5,7 @@
 package com.android.tools.r8.desugar.desugaredlibrary.gson;
 
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
 import java.lang.reflect.Field;
 import java.time.chrono.IsoEra;
@@ -38,7 +36,7 @@
   public void testCustomCollectionD8() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addInnerClasses(GsonEnumTest.class)
         .setMinApi(parameters.getApiLevel())
         .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -56,7 +54,7 @@
   public void testCustomCollectionR8() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForR8(Backend.DEX)
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addInnerClasses(GsonEnumTest.class)
         .addKeepMainRule(Executor.class)
         .noMinification()
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/GsonOptionalTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/GsonOptionalTest.java
index 39c6644..692e53f 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/GsonOptionalTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/GsonOptionalTest.java
@@ -4,8 +4,6 @@
 package com.android.tools.r8.desugar.desugaredlibrary.gson;
 
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
 import java.util.List;
 import org.junit.Assume;
@@ -34,7 +32,7 @@
     Assume.assumeTrue(requiresEmulatedInterfaceCoreLibDesugaring(parameters));
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForD8(parameters.getBackend())
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addProgramClassesAndInnerClasses(OptionalTestClass.class)
         .addProgramFiles(GSON_2_8_1_JAR)
         .addOptionsModification(opt -> opt.ignoreMissingClasses = true)
@@ -55,7 +53,7 @@
     Assume.assumeTrue(requiresEmulatedInterfaceCoreLibDesugaring(parameters));
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForR8(parameters.getBackend())
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addProgramClassesAndInnerClasses(OptionalTestClass.class)
         .addProgramFiles(GSON_2_8_1_JAR)
         .addKeepMainRule(OptionalTestClass.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/MyMapFileSerializationTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/MyMapFileSerializationTest.java
index 01c1b44..a137caf 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/MyMapFileSerializationTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/MyMapFileSerializationTest.java
@@ -5,10 +5,8 @@
 package com.android.tools.r8.desugar.desugaredlibrary.gson;
 
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.DexVm.Version;
 import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.StringUtils;
 import java.io.File;
@@ -52,7 +50,7 @@
   public void testMapSerializationD8() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addInnerClasses(MyMapFileSerializationTest.class)
         .setMinApi(parameters.getApiLevel())
         .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -72,7 +70,7 @@
   public void testMapSerializationR8() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForR8(Backend.DEX)
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addInnerClasses(MyMapFileSerializationTest.class)
         .addKeepMainRule(Executor.class)
         .noMinification()
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/ConcurrentHashMapJDK11Test.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/ConcurrentHashMapJDK11Test.java
index 434f2b8..52e6731 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/ConcurrentHashMapJDK11Test.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/ConcurrentHashMapJDK11Test.java
@@ -5,10 +5,8 @@
 package com.android.tools.r8.desugar.desugaredlibrary.jdk11;
 
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.DexVm.Version;
 import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.StringUtils;
 import java.util.List;
@@ -47,7 +45,7 @@
         parameters.getDexRuntimeVersion().isEqualTo(Version.V4_0_4));
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForD8(parameters.getBackend())
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addInnerClasses(ConcurrentHashMapJDK11Test.class)
         .setMinApi(parameters.getApiLevel())
         .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -69,7 +67,7 @@
         parameters.getDexRuntimeVersion().isEqualTo(Version.V4_0_4));
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForR8(Backend.DEX)
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addInnerClasses(ConcurrentHashMapJDK11Test.class)
         .setMinApi(parameters.getApiLevel())
         .addKeepMainRule(TestClass.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/DesugaredLibraryJDK11Undesugarer.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/DesugaredLibraryJDK11Undesugarer.java
index bdda327..6e9d7ca 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/DesugaredLibraryJDK11Undesugarer.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/DesugaredLibraryJDK11Undesugarer.java
@@ -25,10 +25,17 @@
 
 public class DesugaredLibraryJDK11Undesugarer extends DesugaredLibraryTestBase {
 
-  private static Map<String, String> ownerMap =
-      ImmutableMap.of(
-          "java/io/DesugarBufferedReader", "java/io/BufferedReader",
-          "java/io/DesugarInputStream", "java/io/InputStream");
+  private static final Map<String, String> ownerMap =
+      ImmutableMap.<String, String>builder()
+          .put("java/util/DesugarTimeZone", "java/util/TimeZone")
+          .put("java/lang/DesugarLong", "java/lang/Long")
+          .put("java/lang/DesugarInteger", "java/lang/Integer")
+          .put("java/lang/DesugarDouble", "java/lang/Double")
+          .put("java/util/DesugarArrays", "java/util/Arrays")
+          .put("java/lang/DesugarMath", "java/lang/Math")
+          .put("java/io/DesugarBufferedReader", "java/io/BufferedReader")
+          .put("java/io/DesugarInputStream", "java/io/InputStream")
+          .build();
 
   public static void main(String[] args) throws Exception {
     setUpDesugaredLibrary();
@@ -37,10 +44,17 @@
 
   public static Path undesugaredJar() {
     if (!isJDK11DesugaredLibrary()) {
-      return ToolHelper.getDesugarJDKLibs();
+      return ToolHelper.getDesugarJDKLibsBazelGeneratedFile();
     }
     Path desugaredLibJDK11Undesugared = Paths.get("build/libs/desugar_jdk_libs_11_undesugared.jar");
     if (Files.exists(desugaredLibJDK11Undesugared)) {
+        return desugaredLibJDK11Undesugared;
+    }
+    return generateUndesugaredJar(desugaredLibJDK11Undesugared);
+  }
+
+  private static synchronized Path generateUndesugaredJar(Path desugaredLibJDK11Undesugared) {
+    if (Files.exists(desugaredLibJDK11Undesugared)) {
       return desugaredLibJDK11Undesugared;
     }
     OpenOption[] options =
@@ -49,7 +63,8 @@
         new ZipOutputStream(
             new BufferedOutputStream(
                 Files.newOutputStream(desugaredLibJDK11Undesugared, options)))) {
-      new DesugaredLibraryJDK11Undesugarer().undesugar(ToolHelper.getDesugarJDKLibs(), out);
+      new DesugaredLibraryJDK11Undesugarer()
+          .undesugar(ToolHelper.getDesugarJDKLibsBazelGeneratedFile(), out);
     } catch (IOException e) {
       throw new RuntimeException(e);
     }
@@ -82,25 +97,29 @@
       public void visitMethodInsn(
           int opcode, String owner, String name, String descriptor, boolean isInterface) {
         if (opcode == Opcodes.INVOKESTATIC) {
-          for (String ownerToRewrite : ownerMap.keySet()) {
-            if (ownerToRewrite.equals(owner)) {
-              super.visitMethodInsn(
-                  Opcodes.INVOKEVIRTUAL,
-                  ownerMap.get(owner),
-                  name,
-                  withoutFirstObjectArg(descriptor),
-                  isInterface);
-              return;
+          if (ownerMap.containsKey(owner)) {
+            String nonDesugaredType = ownerMap.get(owner);
+            int firstTypeEnd = descriptor.indexOf(";");
+            int firstTypeStart = descriptor.indexOf("L");
+            String firstArg =
+                firstTypeEnd == -1
+                    ? "NoFirstType"
+                    : descriptor.substring(firstTypeStart + 1, firstTypeEnd);
+            int newOpcode;
+            String newDescriptor;
+            if (firstArg.equals(nonDesugaredType)) {
+              newOpcode = Opcodes.INVOKEVIRTUAL;
+              newDescriptor = "(" + descriptor.substring(firstTypeEnd + 1);
+            } else {
+              newOpcode = Opcodes.INVOKESTATIC;
+              newDescriptor = descriptor;
             }
+            super.visitMethodInsn(newOpcode, nonDesugaredType, name, newDescriptor, isInterface);
+            return;
           }
         }
         super.visitMethodInsn(opcode, owner, name, descriptor, isInterface);
       }
     };
   }
-
-  private String withoutFirstObjectArg(String descriptor) {
-    int i = descriptor.indexOf(";");
-    return "(" + descriptor.substring(i + 1);
-  }
 }
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/DurationJDK11Test.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/DurationJDK11Test.java
index 7f76531..d95f9c8 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/DurationJDK11Test.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/DurationJDK11Test.java
@@ -5,7 +5,6 @@
 package com.android.tools.r8.desugar.desugaredlibrary.jdk11;
 
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
 import com.android.tools.r8.transformers.MethodTransformer;
 import com.android.tools.r8.utils.AndroidApiLevel;
@@ -51,7 +50,7 @@
             && parameters.getApiLevel().getLevel() < AndroidApiLevel.S.getLevel());
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForD8(parameters.getBackend())
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addProgramClassFileData(getProgramClassFileData())
         .setMinApi(parameters.getApiLevel())
         .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -74,7 +73,7 @@
             && parameters.getApiLevel().getLevel() < AndroidApiLevel.S.getLevel());
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForR8(Backend.DEX)
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addProgramClassFileData(getProgramClassFileData())
         .setMinApi(parameters.getApiLevel())
         .addKeepMainRule(TestClass.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/StandardCharsetTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/StandardCharsetTest.java
index 368d169..1b9581a 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/StandardCharsetTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/StandardCharsetTest.java
@@ -5,10 +5,8 @@
 package com.android.tools.r8.desugar.desugaredlibrary.jdk11;
 
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
 import com.android.tools.r8.transformers.MethodTransformer;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.StringUtils;
 import com.google.common.collect.ImmutableList;
@@ -49,7 +47,7 @@
     Assume.assumeTrue(isJDK11DesugaredLibrary());
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForD8(parameters.getBackend())
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addProgramClassFileData(getProgramClassFileData())
         .setMinApi(parameters.getApiLevel())
         .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -68,7 +66,7 @@
     Assume.assumeTrue(isJDK11DesugaredLibrary());
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForR8(Backend.DEX)
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addProgramClassFileData(getProgramClassFileData())
         .setMinApi(parameters.getApiLevel())
         .addKeepMainRule(TestClass.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11AtomicTests.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11AtomicTests.java
index e1849dc..49dc57e 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11AtomicTests.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11AtomicTests.java
@@ -13,7 +13,6 @@
 import com.android.tools.r8.TestRuntime;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.DexVm.Version;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.StringUtils;
 import java.nio.file.Path;
@@ -76,7 +75,7 @@
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     String verbosity = "2";
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addProgramFiles(
             ATOMIC_COMPILED_TESTS_FOLDER.resolve(ATOMIC_REFERENCE_TEST + CLASS_EXTENSION))
         .addProgramFiles(testNGSupportProgramFiles())
@@ -100,7 +99,7 @@
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     String verbosity = "2";
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addProgramFiles(
             getAllFilesWithSuffixInDirectory(ATOMIC_COMPILED_TESTS_FOLDER, CLASS_EXTENSION))
         .addProgramFiles(testNGSupportProgramFiles())
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11ConcurrentMapTests.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11ConcurrentMapTests.java
index 9123915..2740c2f 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11ConcurrentMapTests.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11ConcurrentMapTests.java
@@ -14,7 +14,6 @@
 import com.android.tools.r8.TestRuntime;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.DexVm.Version;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.StringUtils;
 import java.nio.file.Path;
@@ -110,7 +109,7 @@
         .addProgramFiles(getPathsFiles())
         .setMinApi(parameters.getApiLevel())
         .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .compile()
         .withArt6Plus64BitsLib()
         .addDesugaredCoreLibraryRunClassPath(
@@ -163,7 +162,7 @@
     String verbosity = "2";
     D8TestCompileResult d8TestCompileResult =
         testForD8()
-            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+            .addLibraryFiles(getLibraryFile())
             .addProgramFiles(concurrentHashTestToCompile())
             .addProgramFiles(testNGSupportProgramFiles())
             .addProgramFiles(getPathsFiles())
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11StreamTests.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11StreamTests.java
index 355343d..606f253 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11StreamTests.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11StreamTests.java
@@ -263,7 +263,7 @@
               .addProgramFiles(getSafeVarArgsFile())
               .addProgramFiles(testNGSupportProgramFiles())
               .addOptionsModification(opt -> opt.testing.trackDesugaredAPIConversions = true)
-              .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+              .addLibraryFiles(getLibraryFile())
               .setMinApi(parameters.getApiLevel())
               .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
               .allowStdoutMessages()
@@ -296,7 +296,7 @@
           .addProgramFiles(getSafeVarArgsFile())
           .addProgramFiles(testNGSupportProgramFiles())
           .addOptionsModification(opt -> opt.testing.trackDesugaredAPIConversions = true)
-          .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+          .addLibraryFiles(getLibraryFile())
           .setMinApi(parameters.getApiLevel())
           .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
           .compile()
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11TimeTests.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11TimeTests.java
index a0a51c0..1928523 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11TimeTests.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11TimeTests.java
@@ -201,7 +201,7 @@
     String verbosity = "2";
     D8TestCompileResult compileResult =
         testForD8()
-            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+            .addLibraryFiles(getLibraryFile())
             .addProgramFiles(getPathsFiles())
             .addProgramFiles(JDK_11_TIME_TEST_COMPILED_FILES)
             .addProgramFiles(Paths.get(JDK_TESTS_BUILD_DIR + "testng-6.10.jar"))
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/kotlin/KotlinMetadataTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/kotlin/KotlinMetadataTest.java
index b0c3032..27e9882 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/kotlin/KotlinMetadataTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/kotlin/KotlinMetadataTest.java
@@ -29,7 +29,6 @@
 import com.android.tools.r8.kotlin.KotlinMetadataWriter;
 import com.android.tools.r8.kotlin.metadata.KotlinMetadataTestBase;
 import com.android.tools.r8.shaking.ProguardKeepAttributes;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.android.tools.r8.utils.FileUtils;
@@ -99,7 +98,7 @@
     final File output = temp.newFile("output.zip");
     final D8TestRunResult d8TestRunResult =
         testForD8()
-            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+            .addLibraryFiles(getLibraryFile())
             .addProgramFiles(compiledJars.getForConfiguration(kotlinParameters))
             .addProgramFiles(kotlinc.getKotlinStdlibJar())
             .addProgramFiles(kotlinc.getKotlinReflectJar())
@@ -129,7 +128,7 @@
     boolean desugarLibrary = parameters.isDexRuntime() && requiresAnyCoreLibDesugaring(parameters);
     final R8FullTestBuilder testBuilder =
         testForR8(parameters.getBackend())
-            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+            .addLibraryFiles(getLibraryFile())
             .addProgramFiles(compiledJars.getForConfiguration(kotlinParameters))
             .addProgramFiles(kotlinc.getKotlinStdlibJar())
             .addProgramFiles(kotlinc.getKotlinReflectJar())
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/r8ondex/HelloWorldCompiledOnArtTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/r8ondex/HelloWorldCompiledOnArtTest.java
index 26561ec..c7cda9c 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/r8ondex/HelloWorldCompiledOnArtTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/r8ondex/HelloWorldCompiledOnArtTest.java
@@ -129,7 +129,7 @@
     }
     D8TestCompileResult compile =
         d8TestBuilder
-            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+            .addLibraryFiles(getLibraryFile())
             .setMinApi(parameters.getApiLevel())
             .enableCoreLibraryDesugaring(
                 LibraryDesugaringTestConfiguration.forApiLevel(parameters.getApiLevel()))
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/shrinkingtests/EnumSetTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/shrinkingtests/EnumSetTest.java
index bdc2b91..0752227 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/shrinkingtests/EnumSetTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/shrinkingtests/EnumSetTest.java
@@ -5,9 +5,7 @@
 package com.android.tools.r8.desugar.desugaredlibrary.shrinkingtests;
 
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.StringUtils;
 import java.time.DayOfWeek;
@@ -41,7 +39,7 @@
   public void testEnum() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addProgramClasses(EnumSetUser.class)
         .setMinApi(parameters.getApiLevel())
         .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/shrinkingtests/FieldAccessTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/shrinkingtests/FieldAccessTest.java
index 2b57223..7da38d7 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/shrinkingtests/FieldAccessTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/shrinkingtests/FieldAccessTest.java
@@ -5,9 +5,7 @@
 package com.android.tools.r8.desugar.desugaredlibrary.shrinkingtests;
 
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.StringUtils;
 import java.time.ZoneId;
@@ -38,7 +36,7 @@
   public void testField() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addProgramClasses(Executor.class)
         .setMinApi(parameters.getApiLevel())
         .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/shrinkingtests/InheritanceTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/shrinkingtests/InheritanceTest.java
index f314581..fd81f26 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/shrinkingtests/InheritanceTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/shrinkingtests/InheritanceTest.java
@@ -5,9 +5,7 @@
 package com.android.tools.r8.desugar.desugaredlibrary.shrinkingtests;
 
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.StringUtils;
 import java.time.Clock;
@@ -40,7 +38,7 @@
   public void testInheritance() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForD8()
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addProgramClasses(Impl.class)
         .setMinApi(parameters.getApiLevel())
         .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/shrinkingtests/KeepRuleShrinkTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/shrinkingtests/KeepRuleShrinkTest.java
index fa6a0c6..26ccf56 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/shrinkingtests/KeepRuleShrinkTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/shrinkingtests/KeepRuleShrinkTest.java
@@ -6,9 +6,7 @@
 
 import com.android.tools.r8.D8TestRunResult;
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
 import java.util.List;
 import java.util.Map;
@@ -42,7 +40,7 @@
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     D8TestRunResult d8TestRunResult =
         testForD8()
-            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+            .addLibraryFiles(getLibraryFile())
             .addInnerClasses(KeepRuleShrinkTest.class)
             .setMinApi(parameters.getApiLevel())
             .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
diff --git a/src/test/java/com/android/tools/r8/kotlin/KotlinDuplicateAnnotationTest.java b/src/test/java/com/android/tools/r8/kotlin/KotlinDuplicateAnnotationTest.java
index af6986a..6169da8 100644
--- a/src/test/java/com/android/tools/r8/kotlin/KotlinDuplicateAnnotationTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/KotlinDuplicateAnnotationTest.java
@@ -15,8 +15,11 @@
 import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.StringUtils;
+import java.nio.file.Files;
+import java.nio.file.Path;
 import java.util.Collection;
 import java.util.function.Consumer;
+import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -40,12 +43,17 @@
   public static Collection<Object[]> data() {
     return buildParameters(
         getTestParameters().withAllRuntimesAndApiLevels().build(),
-        getKotlinTestParameters().withAllCompilersAndTargetVersions().build(),
+        getKotlinTestParameters()
+            .withCompiler(KotlinCompilerVersion.KOTLINC_1_3_72)
+            .withAllTargetVersions()
+            .build(),
         BooleanUtils.values());
   }
 
   private final TestParameters parameters;
 
+  private static KotlinCompileMemoizer compiledJars;
+
   public KotlinDuplicateAnnotationTest(
       TestParameters parameters,
       KotlinTestParameters kotlinParameters,
@@ -54,15 +62,17 @@
     this.parameters = parameters;
   }
 
-  private static final KotlinCompileMemoizer compiledJars =
-      getCompileMemoizer(getKotlinFilesInResource(FOLDER), FOLDER)
-          .configure(kotlinCompilerTool -> kotlinCompilerTool.includeRuntime().noReflect());
+  @BeforeClass
+  public static void moveKotlinSourceFile() throws Exception {
+    Path sourceFile = getStaticTemp().newFolder().toPath().resolve("main.kt");
+    Files.copy(getKotlinResourcesFolder().resolve(FOLDER).resolve("main.txt"), sourceFile);
+    compiledJars =
+        getCompileMemoizer(sourceFile)
+            .configure(kotlinCompilerTool -> kotlinCompilerTool.includeRuntime().noReflect());
+  }
 
   @Test
   public void test_dex() {
-    assumeTrue(
-        "kotlinc > 1.3.72 will no longer compile kotlin files with duplicate annotations",
-        kotlinc.is(KotlinCompilerVersion.KOTLINC_1_3_72));
     assumeTrue("test DEX", parameters.isDexRuntime());
     try {
       testForR8(parameters.getBackend())
@@ -81,9 +91,6 @@
 
   @Test
   public void test_cf() throws Exception {
-    assumeTrue(
-        "kotlinc > 1.3.72 will no longer compile kotlin files with duplicate annotations",
-        kotlinc.is(KotlinCompilerVersion.KOTLINC_1_3_72));
     assumeTrue("test CF", parameters.isCfRuntime());
     testForR8(parameters.getBackend())
         .addProgramFiles(compiledJars.getForConfiguration(kotlinc, targetVersion))
diff --git a/src/test/java/com/android/tools/r8/kotlin/ProguardRulesBuilder.java b/src/test/java/com/android/tools/r8/kotlin/ProguardRulesBuilder.java
deleted file mode 100644
index 9c4d062..0000000
--- a/src/test/java/com/android/tools/r8/kotlin/ProguardRulesBuilder.java
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package com.android.tools.r8.kotlin;
-
-class ProguardRulesBuilder {
-
-  private final StringBuilder sb = new StringBuilder();
-
-  public ProguardRulesBuilder appendWithLineSeparator(String str) {
-    sb.append(str).append(System.lineSeparator());
-    return this;
-  }
-
-  public ProguardRulesBuilder dontObfuscate() {
-    return appendWithLineSeparator("-dontobfuscate");
-  }
-
-  public ProguardRulesBuilder allowAccessModification() {
-    return appendWithLineSeparator("-allowaccessmodification");
-  }
-
-  @Override
-  public String toString() {
-    return sb.toString();
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/naming/retrace/StackTrace.java b/src/test/java/com/android/tools/r8/naming/retrace/StackTrace.java
index 4472d60..aea2a25 100644
--- a/src/test/java/com/android/tools/r8/naming/retrace/StackTrace.java
+++ b/src/test/java/com/android/tools/r8/naming/retrace/StackTrace.java
@@ -227,7 +227,7 @@
         StackTraceLine o = (StackTraceLine) other;
         return className.equals(o.className)
             && methodName.equals(o.methodName)
-            && fileName.equals(o.fileName)
+            && Objects.equals(fileName, o.fileName)
             && lineNumber == o.lineNumber;
       }
       return false;
@@ -255,6 +255,10 @@
     return stackTraceLines.size() + 1;
   }
 
+  public String getExceptionLine() {
+    return exceptionLine;
+  }
+
   public StackTraceLine get(int index) {
     return stackTraceLines.get(index);
   }
@@ -317,9 +321,20 @@
   }
 
   public static StackTrace extractFromJvm(String stderr) {
-    List<String> strings = StringUtils.splitLines(stderr);
+    List<String> lines = StringUtils.splitLines(stderr);
+    String exceptionLine = "";
+    int startLine = 0;
+    for (int i = 0; i < lines.size(); i++) {
+      if (lines.get(i).startsWith(TAB_AT_PREFIX)) {
+        if (i > 0) {
+          exceptionLine = lines.get(i - 1);
+        }
+        startLine = i;
+        break;
+      }
+    }
     return new StackTrace(
-        strings.isEmpty() ? "" : strings.get(0), internalExtractFromJvm(strings), stderr);
+        exceptionLine, internalExtractFromJvm(lines.subList(startLine, lines.size())), stderr);
   }
 
   public static StackTrace extractFromJvm(SingleTestRunResult result) {
diff --git a/src/test/java/com/android/tools/r8/shaking/ClassKindTest.java b/src/test/java/com/android/tools/r8/shaking/ClassKindTest.java
index 1eb52a1..012933d 100644
--- a/src/test/java/com/android/tools/r8/shaking/ClassKindTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ClassKindTest.java
@@ -34,16 +34,17 @@
 
   @Parameters(name = "{0}")
   public static Collection<Object[]> parameters() {
-    return ImmutableList.copyOf(new Object[][]{
-        {"-keep interface *", ImmutableList.of(Interface.class)},
-        {"-keep class *", CLASSES_TO_INCLUDE},
-        {"-keep enum *", ImmutableList.of(Enum.class)},
-        {"-keep @interface *", ImmutableList.of(Annotation.class)},
-        {"-keep !interface *", ImmutableList.of(Enum.class, Annotation.class, Class.class)},
-        {"-keep !enum *", ImmutableList.of(Interface.class, Annotation.class, Class.class)},
-        {"-keep !@interface *", ImmutableList.of(Interface.class, Enum.class, Class.class)},
-        {"-keep !class *", ImmutableList.of()}
-    });
+    return ImmutableList.copyOf(
+        new Object[][] {
+          {"-keep interface *", ImmutableList.of(Interface.class, Annotation.class)},
+          {"-keep class *", CLASSES_TO_INCLUDE},
+          {"-keep enum *", ImmutableList.of(Enum.class)},
+          {"-keep @interface *", ImmutableList.of(Annotation.class)},
+          {"-keep !interface *", ImmutableList.of(Enum.class, Class.class)},
+          {"-keep !enum *", ImmutableList.of(Interface.class, Annotation.class, Class.class)},
+          {"-keep !@interface *", ImmutableList.of(Interface.class, Enum.class, Class.class)},
+          {"-keep !class *", ImmutableList.of()}
+        });
   }
 
   public final String config;
diff --git a/src/test/java/com/android/tools/r8/shaking/annotations/AnnotationClassKeepRuleTest.java b/src/test/java/com/android/tools/r8/shaking/annotations/AnnotationClassKeepRuleTest.java
new file mode 100644
index 0000000..38c2ec9
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/shaking/annotations/AnnotationClassKeepRuleTest.java
@@ -0,0 +1,114 @@
+// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.shaking.annotations;
+
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.notIf;
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assume.assumeTrue;
+
+import com.android.tools.r8.ProguardVersion;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestRunResult;
+import com.android.tools.r8.TestShrinkerBuilder;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import com.android.tools.r8.utils.BooleanUtils;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.util.List;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class AnnotationClassKeepRuleTest extends TestBase {
+
+  @Parameter(0)
+  public TestParameters parameters;
+
+  @Parameter(1)
+  public ProguardVersion proguardVersion;
+
+  @Parameter(2)
+  public boolean testAnnotation;
+
+  @Parameters(name = "{0}, PG: {1}, use @interface: {2}")
+  public static List<Object[]> data() {
+    return buildParameters(
+        getTestParameters().withCfRuntimes().build(),
+        ProguardVersion.values(),
+        BooleanUtils.values());
+  }
+
+  @Test
+  public void testR8Interface() throws Exception {
+    assumeTrue(proguardVersion == ProguardVersion.getLatest());
+    runTest(testForR8(parameters.getBackend())).inspect(this::inspect);
+  }
+
+  @Test
+  public void testPGInterface() throws Exception {
+    runTest(testForProguard(proguardVersion).addDontWarn(AnnotationClassKeepRuleTest.class))
+        .inspect(this::inspect);
+  }
+
+  @Test
+  public void testR8Annotation() throws Exception {
+    assumeTrue(proguardVersion == ProguardVersion.getLatest());
+    runTest(testForR8(parameters.getBackend())).inspect(this::inspect);
+  }
+
+  @Test
+  public void testPGAnnotation() throws Exception {
+    runTest(testForProguard(proguardVersion).addDontWarn(AnnotationClassKeepRuleTest.class))
+        .inspect(this::inspect);
+  }
+
+  private void inspect(CodeInspector inspector) {
+    assertThat(inspector.clazz(Foo.class), not(isPresent()));
+    assertThat(inspector.clazz(Bar.class), isPresent());
+    assertThat(inspector.clazz(Baz.class), notIf(isPresent(), testAnnotation));
+  }
+
+  private TestRunResult<?> runTest(TestShrinkerBuilder<?, ?, ?, ?, ?> testBuilder)
+      throws Exception {
+    return testBuilder
+        .addInnerClasses(getClass())
+        .setMinApi(AndroidApiLevel.B)
+        .addKeepRules(
+            "-keep @ "
+                + typeName(Foo.class)
+                + " "
+                + (testAnnotation ? "@interface" : "interface")
+                + " *")
+        .addKeepMainRule(Main.class)
+        .run(parameters.getRuntime(), Main.class)
+        .assertSuccessWithOutputLines("Hello World!");
+  }
+
+  public static class Main {
+
+    public static void main(String[] args) {
+      System.out.println("Hello World!");
+    }
+  }
+
+  @Retention(RetentionPolicy.RUNTIME)
+  @Target(ElementType.TYPE)
+  public @interface Foo {}
+
+  @Foo
+  public @interface Bar {}
+
+  @Foo
+  public interface Baz {}
+}
diff --git a/src/test/java/com/android/tools/r8/softverification/TestRunnerBuilder.java b/src/test/java/com/android/tools/r8/softverification/TestRunnerBuilder.java
index 7a19f09..375f03f 100644
--- a/src/test/java/com/android/tools/r8/softverification/TestRunnerBuilder.java
+++ b/src/test/java/com/android/tools/r8/softverification/TestRunnerBuilder.java
@@ -19,13 +19,15 @@
 import com.android.tools.r8.transformers.ClassFileTransformer.MethodPredicate;
 import com.android.tools.r8.transformers.MethodTransformer;
 import com.android.tools.r8.utils.AndroidApiLevel;
+import com.android.tools.r8.utils.ListUtils;
 import com.android.tools.r8.utils.ZipUtils.ZipBuilder;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import java.io.IOException;
 import java.nio.file.Path;
 import java.nio.file.Paths;
-import java.util.Set;
+import java.util.Collection;
+import java.util.List;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -74,16 +76,18 @@
 
   private static final int COUNT = 1100;
 
-  private static final Set<String> testClasses =
-      ImmutableSet.of(
-          binaryName(TestCheckCast.class),
-          binaryName(TestInstanceOf.class),
-          binaryName(TestTypeReference.class),
-          binaryName(TestNewInstance.class),
-          binaryName(TestStaticField.class),
-          binaryName(TestStaticMethod.class),
-          binaryName(TestInstanceField.class),
-          binaryName(TestInstanceMethod.class));
+  private static final List<Class<?>> testClasses =
+      ImmutableList.of(
+          TestCheckCast.class,
+          TestInstanceOf.class,
+          TestTypeReference.class,
+          TestNewInstance.class,
+          TestStaticField.class,
+          TestStaticMethod.class,
+          TestInstanceField.class,
+          TestInstanceMethod.class);
+  private static final Collection<String> testClassBinaryNames =
+      ImmutableSet.copyOf(ListUtils.map(testClasses, TestBase::binaryName));
 
   private static void buildJar(Path path) throws Exception {
     ZipBuilder builder = ZipBuilder.builder(path);
@@ -94,14 +98,9 @@
       String postFix = clazz.getSimpleName();
       int classCounter = 0;
       for (int i = 0; i < COUNT; i++) {
-        addClass(builder, TestCheckCast.class, clazz, postFix, i, classCounter++);
-        addClass(builder, TestInstanceOf.class, clazz, postFix, i, classCounter++);
-        addClass(builder, TestTypeReference.class, clazz, postFix, i, classCounter++);
-        addClass(builder, TestNewInstance.class, clazz, postFix, i, classCounter++);
-        addClass(builder, TestStaticField.class, clazz, postFix, i, classCounter++);
-        addClass(builder, TestStaticMethod.class, clazz, postFix, i, classCounter++);
-        addClass(builder, TestInstanceField.class, clazz, postFix, i, classCounter++);
-        addClass(builder, TestInstanceMethod.class, clazz, postFix, i, classCounter++);
+        for (Class<?> testClass : testClasses) {
+          addClass(builder, testClass, clazz, postFix, i, classCounter++);
+        }
       }
       if (clazz != MissingClass.class) {
         for (int i = 0; i < classCounter; i++) {
@@ -134,7 +133,7 @@
                         String name,
                         String descriptor,
                         boolean isInterface) {
-                      if (!testClasses.contains(owner)) {
+                      if (!testClassBinaryNames.contains(owner)) {
                         super.visitMethodInsn(opcode, owner, name, descriptor, isInterface);
                         return;
                       }
diff --git a/src/test/java/com/android/tools/r8/workaround/InvokeVirtualToInterfaceVerifyErrorWorkaroundTest.java b/src/test/java/com/android/tools/r8/workaround/InvokeVirtualToInterfaceVerifyErrorWorkaroundTest.java
new file mode 100644
index 0000000..3cc8749
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/workaround/InvokeVirtualToInterfaceVerifyErrorWorkaroundTest.java
@@ -0,0 +1,125 @@
+// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.workaround;
+
+import static com.android.tools.r8.utils.codeinspector.CodeMatchers.invokesMethodWithName;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isAbsent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import com.android.tools.r8.utils.DescriptorUtils;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
+import com.google.common.collect.ImmutableList;
+import java.io.IOException;
+import java.util.List;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class InvokeVirtualToInterfaceVerifyErrorWorkaroundTest extends TestBase {
+
+  @Parameter(0)
+  public TestParameters parameters;
+
+  @Parameters(name = "{0}")
+  public static TestParametersCollection parameters() {
+    return getTestParameters().withAllRuntimesAndApiLevels().build();
+  }
+
+  @Test
+  public void test() throws Exception {
+    testForR8(parameters.getBackend())
+        .addProgramClasses(A.class)
+        .addProgramClassFileData(getProgramClassFileData())
+        .addKeepClassAndMembersRules(Main.class)
+        // CameraDevice is not present in rt.jar or android.jar when API<L.
+        .applyIf(
+            parameters.isCfRuntime() || parameters.getApiLevel().isLessThan(AndroidApiLevel.L),
+            testBuilder -> testBuilder.addDontWarn("android.hardware.camera2.CameraDevice"))
+        // CameraDeviceUser can only be merged with A when min API>=L.
+        .addHorizontallyMergedClassesInspector(
+            inspector ->
+                inspector
+                    .applyIf(
+                        parameters.isDexRuntime()
+                            && parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.L),
+                        i -> i.assertIsCompleteMergeGroup(A.class, CameraDeviceUser.class))
+                    .assertNoOtherClassesMerged())
+        .setMinApi(parameters.getApiLevel())
+        .compile()
+        // CameraDeviceUser.m() can only be inlined when min API>=L.
+        .inspect(
+            inspector -> {
+              if (parameters.isDexRuntime()
+                  && parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.L)) {
+                assertThat(inspector.clazz(CameraDeviceUser.class), isAbsent());
+              } else {
+                ClassSubject cameraDeviceUserClassSubject = inspector.clazz(CameraDeviceUser.class);
+                assertThat(cameraDeviceUserClassSubject, isPresent());
+
+                MethodSubject mMethodSubject =
+                    cameraDeviceUserClassSubject.uniqueMethodWithName("m");
+                assertThat(mMethodSubject, isPresent());
+                assertThat(mMethodSubject, invokesMethodWithName("close"));
+              }
+            });
+  }
+
+  private static List<byte[]> getProgramClassFileData() throws IOException {
+    String oldDescriptor = DescriptorUtils.javaTypeToDescriptor(CameraDevice.class.getTypeName());
+    String newDescriptor = "Landroid/hardware/camera2/CameraDevice;";
+    return ImmutableList.of(
+        transformer(Main.class)
+            .replaceClassDescriptorInMembers(oldDescriptor, newDescriptor)
+            .replaceClassDescriptorInMethodInstructions(oldDescriptor, newDescriptor)
+            .transform(),
+        transformer(CameraDeviceUser.class)
+            .replaceClassDescriptorInMembers(oldDescriptor, newDescriptor)
+            .replaceClassDescriptorInMethodInstructions(oldDescriptor, newDescriptor)
+            .transform());
+  }
+
+  // The following classes are transformed to use android.hardware.camera2.CameraDevice.
+  static class Main {
+
+    public static void main(String[] args) {
+      int minApi = args.length;
+      if (minApi >= 21) {
+        new CameraDeviceUser().m(getCameraDevice());
+      } else {
+        System.out.println(new A());
+      }
+    }
+
+    // @Keep
+    static CameraDevice getCameraDevice() {
+      return null;
+    }
+  }
+
+  static class A {}
+
+  static class CameraDeviceUser {
+
+    public void m(CameraDevice cd) {
+      if (cd != null) {
+        cd.close();
+      }
+    }
+  }
+
+  abstract static class CameraDevice {
+
+    abstract void close();
+  }
+}
diff --git a/src/test/kotlinR8TestResources/duplicate_annotation/main.kt b/src/test/kotlinR8TestResources/duplicate_annotation/main.txt
similarity index 100%
rename from src/test/kotlinR8TestResources/duplicate_annotation/main.kt
rename to src/test/kotlinR8TestResources/duplicate_annotation/main.txt
diff --git a/third_party/android_jar/api-database.tar.gz.sha1 b/third_party/android_jar/api-database.tar.gz.sha1
deleted file mode 100644
index 2bbe555..0000000
--- a/third_party/android_jar/api-database.tar.gz.sha1
+++ /dev/null
@@ -1 +0,0 @@
-829d7f32a482c16a2008a8878c33c58637c21a56
\ No newline at end of file
diff --git a/tools/archive_desugar_jdk_libs.py b/tools/archive_desugar_jdk_libs.py
index 733e59b..91ad6b5 100755
--- a/tools/archive_desugar_jdk_libs.py
+++ b/tools/archive_desugar_jdk_libs.py
@@ -120,7 +120,7 @@
           checkout_dir, 'bazel-bin', 'src', 'share', 'classes', 'java', 'libjava.jar')
     else:
       library_jar = os.path.join(
-          checkout_dir, 'bazel-bin', 'jdk11', 'src', 'd8_java_base_selected.jar')
+          checkout_dir, 'bazel-bin', 'jdk11', 'src', 'd8_java_base_selected_with_addon.jar')
     maven_zip = os.path.join(
       checkout_dir,
       'bazel-bin',