Merge commit '089989ec29b6fed9d55a7849d569b35e8d335d17' into dev-release
diff --git a/src/library_desugar/jdk11/desugar_jdk_libs.json b/src/library_desugar/jdk11/desugar_jdk_libs.json
index b0c751c..397f2c5 100644
--- a/src/library_desugar/jdk11/desugar_jdk_libs.json
+++ b/src/library_desugar/jdk11/desugar_jdk_libs.json
@@ -71,15 +71,53 @@
   ],
   "library_flags": [
     {
+      "api_level_below_or_equal": 10000,
+      "rewrite_prefix": {
+        "desugar.": "j$.desugar.",
+        "libcore.": "j$.libcore.",
+        "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"
+      }
+    },
+    {
+      "api_level_below_or_equal": 29,
+      "rewrite_prefix": {
+        "java.util.concurrent.Flow": "j$.util.concurrent.Flow"
+      }
+    },
+    {
       "api_level_below_or_equal": 25,
       "rewrite_prefix": {
         "j$.time.": "java.time.",
         "java.time.": "j$.time.",
+        "java.io.DesugarFile" : "j$.io.DesugarFile",
         "java.util.Desugar": "j$.util.Desugar",
         "sun.misc.Desugar": "j$.sun.misc.Desugar",
-        "jdk.internal.util.Preconditions": "j$.jdk.internal.util.Preconditions"
+        "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",
+        "java.nio.channels.AsynchronousFileChannel": "j$.nio.channels.AsynchronousFileChannel",
+        "java.nio.channels.CompletionHandler": "j$.nio.channels.CompletionHandler",
+        "java.nio.channels.Desugar": "j$.nio.channels.Desugar",
+        "java.nio.file.": "j$.nio.file.",
+        "sun.nio.cs." : "j$.sun.nio.cs.",
+        "sun.nio.fs.AbstractFileSystemProvider": "j$.sun.nio.fs.AbstractFileSystemProvider",
+        "sun.nio.fs.AbstractFileTypeDetector": "j$.sun.nio.fs.AbstractFileTypeDetector",
+        "sun.nio.fs.BasicFileAttributesHolder": "j$.sun.nio.fs.BasicFileAttributesHolder",
+        "sun.nio.fs.DynamicFileAttributeView": "j$.sun.nio.fs.DynamicFileAttributeView",
+        "sun.util.PreHashedMap": "j$.sun.util.PreHashedMap"
+      },
+      "backport": {
+        "java.lang.DesugarDouble": "java.lang.Double",
+        "java.lang.DesugarInteger": "java.lang.Integer",
+        "java.lang.DesugarLong": "java.lang.Long",
+        "java.lang.DesugarMath": "java.lang.Math"
       },
       "retarget_lib_member": {
+        "java.io.File#toPath": "java.io.DesugarFile",
         "java.util.Date#toInstant": "java.util.DesugarDate",
         "java.util.GregorianCalendar#toZonedDateTime": "java.util.DesugarGregorianCalendar",
         "java.util.TimeZone#toZoneId": "java.util.DesugarTimeZone"
@@ -96,17 +134,19 @@
     {
       "api_level_below_or_equal": 23,
       "rewrite_prefix": {
+        "java.lang.FunctionalInterface": "j$.lang.FunctionalInterface",
+        "java.io.DesugarInputStream": "j$.io.DesugarInputStream",
         "j$.util.Optional": "java.util.Optional",
         "j$.util.LongSummaryStatistics": "java.util.LongSummaryStatistics",
         "j$.util.IntSummaryStatistics": "java.util.IntSummaryStatistics",
         "j$.util.DoubleSummaryStatistics": "java.util.DoubleSummaryStatistics",
+        "java.nio.channels.SeekableByteChannel": "j$.nio.channels.SeekableByteChannel",
         "java.util.stream.": "j$.util.stream.",
         "java.util.function.": "j$.util.function.",
         "java.util.Comparators": "j$.util.Comparators",
         "java.util.DoubleSummaryStatistics": "j$.util.DoubleSummaryStatistics",
         "java.util.IntSummaryStatistics": "j$.util.IntSummaryStatistics",
         "java.util.LongSummaryStatistics": "j$.util.LongSummaryStatistics",
-        "java.util.Objects": "j$.util.Objects",
         "java.util.Optional": "j$.util.Optional",
         "java.util.PrimitiveIterator": "j$.util.PrimitiveIterator",
         "java.util.SortedSet$1": "j$.util.SortedSet$1",
@@ -151,6 +191,15 @@
         "java.util.IntSummaryStatistics": "java.util.IntSummaryStatisticsConversions",
         "java.util.DoubleSummaryStatistics": "java.util.DoubleSummaryStatisticsConversions"
       }
+    },
+    {
+      "api_level_below_or_equal": 18,
+      "rewrite_prefix": {
+        "java.nio.charset.StandardCharsets": "j$.nio.charset.StandardCharsets"
+      },
+      "retarget_lib_member": {
+        "java.lang.Character#isBmpCodePoint": "j$.lang.DesugarCharacter"
+      }
     }
   ],
   "program_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 66f3500..fca8af4 100644
--- a/src/library_desugar/jdk11/desugar_jdk_libs_alternative_3.json
+++ b/src/library_desugar/jdk11/desugar_jdk_libs_alternative_3.json
@@ -71,15 +71,53 @@
   ],
   "library_flags": [
     {
+      "api_level_below_or_equal": 10000,
+      "rewrite_prefix": {
+        "desugar.": "j$.desugar.",
+        "libcore.": "j$.libcore.",
+        "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"
+      }
+    },
+    {
+      "api_level_below_or_equal": 29,
+      "rewrite_prefix": {
+        "java.util.concurrent.Flow": "j$.util.concurrent.Flow"
+      }
+    },
+    {
       "api_level_below_or_equal": 25,
       "rewrite_prefix": {
         "j$.time.": "java.time.",
         "java.time.": "j$.time.",
+        "java.io.DesugarFile" : "j$.io.DesugarFile",
         "java.util.Desugar": "j$.util.Desugar",
         "sun.misc.Desugar": "j$.sun.misc.Desugar",
-        "jdk.internal.util.Preconditions": "j$.jdk.internal.util.Preconditions"
+        "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",
+        "java.nio.channels.AsynchronousFileChannel": "j$.nio.channels.AsynchronousFileChannel",
+        "java.nio.channels.CompletionHandler": "j$.nio.channels.CompletionHandler",
+        "java.nio.channels.Desugar": "j$.nio.channels.Desugar",
+        "java.nio.file.": "j$.nio.file.",
+        "sun.nio.cs." : "j$.sun.nio.cs.",
+        "sun.nio.fs.AbstractFileSystemProvider": "j$.sun.nio.fs.AbstractFileSystemProvider",
+        "sun.nio.fs.AbstractFileTypeDetector": "j$.sun.nio.fs.AbstractFileTypeDetector",
+        "sun.nio.fs.BasicFileAttributesHolder": "j$.sun.nio.fs.BasicFileAttributesHolder",
+        "sun.nio.fs.DynamicFileAttributeView": "j$.sun.nio.fs.DynamicFileAttributeView",
+        "sun.util.PreHashedMap": "j$.sun.util.PreHashedMap"
+      },
+      "backport": {
+        "java.lang.DesugarDouble": "java.lang.Double",
+        "java.lang.DesugarInteger": "java.lang.Integer",
+        "java.lang.DesugarLong": "java.lang.Long",
+        "java.lang.DesugarMath": "java.lang.Math"
       },
       "retarget_lib_member": {
+        "java.io.File#toPath": "java.io.DesugarFile",
         "java.util.Date#toInstant": "java.util.DesugarDate",
         "java.util.GregorianCalendar#toZonedDateTime": "java.util.DesugarGregorianCalendar",
         "java.util.TimeZone#toZoneId": "java.util.DesugarTimeZone"
@@ -96,10 +134,15 @@
     {
       "api_level_below_or_equal": 23,
       "rewrite_prefix": {
+        "java.lang.FunctionalInterface": "j$.lang.FunctionalInterface",
+        "java.io.DesugarBufferedReader": "j$.io.DesugarBufferedReader",
+        "java.io.DesugarInputStream": "j$.io.DesugarInputStream",
+        "java.io.UncheckedIOException": "j$.io.UncheckedIOException",
         "j$.util.Optional": "java.util.Optional",
         "j$.util.LongSummaryStatistics": "java.util.LongSummaryStatistics",
         "j$.util.IntSummaryStatistics": "java.util.IntSummaryStatistics",
         "j$.util.DoubleSummaryStatistics": "java.util.DoubleSummaryStatistics",
+        "java.nio.channels.SeekableByteChannel": "j$.nio.channels.SeekableByteChannel",
         "java.util.stream.": "j$.util.stream.",
         "java.util.function.": "j$.util.function.",
         "java.util.Comparators": "j$.util.Comparators",
@@ -120,9 +163,7 @@
         "java.util.AbstractList": "j$.util.AbstractList",
         "java.util.CollSer": "j$.util.CollSer",
         "java.util.ImmutableCollections": "j$.util.ImmutableCollections",
-        "java.util.KeyValueHolder": "j$.util.KeyValueHolder",
-        "java.io.DesugarBufferedReader": "j$.io.DesugarBufferedReader",
-        "java.io.UncheckedIOException": "j$.io.UncheckedIOException"
+        "java.util.KeyValueHolder": "j$.util.KeyValueHolder"
       },
       "retarget_lib_member": {
         "java.util.Arrays#stream": "java.util.DesugarArrays",
@@ -134,6 +175,7 @@
         "java.util.Iterator#remove"
       ],
       "emulate_interface": {
+        "java.lang.Iterable": "j$.lang.Iterable",
         "java.util.Map$Entry": "j$.util.Map$Entry",
         "java.util.Collection": "j$.util.Collection",
         "java.util.Map": "j$.util.Map",
@@ -153,6 +195,15 @@
         "java.util.IntSummaryStatistics": "java.util.IntSummaryStatisticsConversions",
         "java.util.DoubleSummaryStatistics": "java.util.DoubleSummaryStatisticsConversions"
       }
+    },
+    {
+      "api_level_below_or_equal": 18,
+      "rewrite_prefix": {
+        "java.nio.charset.StandardCharsets": "j$.nio.charset.StandardCharsets"
+      },
+      "retarget_lib_member": {
+        "java.lang.Character#isBmpCodePoint": "j$.lang.DesugarCharacter"
+      }
     }
   ],
   "program_flags": [
@@ -222,6 +273,7 @@
         "java.util.Iterator#remove"
       ],
       "emulate_interface": {
+        "java.lang.Iterable": "j$.lang.Iterable",
         "java.util.Map$Entry": "j$.util.Map$Entry",
         "java.util.Collection": "j$.util.Collection",
         "java.util.Map": "j$.util.Map",
@@ -248,7 +300,7 @@
     "-keepclassmembers class j$.util.concurrent.ConcurrentHashMap { int sizeCtl; int transferIndex; long baseCount; int cellsBusy; }",
     "-keepclassmembers class j$.util.concurrent.ConcurrentHashMap$CounterCell { long value; }",
     "-keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); public static final !synthetic <fields>; }",
-    "-keeppackagenames j$",
+    "-keeppackagenames j$.**",
     "-keepclassmembers class j$.util.IntSummaryStatistics { long count; long sum; int min; int max; }",
     "-keepclassmembers class j$.util.LongSummaryStatistics { long count; long sum; long min; long max; }",
     "-keepclassmembers class j$.util.DoubleSummaryStatistics { long count; double sum; double min; double max; }",
diff --git a/src/main/java/com/android/tools/r8/D8Command.java b/src/main/java/com/android/tools/r8/D8Command.java
index 2013fb9..242064b 100644
--- a/src/main/java/com/android/tools/r8/D8Command.java
+++ b/src/main/java/com/android/tools/r8/D8Command.java
@@ -467,7 +467,7 @@
     internal.enableMainDexListCheck = enableMainDexListCheck;
     internal.minApiLevel = AndroidApiLevel.getAndroidApiLevel(getMinApiLevel());
     internal.intermediate = intermediate;
-    internal.readCompileTimeAnnotations = intermediate;
+    internal.retainCompileTimeAnnotations = intermediate;
     internal.desugarGraphConsumer = desugarGraphConsumer;
     internal.mainDexKeepRules = mainDexKeepRules;
     internal.lineNumberOptimization = LineNumberOptimization.OFF;
diff --git a/src/main/java/com/android/tools/r8/GenerateMainDexListCommand.java b/src/main/java/com/android/tools/r8/GenerateMainDexListCommand.java
index 2512782..337fad7 100644
--- a/src/main/java/com/android/tools/r8/GenerateMainDexListCommand.java
+++ b/src/main/java/com/android/tools/r8/GenerateMainDexListCommand.java
@@ -224,6 +224,8 @@
     internal.minimalMainDex = internal.debug;
     internal.enableEnumValueOptimization = false;
     internal.inlinerOptions().enableInlining = false;
+    assert internal.retainCompileTimeAnnotations;
+    internal.retainCompileTimeAnnotations = false;
     return internal;
   }
 }
diff --git a/src/main/java/com/android/tools/r8/L8Command.java b/src/main/java/com/android/tools/r8/L8Command.java
index 133ca25..c0fb797 100644
--- a/src/main/java/com/android/tools/r8/L8Command.java
+++ b/src/main/java/com/android/tools/r8/L8Command.java
@@ -166,7 +166,7 @@
     assert !internal.minimalMainDex;
     internal.minApiLevel = AndroidApiLevel.getAndroidApiLevel(getMinApiLevel());
     assert !internal.intermediate;
-    assert internal.readCompileTimeAnnotations;
+    assert internal.retainCompileTimeAnnotations;
     internal.programConsumer = getProgramConsumer();
     assert internal.programConsumer instanceof ClassFileConsumer;
 
diff --git a/src/main/java/com/android/tools/r8/dex/ApplicationReader.java b/src/main/java/com/android/tools/r8/dex/ApplicationReader.java
index e469f0a..07e0617 100644
--- a/src/main/java/com/android/tools/r8/dex/ApplicationReader.java
+++ b/src/main/java/com/android/tools/r8/dex/ApplicationReader.java
@@ -20,6 +20,7 @@
 import com.android.tools.r8.errors.UnsupportedMainDexListUsageDiagnostic;
 import com.android.tools.r8.graph.ApplicationReaderMap;
 import com.android.tools.r8.graph.ClassKind;
+import com.android.tools.r8.graph.DexAnnotation;
 import com.android.tools.r8.graph.DexApplication;
 import com.android.tools.r8.graph.DexApplicationReadFlags;
 import com.android.tools.r8.graph.DexClass;
@@ -379,6 +380,20 @@
       }
     }
 
+    private boolean includeAnnotationClass(DexProgramClass clazz) {
+      if (!options.pruneNonVissibleAnnotationClasses) {
+        return true;
+      }
+      DexAnnotation retentionAnnotation =
+          clazz.annotations().getFirstMatching(itemFactory.retentionType);
+      // Default is CLASS retention, read if retained.
+      if (retentionAnnotation == null) {
+        return DexAnnotation.retainCompileTimeAnnotation(clazz.getType(), application.options);
+      }
+      // Otherwise only read runtime visible annotations.
+      return retentionAnnotation.annotation.toString().contains("RUNTIME");
+    }
+
     private void readClassSources(
         List<ProgramResource> classSources, Queue<DexProgramClass> classes) {
       if (classSources.isEmpty()) {
@@ -386,7 +401,15 @@
       }
       hasReadProgramResourceFromCf = true;
       JarClassFileReader<DexProgramClass> reader =
-          new JarClassFileReader<>(application, classes::add, PROGRAM);
+          new JarClassFileReader<>(
+              application,
+              clazz -> {
+                if (clazz.isAnnotation() && !includeAnnotationClass(clazz)) {
+                  return;
+                }
+                classes.add(clazz);
+              },
+              PROGRAM);
       // Read classes in parallel.
       for (ProgramResource input : classSources) {
         futures.add(
diff --git a/src/main/java/com/android/tools/r8/graph/DexAnnotation.java b/src/main/java/com/android/tools/r8/graph/DexAnnotation.java
index 1141602..6952bf7 100644
--- a/src/main/java/com/android/tools/r8/graph/DexAnnotation.java
+++ b/src/main/java/com/android/tools/r8/graph/DexAnnotation.java
@@ -111,7 +111,7 @@
   }
 
   public static boolean retainCompileTimeAnnotation(DexType annotation, InternalOptions options) {
-    if (options.readCompileTimeAnnotations) {
+    if (options.retainCompileTimeAnnotations) {
       return true;
     }
     if (annotation == options.itemFactory.dalvikFastNativeAnnotation
diff --git a/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java b/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
index 0c78a72..b59c44f 100644
--- a/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
+++ b/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
@@ -175,9 +175,8 @@
 
   private static boolean retainCompileTimeAnnotation(
       String desc, JarApplicationReader application) {
-    return application.options.readCompileTimeAnnotations
-        || DexAnnotation.retainCompileTimeAnnotation(
-            application.getTypeFromDescriptor(desc), application.options);
+    return DexAnnotation.retainCompileTimeAnnotation(
+        application.getTypeFromDescriptor(desc), application.options);
   }
 
   private static DexEncodedAnnotation createEncodedAnnotation(String desc,
diff --git a/src/main/java/com/android/tools/r8/graph/ProgramMethod.java b/src/main/java/com/android/tools/r8/graph/ProgramMethod.java
index 98c8bd2..146e33f 100644
--- a/src/main/java/com/android/tools/r8/graph/ProgramMethod.java
+++ b/src/main/java/com/android/tools/r8/graph/ProgramMethod.java
@@ -78,6 +78,7 @@
         && !getAccessFlags().isNative()
         && !getAccessFlags().isPrivate()
         && !getAccessFlags().isStatic()
+        && !getDefinition().isInstanceInitializer()
         && !appView.appInfo().isFailedResolutionTarget(getReference());
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryAPIConverter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryAPIConverter.java
index 2b6c9d4..460c350 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryAPIConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryAPIConverter.java
@@ -287,9 +287,10 @@
 
   private DexMethod computeReturnConversion(
       DexMethod invokedMethod,
-      DesugaredLibraryClasspathWrapperSynthesizeEventConsumer eventConsumer) {
+      DesugaredLibraryClasspathWrapperSynthesizeEventConsumer eventConsumer,
+      ProgramMethod context) {
     DexType returnType = invokedMethod.proto.returnType;
-    if (wrapperSynthesizor.shouldConvert(returnType, invokedMethod)) {
+    if (wrapperSynthesizor.shouldConvert(returnType, invokedMethod, context)) {
       DexType newReturnType = DesugaredLibraryAPIConverter.vivifiedTypeFor(returnType, appView);
       return wrapperSynthesizor.ensureConversionMethod(
           returnType, newReturnType, returnType, eventConsumer);
@@ -299,12 +300,13 @@
 
   private DexMethod[] computeParameterConversions(
       DexMethod invokedMethod,
-      DesugaredLibraryClasspathWrapperSynthesizeEventConsumer eventConsumer) {
+      DesugaredLibraryClasspathWrapperSynthesizeEventConsumer eventConsumer,
+      ProgramMethod context) {
     DexMethod[] parameterConversions = new DexMethod[invokedMethod.getArity()];
     DexType[] parameters = invokedMethod.proto.parameters.values;
     for (int i = 0; i < parameters.length; i++) {
       DexType argType = parameters[i];
-      if (wrapperSynthesizor.shouldConvert(argType, invokedMethod)) {
+      if (wrapperSynthesizor.shouldConvert(argType, invokedMethod, context)) {
         DexType argVivifiedType = vivifiedTypeFor(argType, appView);
         parameterConversions[i] =
             wrapperSynthesizor.ensureConversionMethod(
@@ -326,12 +328,12 @@
     }
     if (shouldOutlineAPIConversion(invoke, context)) {
       DexMethod outlinedAPIConversion =
-          createOutlinedAPIConversion(invoke, methodProcessingContext, eventConsumer);
+          createOutlinedAPIConversion(invoke, methodProcessingContext, eventConsumer, context);
       return Collections.singletonList(
           new CfInvoke(Opcodes.INVOKESTATIC, outlinedAPIConversion, false));
     }
     return rewriteLibraryInvokeToInlineAPIConversion(
-        invoke, methodProcessingContext, localStackAllocator, eventConsumer);
+        invoke, methodProcessingContext, localStackAllocator, eventConsumer, context);
   }
 
   // If the option is set, we try to outline API conversions as much as possible to reduce the
@@ -354,11 +356,13 @@
       CfInvoke invoke,
       MethodProcessingContext methodProcessingContext,
       LocalStackAllocator localStackAllocator,
-      CfInstructionDesugaringEventConsumer eventConsumer) {
+      CfInstructionDesugaringEventConsumer eventConsumer,
+      ProgramMethod context) {
 
     DexMethod invokedMethod = invoke.getMethod();
-    DexMethod returnConversion = computeReturnConversion(invokedMethod, eventConsumer);
-    DexMethod[] parameterConversions = computeParameterConversions(invokedMethod, eventConsumer);
+    DexMethod returnConversion = computeReturnConversion(invokedMethod, eventConsumer, context);
+    DexMethod[] parameterConversions =
+        computeParameterConversions(invokedMethod, eventConsumer, context);
 
     // If only the last 2 parameters require conversion, we do everything inlined.
     // If other parameters require conversion, we outline the parameter conversion but keep the API
@@ -502,14 +506,16 @@
   private DexMethod createOutlinedAPIConversion(
       CfInvoke invoke,
       MethodProcessingContext methodProcessingContext,
-      CfInstructionDesugaringEventConsumer eventConsumer) {
+      CfInstructionDesugaringEventConsumer eventConsumer,
+      ProgramMethod context) {
     DexMethod invokedMethod = invoke.getMethod();
     DexProto newProto =
         invoke.isInvokeStatic()
             ? invokedMethod.proto
             : factory.prependTypeToProto(invokedMethod.getHolderType(), invokedMethod.getProto());
-    DexMethod returnConversion = computeReturnConversion(invokedMethod, eventConsumer);
-    DexMethod[] parameterConversions = computeParameterConversions(invokedMethod, eventConsumer);
+    DexMethod returnConversion = computeReturnConversion(invokedMethod, eventConsumer, context);
+    DexMethod[] parameterConversions =
+        computeParameterConversions(invokedMethod, eventConsumer, context);
     ProgramMethod outline =
         appView
             .getSyntheticItems()
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryWrapperSynthesizer.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryWrapperSynthesizer.java
index 4269366..6aed582 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryWrapperSynthesizer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryWrapperSynthesizer.java
@@ -23,6 +23,7 @@
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.FieldAccessFlags;
 import com.android.tools.r8.graph.MethodAccessFlags;
+import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.desugar.CfClassSynthesizerDesugaring;
 import com.android.tools.r8.ir.desugar.CfClassSynthesizerDesugaringEventConsumer;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibraryWrapperSynthesizerEventConsumer.DesugaredLibraryClasspathWrapperSynthesizeEventConsumer;
@@ -32,6 +33,9 @@
 import com.android.tools.r8.ir.synthetic.DesugaredLibraryAPIConversionCfCodeProvider.APIConverterVivifiedWrapperCfCodeProvider;
 import com.android.tools.r8.ir.synthetic.DesugaredLibraryAPIConversionCfCodeProvider.APIConverterWrapperCfCodeProvider;
 import com.android.tools.r8.ir.synthetic.DesugaredLibraryAPIConversionCfCodeProvider.APIConverterWrapperConversionCfCodeProvider;
+import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.position.MethodPosition;
+import com.android.tools.r8.position.Position;
 import com.android.tools.r8.synthesis.SyntheticClassBuilder;
 import com.android.tools.r8.synthesis.SyntheticMethodBuilder;
 import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
@@ -109,13 +113,17 @@
   }
 
   public boolean shouldConvert(DexType type, DexMethod method) {
+    return shouldConvert(type, method, null);
+  }
+
+  public boolean shouldConvert(DexType type, DexMethod method, ProgramMethod context) {
     if (!appView.rewritePrefix.hasRewrittenType(type, appView)) {
       return false;
     }
     if (canConvert(type)) {
       return true;
     }
-    reportInvalidInvoke(type, method);
+    reportInvalidInvoke(type, method, context);
     return false;
   }
 
@@ -173,8 +181,11 @@
         || canGenerateWrapper(type);
   }
 
-  private void reportInvalidInvoke(DexType type, DexMethod invokedMethod) {
+  private void reportInvalidInvoke(DexType type, DexMethod invokedMethod, ProgramMethod context) {
     DexType desugaredType = appView.rewritePrefix.rewrittenType(type, appView);
+    Origin origin = context != null ? context.getOrigin() : Origin.unknown();
+    Position position =
+        context != null ? new MethodPosition(context.getMethodReference()) : Position.UNKNOWN;
     StringDiagnostic diagnostic =
         new StringDiagnostic(
             "Invoke to "
@@ -183,7 +194,9 @@
                 + invokedMethod.name
                 + " may not work correctly at runtime (Cannot convert type "
                 + desugaredType
-                + ").");
+                + ").",
+            origin,
+            position);
     if (appView.options().isDesugaredLibraryCompilation()) {
       throw appView.options().reporter.fatalError(diagnostic);
     } else {
diff --git a/src/main/java/com/android/tools/r8/shaking/MainDexListBuilder.java b/src/main/java/com/android/tools/r8/shaking/MainDexListBuilder.java
index 23e9e26..b648635 100644
--- a/src/main/java/com/android/tools/r8/shaking/MainDexListBuilder.java
+++ b/src/main/java/com/android/tools/r8/shaking/MainDexListBuilder.java
@@ -76,7 +76,9 @@
       }
       DexType dexType = clazz.type;
       if (isAnnotation(dexType) && isAnnotationWithEnum(dexType)) {
-        addAnnotationsWithEnum(clazz);
+        if (isVisibleAnnotation(clazz)) {
+          addAnnotationsWithEnum(clazz);
+        }
         continue;
       }
       // Classes with annotations must be in the same dex file as the annotation. As all
@@ -93,6 +95,23 @@
     }
   }
 
+  private boolean isVisibleAnnotation(DexProgramClass clazz) {
+    if (retainCompileTimeAnnotation(clazz.type)) {
+      return true;
+    }
+    DexAnnotation retentionAnnotation =
+        clazz.annotations().getFirstMatching(appView.dexItemFactory().retentionType);
+    // Default is CLASS retention
+    if (retentionAnnotation == null) {
+      return false;
+    }
+    return retentionAnnotation.annotation.toString().contains("RUNTIME");
+  }
+
+  private boolean retainCompileTimeAnnotation(DexType type) {
+    return DexAnnotation.retainCompileTimeAnnotation(type, appView.options());
+  }
+
   private boolean isAnnotationWithEnum(DexType dexType) {
     Boolean value = annotationTypeContainEnum.get(dexType);
     if (value == null) {
@@ -109,15 +128,18 @@
           if (proto.parameters.isEmpty()) {
             DexType valueType = proto.returnType.toBaseType(appView.dexItemFactory());
             if (valueType.isClassType()) {
-              if (isEnum(valueType)) {
-                value = true;
-                break;
-              } else if (isAnnotation(valueType) && isAnnotationWithEnum(valueType)) {
-                value = true;
-                break;
-              }
+              assert !value;
+              boolean notLibraryOrTakeBootClasspath =
+                  !appInfo().definitionFor(valueType).isLibraryClass()
+                      || !appView.options().ignoreBootClasspathEnumsForMaindexTracing;
+              value =
+                  (isEnum(valueType) && notLibraryOrTakeBootClasspath)
+                      || (isAnnotation(valueType) && isAnnotationWithEnum(valueType));
             }
           }
+          if (value) {
+            break;
+          }
         }
       }
       annotationTypeContainEnum.put(dexType, value);
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 78aab7d..0fdc11c 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -518,7 +518,11 @@
   // Skipping min_api check and compiling an intermediate result intended for later merging.
   // Intermediate builds also emits or update synthesized classes mapping.
   public boolean intermediate = false;
-  public boolean readCompileTimeAnnotations = true;
+  public boolean retainCompileTimeAnnotations = true;
+  public boolean ignoreBootClasspathEnumsForMaindexTracing =
+      System.getProperty("com.android.tools.r8.ignoreBootClasspathEnumsForMaindexTracing") != null;
+  public boolean pruneNonVissibleAnnotationClasses =
+      System.getProperty("com.android.tools.r8.pruneNonVissibleAnnotationClasses") != null;
   public List<String> logArgumentsFilter = ImmutableList.of();
 
   // Flag to turn on/offLoad/store optimization in the Cf back-end.
diff --git a/src/test/java/com/android/tools/r8/GenerateMainDexListRunResult.java b/src/test/java/com/android/tools/r8/GenerateMainDexListRunResult.java
index 634cfe8..853c057 100644
--- a/src/test/java/com/android/tools/r8/GenerateMainDexListRunResult.java
+++ b/src/test/java/com/android/tools/r8/GenerateMainDexListRunResult.java
@@ -32,6 +32,12 @@
         });
   }
 
+  public final GenerateMainDexListRunResult inspectMainDexClasses(
+      Consumer<List<ClassReference>> consumer) {
+    consumer.accept(getMainDexList());
+    return self();
+  }
+
   public GenerateMainDexListRunResult inspectDiagnosticMessages(
       Consumer<TestDiagnosticMessages> consumer) {
     consumer.accept(state.getDiagnosticsMessages());
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java
index 0d02a13..8f3b1e4 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -1342,6 +1342,14 @@
     D8.runForTesting(command.getInputApp(), internalOptions);
   }
 
+  public static List<String> runGenerateMainDexList(
+      GenerateMainDexListCommand command, Consumer<InternalOptions> optionsConsumer)
+      throws CompilationFailedException {
+    InternalOptions internalOptions = command.getInternalOptions();
+    optionsConsumer.accept(internalOptions);
+    return GenerateMainDexList.runForTesting(command.getInputApp(), internalOptions);
+  }
+
   public static AndroidApp runDexer(String fileName, String outDir, String... extraArgs)
       throws IOException {
     List<String> args = new ArrayList<>();
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexRuntimeAndProgramEnumInAnnotationTest.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexRuntimeAndProgramEnumInAnnotationTest.java
new file mode 100644
index 0000000..9d5f2f1
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexRuntimeAndProgramEnumInAnnotationTest.java
@@ -0,0 +1,162 @@
+// 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.maindexlist;
+
+import static com.android.tools.r8.maindexlist.MainDexRuntimeAndProgramEnumInAnnotationTest.EnumForAnnotation.TEST;
+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.references.Reference;
+import com.android.tools.r8.utils.BooleanUtils;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+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 MainDexRuntimeAndProgramEnumInAnnotationTest extends TestBase {
+
+  Set<Class<?>> CUSTOM_CLASSES =
+      ImmutableSet.of(
+          B.class,
+          Main.class,
+          EnumForAnnotation.class,
+          RuntimeRetentionAnnotationWithProgramEnum.class);
+  Set<Class<?>> DEFAULT_CLASSES =
+      Sets.union(
+          CUSTOM_CLASSES,
+          ImmutableSet.of(
+              C.class,
+              RuntimeRetentionAnnotationWithRuntimeEnum.class,
+              RuntimeRetentionAnnotationWithoutEnum.class));
+
+  @Parameter(0)
+  public TestParameters parameters;
+
+  @Parameter(1)
+  public boolean ignoreBootclasspathEnumsForMaindexTracing;
+
+  @Parameters(name = "{0}, ignoreBootclasspathEnumsForMaindexTracing: {1}")
+  public static List<Object[]> parameters() {
+    return buildParameters(
+        getTestParameters()
+            .withDexRuntimes()
+            .withApiLevelsEndingAtExcluding(apiLevelWithNativeMultiDexSupport())
+            .build(),
+        BooleanUtils.values());
+  }
+
+  @Test
+  public void testMainDex() throws Exception {
+    testForMainDexListGenerator(temp)
+        .addInnerClasses(getClass())
+        .addLibraryFiles(ToolHelper.getMostRecentAndroidJar())
+        .addMainDexRules(
+            "-keep class " + Main.class.getTypeName() + " {",
+            "  public static void main(java.lang.String[]);",
+            "}")
+        .applyIf(
+            ignoreBootclasspathEnumsForMaindexTracing,
+            builder ->
+                builder.addOptionsModification(
+                    options -> {
+                      options.ignoreBootClasspathEnumsForMaindexTracing = true;
+                    }))
+        .run()
+        .inspectMainDexClasses(
+            mainDexList -> {
+              assertEquals(
+                  (ignoreBootclasspathEnumsForMaindexTracing ? CUSTOM_CLASSES : DEFAULT_CLASSES)
+                      .stream().map(Reference::classFromClass).collect(Collectors.toSet()),
+                  new HashSet<>(mainDexList));
+            });
+  }
+
+  @Test
+  public void testD8() throws Exception {
+    testForD8(temp)
+        .addInnerClasses(getClass())
+        .addLibraryFiles(ToolHelper.getMostRecentAndroidJar())
+        .setMinApi(parameters.getApiLevel())
+        .applyIf(
+            ignoreBootclasspathEnumsForMaindexTracing,
+            builder ->
+                builder.addOptionsModification(
+                    options -> options.ignoreBootClasspathEnumsForMaindexTracing = true))
+        .collectMainDexClasses()
+        .addMainDexRules(
+            "-keep class " + Main.class.getTypeName() + " {",
+            "  public static void main(java.lang.String[]);",
+            "}")
+        .compile()
+        .inspectMainDexClasses(
+            mainDexClasses -> {
+              assertEquals(
+                  (ignoreBootclasspathEnumsForMaindexTracing ? CUSTOM_CLASSES : DEFAULT_CLASSES)
+                      .stream().map(TestBase::typeName).collect(Collectors.toSet()),
+                  mainDexClasses);
+            });
+  }
+
+  public enum EnumForAnnotation {
+    TEST
+  }
+
+  @Retention(RetentionPolicy.RUNTIME)
+  @Target(ElementType.TYPE)
+  public @interface RuntimeRetentionAnnotationWithoutEnum {}
+
+  @Retention(RetentionPolicy.RUNTIME)
+  @Target(ElementType.TYPE)
+  public @interface RuntimeRetentionAnnotationWithProgramEnum {
+
+    EnumForAnnotation value() default TEST;
+  }
+
+  @Retention(RetentionPolicy.RUNTIME)
+  @Target(ElementType.TYPE)
+  public @interface RuntimeRetentionAnnotationWithRuntimeEnum {
+
+    ElementType value();
+  }
+
+  @RuntimeRetentionAnnotationWithoutEnum
+  public static class A {
+
+    public static void main(String[] args) {}
+  }
+
+  @RuntimeRetentionAnnotationWithProgramEnum
+  public static class B {
+
+    public static void main(String[] args) {}
+  }
+
+  @RuntimeRetentionAnnotationWithRuntimeEnum(ElementType.TYPE)
+  public static class C {
+
+    public static void main(String[] args) {}
+  }
+
+  public static class Main {
+
+    public static void main(String[] args) {
+      System.out.println("Hello, world!");
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexSourceAndClassRetentionTest.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexSourceAndClassRetentionTest.java
index 74cc91d..089f670 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/MainDexSourceAndClassRetentionTest.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexSourceAndClassRetentionTest.java
@@ -8,11 +8,9 @@
 
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.ToolHelper;
-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.BooleanUtils;
 import com.google.common.collect.ImmutableSet;
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
@@ -21,82 +19,106 @@
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+import java.util.stream.Collectors;
 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 MainDexSourceAndClassRetentionTest extends TestBase {
 
-  private final TestParameters parameters;
+  private static final Set<Class<?>> MAINDEX_CLASSES = ImmutableSet.of(Main.class);
 
-  @Parameters(name = "{0}")
-  public static TestParametersCollection data() {
-    return getTestParameters()
-        .withDexRuntimes()
-        .withApiLevelsEndingAtExcluding(apiLevelWithNativeMultiDexSupport())
-        .build();
-  }
+  @Parameter(0)
+  public TestParameters parameters;
 
-  public MainDexSourceAndClassRetentionTest(TestParameters parameters) {
-    this.parameters = parameters;
+  @Parameter(1)
+  public boolean pruneNonVisibleAnnotationClasses;
+
+  @Parameters(name = "{0}, pruneNonVisibleAnnotationClasses: {1}")
+  public static List<Object[]> parameters() {
+    return buildParameters(
+        getTestParameters()
+            .withDexRuntimes()
+            .withApiLevelsEndingAtExcluding(apiLevelWithNativeMultiDexSupport())
+            .build(),
+        BooleanUtils.values());
   }
 
   @Test
   public void testMainDex() throws Exception {
-    List<ClassReference> mainDexList =
-        testForMainDexListGenerator(temp)
-            .addInnerClasses(getClass())
-            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.B))
-            .addMainDexRules(
-                "-keep class " + Main.class.getTypeName() + " {",
-                "  public static void main(java.lang.String[]);",
-                "}")
-            .run()
-            .getMainDexList();
-    // TODO(b/186090713): {Foo, BAR} and {Source,Class}RetentionAnnotation should not be included.
-    assertEquals(
-        ImmutableSet.of(
-            Reference.classFromClass(Foo.class),
-            Reference.classFromClass(Bar.class),
-            Reference.classFromClass(Main.class),
-            Reference.classFromClass(ClassRetentionAnnotation.class),
-            Reference.classFromClass(SourceRetentionAnnotation.class)),
-        new HashSet<>(mainDexList));
+    testForMainDexListGenerator(temp)
+        .addInnerClasses(getClass())
+        .addLibraryFiles(ToolHelper.getMostRecentAndroidJar())
+        .addMainDexRules(
+            "-keep class " + Main.class.getTypeName() + " {",
+            "  public static void main(java.lang.String[]);",
+            "}")
+        .applyIf(
+            pruneNonVisibleAnnotationClasses,
+            builder -> {
+              builder.addOptionsModification(
+                  options -> options.pruneNonVissibleAnnotationClasses = true);
+            })
+        .run()
+        .inspectMainDexClasses(
+            mainDexList -> {
+              assertEquals(
+                  MAINDEX_CLASSES.stream()
+                      .map(Reference::classFromClass)
+                      .collect(Collectors.toSet()),
+                  new HashSet<>(mainDexList));
+            });
   }
 
   @Test
   public void testD8() throws Exception {
-    Set<String> mainDexClasses =
-        testForD8(temp)
-            .addInnerClasses(getClass())
-            .addLibraryFiles(ToolHelper.getMostRecentAndroidJar())
-            .setMinApi(parameters.getApiLevel())
-            .collectMainDexClasses()
-            .addMainDexRules(
-                "-keep class " + Main.class.getTypeName() + " {",
-                "  public static void main(java.lang.String[]);",
-                "}")
-            .compile()
-            .getMainDexClasses();
-    // TODO(b/186090713): {Foo, BAR} and {Source,Class}RetentionAnnotation should not be included.
-    assertEquals(
-        ImmutableSet.of(
-            typeName(Foo.class),
-            typeName(Bar.class),
-            typeName(Main.class),
-            typeName(ClassRetentionAnnotation.class),
-            typeName(SourceRetentionAnnotation.class)),
-        mainDexClasses);
+    testForD8(temp)
+        .addInnerClasses(getClass())
+        .addLibraryFiles(ToolHelper.getMostRecentAndroidJar())
+        .setMinApi(parameters.getApiLevel())
+        .applyIf(
+            pruneNonVisibleAnnotationClasses,
+            builder -> {
+              builder.addOptionsModification(
+                  options -> options.pruneNonVissibleAnnotationClasses = true);
+            })
+        .collectMainDexClasses()
+        .addMainDexRules(
+            "-keep class " + Main.class.getTypeName() + " {",
+            "  public static void main(java.lang.String[]);",
+            "}")
+        .allowStdoutMessages()
+        .compile()
+        .inspect(
+            inspector -> {
+              // Source and class retention annotation classes are still in the output, but does not
+              // annotate anything.
+              assertEquals(
+                  pruneNonVisibleAnnotationClasses,
+                  !inspector.clazz(SourceRetentionAnnotation.class).isPresent());
+              assertEquals(
+                  pruneNonVisibleAnnotationClasses,
+                  !inspector.clazz(ClassRetentionAnnotation.class).isPresent());
+              assertEquals(0, inspector.clazz(Main.class).annotations().size());
+              assertEquals(0, inspector.clazz(A.class).annotations().size());
+            })
+        .inspectMainDexClasses(
+            mainDexClasses -> {
+              assertEquals(
+                  MAINDEX_CLASSES.stream().map(TestBase::typeName).collect(Collectors.toSet()),
+                  new HashSet<>(mainDexClasses));
+            });
   }
 
   public enum Foo {
-    TEST;
+    TEST
   }
 
   public enum Bar {
-    TEST;
+    TEST
   }
 
   @Retention(RetentionPolicy.SOURCE)
@@ -115,6 +137,13 @@
 
   @SourceRetentionAnnotation(Foo.TEST)
   @ClassRetentionAnnotation(Bar.TEST)
+  public static class A {
+
+    public static void main(String[] args) {}
+  }
+
+  @SourceRetentionAnnotation(Foo.TEST)
+  @ClassRetentionAnnotation(Bar.TEST)
   public static class Main {
 
     public static void main(String[] args) {}
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentClassSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentClassSubject.java
index 4ea9a82..2d74926 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentClassSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentClassSubject.java
@@ -110,6 +110,11 @@
   }
 
   @Override
+  public List<AnnotationSubject> annotations() {
+    throw new Unreachable("Cannot determine if an absent class has annotations");
+  }
+
+  @Override
   public AnnotationSubject annotation(String name) {
     return new AbsentAnnotationSubject();
   }
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentFieldSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentFieldSubject.java
index 6d7067a..8d91f3c 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentFieldSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentFieldSubject.java
@@ -10,6 +10,7 @@
 import com.android.tools.r8.graph.DexValue;
 import com.android.tools.r8.naming.MemberNaming.Signature;
 import com.android.tools.r8.references.FieldReference;
+import java.util.List;
 
 public class AbsentFieldSubject extends FieldSubject {
 
@@ -59,6 +60,11 @@
   }
 
   @Override
+  public List<AnnotationSubject> annotations() {
+    throw new Unreachable("Cannot determine if an absent field has annotations");
+  }
+
+  @Override
   public AnnotationSubject annotation(String name) {
     return new AbsentAnnotationSubject();
   }
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentMethodSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentMethodSubject.java
index 9299e7f..4ffcdb4 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentMethodSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentMethodSubject.java
@@ -12,6 +12,7 @@
 import com.android.tools.r8.ir.code.IRCode;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.naming.MemberNaming.Signature;
+import java.util.List;
 
 public class AbsentMethodSubject extends MethodSubject {
 
@@ -116,6 +117,11 @@
   }
 
   @Override
+  public List<AnnotationSubject> annotations() {
+    throw new Unreachable("Cannot determine if an absent method has annotations");
+  }
+
+  @Override
   public AnnotationSubject annotation(String name) {
     return new AbsentAnnotationSubject();
   }
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/ClassOrMemberSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/ClassOrMemberSubject.java
index 2dc0774..754b470 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/ClassOrMemberSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/ClassOrMemberSubject.java
@@ -6,9 +6,12 @@
 
 import com.android.tools.r8.graph.AccessFlags;
 import java.lang.annotation.Annotation;
+import java.util.List;
 
 public abstract class ClassOrMemberSubject extends Subject {
 
+  public abstract List<AnnotationSubject> annotations();
+
   public abstract AnnotationSubject annotation(String name);
 
   public final AnnotationSubject annotation(Class<? extends Annotation> clazz) {
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java
index 318f0d9..a0839d8 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java
@@ -349,6 +349,15 @@
   }
 
   @Override
+  public List<AnnotationSubject> annotations() {
+    List<AnnotationSubject> result = new ArrayList<>();
+    for (DexAnnotation annotation : dexClass.annotations().annotations) {
+      result.add(new FoundAnnotationSubject(annotation));
+    }
+    return result;
+  }
+
+  @Override
   public AnnotationSubject annotation(String name) {
     // Ensure we don't check for annotations represented as attributes.
     assert !name.endsWith("EnclosingClass")
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundFieldSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundFieldSubject.java
index 023c088..2ea0107 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundFieldSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundFieldSubject.java
@@ -4,6 +4,7 @@
 
 package com.android.tools.r8.utils.codeinspector;
 
+import com.android.tools.r8.errors.Unimplemented;
 import com.android.tools.r8.graph.AccessFlags;
 import com.android.tools.r8.graph.DexAnnotation;
 import com.android.tools.r8.graph.DexEncodedField;
@@ -15,6 +16,7 @@
 import com.android.tools.r8.naming.signature.GenericSignatureParser;
 import com.android.tools.r8.references.FieldReference;
 import com.android.tools.r8.references.Reference;
+import java.util.List;
 
 public class FoundFieldSubject extends FieldSubject {
 
@@ -112,6 +114,11 @@
   }
 
   @Override
+  public List<AnnotationSubject> annotations() {
+    throw new Unimplemented();
+  }
+
+  @Override
   public AnnotationSubject annotation(String name) {
     DexAnnotation annotation = codeInspector.findAnnotation(name, dexField.annotations());
     return annotation == null
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java
index d781ef5..7c882b4 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java
@@ -325,6 +325,11 @@
   }
 
   @Override
+  public List<AnnotationSubject> annotations() {
+    throw new Unimplemented();
+  }
+
+  @Override
   public AnnotationSubject annotation(String name) {
     DexAnnotation annotation = codeInspector.findAnnotation(name, dexMethod.annotations());
     return annotation == null
diff --git a/third_party/bazel.tar.gz.sha1 b/third_party/bazel.tar.gz.sha1
index b1968d5..1bf5a5d 100644
--- a/third_party/bazel.tar.gz.sha1
+++ b/third_party/bazel.tar.gz.sha1
@@ -1 +1 @@
-83891f00eacc568434eb59a43ba2ee31ac5c4342
\ No newline at end of file
+5b62e958e734266ebf0e136ee23e440a99b508e1
\ No newline at end of file
diff --git a/third_party/openjdk/desugar_jdk_libs_11.tar.gz.sha1 b/third_party/openjdk/desugar_jdk_libs_11.tar.gz.sha1
index 64f4609..4e9a38b 100644
--- a/third_party/openjdk/desugar_jdk_libs_11.tar.gz.sha1
+++ b/third_party/openjdk/desugar_jdk_libs_11.tar.gz.sha1
@@ -1 +1 @@
-112c4e2bbfdd1e825ee02a98416ba385ad5433d0
\ No newline at end of file
+ae9eb01960d396ab603c611960f456d14ce7a1a8
\ No newline at end of file
diff --git a/tools/archive_desugar_jdk_libs.py b/tools/archive_desugar_jdk_libs.py
index d2c1ef1..a44524e 100755
--- a/tools/archive_desugar_jdk_libs.py
+++ b/tools/archive_desugar_jdk_libs.py
@@ -33,6 +33,10 @@
 
 def ParseOptions(argv):
   result = optparse.OptionParser()
+  result.add_option('--variant',
+      help='.',
+      choices = ['jdk8', 'jdk11'],
+      default='jdk8')
   result.add_option('--dry-run', '--dry_run',
       help='Running on bot, use third_party dependency.',
       default=False,
@@ -90,7 +94,11 @@
     raise Exception('Variant ' + variant + 'is not supported')
   with utils.ChangedWorkingDirectory(checkout_dir):
     bazel = os.path.join(utils.BAZEL_TOOL, 'lib', 'bazel', 'bin', 'bazel')
-    cmd = [bazel, 'build', 'maven_release' + ('_jdk11' if variant == 'jdk11' else '')]
+    cmd = [
+        bazel,
+        '--bazelrc=/dev/null',
+        'build',
+        'maven_release' + ('_jdk11' if variant == 'jdk11' else '')]
     utils.PrintCmd(cmd)
     subprocess.check_call(cmd)
     cmd = [bazel, 'shutdown']
@@ -108,7 +116,7 @@
     maven_zip = os.path.join(
       checkout_dir,
       'bazel-bin',
-      LIBRARY_NAME + ('_jdk11' if variant != 'jdk11' else '') +'.zip')
+      LIBRARY_NAME + ('_jdk11' if variant == 'jdk11' else '') +'.zip')
     return (library_jar, maven_zip)
 
 
@@ -138,7 +146,7 @@
   if options.build_only:
     with utils.TempDir() as checkout_dir:
       CloneDesugaredLibrary(options.github_account, checkout_dir)
-      (library_jar, maven_zip) = BuildDesugaredLibrary(checkout_dir, "jdk8")
+      (library_jar, maven_zip) = BuildDesugaredLibrary(checkout_dir, options.variant)
       shutil.copyfile(
         library_jar,
         os.path.join(options.build_only, os.path.basename(library_jar)))
@@ -160,7 +168,7 @@
       raise Exception(
           'Target archive directory %s already exists' % destination)
 
-    (library_jar, maven_zip) = BuildDesugaredLibrary(checkout_dir, "jdk8")
+    (library_jar, maven_zip) = BuildDesugaredLibrary(checkout_dir, options.variant)
 
     storage_path = LIBRARY_NAME + '/' + version
     # Upload the jar file with the library.