Extend keep anno tests to R8 partial

Bug: b/392828287
Change-Id: Ied8e3743b664315950ed236d94780e6f93ec61e8
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index 1359ad8..57d8c43 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -298,7 +298,10 @@
         timing.begin("Read app");
         ApplicationReader applicationReader = new ApplicationReader(inputApp, options, timing);
         LazyLoadedDexApplication lazyLoaded = applicationReader.read(executorService);
-        keepDeclarations = lazyLoaded.getKeepDeclarations();
+        keepDeclarations =
+            options.partialSubCompilationConfiguration != null
+                ? options.partialSubCompilationConfiguration.asR8().getAndClearKeepDeclarations()
+                : lazyLoaded.getKeepDeclarations();
         timing.begin("To direct app");
         DirectMappedDexApplication application = lazyLoaded.toDirect();
         timing.end();
diff --git a/src/main/java/com/android/tools/r8/R8Partial.java b/src/main/java/com/android/tools/r8/R8Partial.java
index 02c612c..4c34715 100644
--- a/src/main/java/com/android/tools/r8/R8Partial.java
+++ b/src/main/java/com/android/tools/r8/R8Partial.java
@@ -8,6 +8,8 @@
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.features.FeatureSplitConfiguration;
 import com.android.tools.r8.graph.DirectMappedDexApplication;
+import com.android.tools.r8.graph.LazyLoadedDexApplication;
+import com.android.tools.r8.keepanno.ast.KeepDeclaration;
 import com.android.tools.r8.partial.R8PartialD8Result;
 import com.android.tools.r8.partial.R8PartialInput;
 import com.android.tools.r8.partial.R8PartialProgramPartioning;
@@ -85,14 +87,17 @@
 
   private R8PartialInput runProcessInputStep(AndroidApp androidApp, ExecutorService executor)
       throws IOException {
-    DirectMappedDexApplication app =
-        new ApplicationReader(androidApp, options, timing).read(executor).toDirect();
+    LazyLoadedDexApplication lazyApp =
+        new ApplicationReader(androidApp, options, timing).read(executor);
+    List<KeepDeclaration> keepDeclarations = lazyApp.getKeepDeclarations();
+    DirectMappedDexApplication app = lazyApp.toDirect();
     R8PartialProgramPartioning partioning = R8PartialProgramPartioning.create(app);
     return new R8PartialInput(
         partioning.getD8Classes(),
         partioning.getR8Classes(),
         app.classpathClasses(),
-        app.libraryClasses());
+        app.libraryClasses(),
+        keepDeclarations);
   }
 
   private R8PartialD8Result runD8Step(R8PartialInput input, ExecutorService executor)
@@ -193,12 +198,16 @@
             d8Result.getArtProfiles(),
             d8Result.getClassToFeatureSplitMap(),
             d8Result.getDexedClasses(),
+            input.getKeepDeclarations(),
             d8Result.getStartupProfile(),
             timing);
     r8Options.setArtProfileOptions(
         new ArtProfileOptions(r8Options, options.getArtProfileOptions()));
     r8Options.setFeatureSplitConfiguration(options.getFeatureSplitConfiguration());
     r8Options.setStartupOptions(new StartupOptions(r8Options, options.getStartupOptions()));
+    r8Options.setKeepSpecificationSources(options.getKeepSpecifications());
+    r8Options.getTestingOptions().enableEmbeddedKeepAnnotations =
+        options.getTestingOptions().enableEmbeddedKeepAnnotations;
     r8Options.mapConsumer = options.mapConsumer;
     if (options.androidResourceProvider != null) {
       r8Options.androidResourceProvider = options.androidResourceProvider;
diff --git a/src/main/java/com/android/tools/r8/partial/R8PartialInput.java b/src/main/java/com/android/tools/r8/partial/R8PartialInput.java
index ba75e6b..07b713c 100644
--- a/src/main/java/com/android/tools/r8/partial/R8PartialInput.java
+++ b/src/main/java/com/android/tools/r8/partial/R8PartialInput.java
@@ -11,6 +11,7 @@
 import com.android.tools.r8.graph.DexLibraryClass;
 import com.android.tools.r8.graph.DexProgramClass;
 import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.keepanno.ast.KeepDeclaration;
 import com.android.tools.r8.utils.InternalClasspathOrLibraryClassProvider;
 import com.android.tools.r8.utils.InternalProgramClassProvider;
 import com.android.tools.r8.utils.MapUtils;
@@ -18,6 +19,7 @@
 import java.io.IOException;
 import java.util.Collection;
 import java.util.IdentityHashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
@@ -27,18 +29,21 @@
   private final Collection<DexProgramClass> r8Classes;
   private final Map<DexType, DexClasspathClass> classpathClasses;
   private final Map<DexType, DexLibraryClass> libraryClasses;
+  private final List<KeepDeclaration> keepDeclarations;
 
   public R8PartialInput(
       Collection<DexProgramClass> d8Classes,
       Collection<DexProgramClass> r8Classes,
       Collection<DexClasspathClass> classpathClasses,
-      Collection<DexLibraryClass> libraryClasses) {
+      Collection<DexLibraryClass> libraryClasses,
+      List<KeepDeclaration> keepDeclarations) {
     this.d8Classes = d8Classes;
     this.r8Classes = r8Classes;
     this.classpathClasses =
         MapUtils.transform(classpathClasses, IdentityHashMap::new, DexClass::getType);
     this.libraryClasses =
         MapUtils.transform(libraryClasses, IdentityHashMap::new, DexClass::getType);
+    this.keepDeclarations = keepDeclarations;
   }
 
   public void configure(D8Command.Builder commandBuilder) throws IOException {
@@ -73,4 +78,8 @@
     // the classes to the D8 compilation.
     return SetUtils.mapIdentityHashSet(r8Classes, DexClass::getType);
   }
+
+  public List<KeepDeclaration> getKeepDeclarations() {
+    return keepDeclarations;
+  }
 }
diff --git a/src/main/java/com/android/tools/r8/partial/R8PartialSubCompilationConfiguration.java b/src/main/java/com/android/tools/r8/partial/R8PartialSubCompilationConfiguration.java
index cc39bf2..2e1582d 100644
--- a/src/main/java/com/android/tools/r8/partial/R8PartialSubCompilationConfiguration.java
+++ b/src/main/java/com/android/tools/r8/partial/R8PartialSubCompilationConfiguration.java
@@ -16,6 +16,7 @@
 import com.android.tools.r8.graph.ProgramDefinition;
 import com.android.tools.r8.ir.conversion.MethodConversionOptions;
 import com.android.tools.r8.ir.conversion.MethodConversionOptions.Target;
+import com.android.tools.r8.keepanno.ast.KeepDeclaration;
 import com.android.tools.r8.profile.art.ArtProfile;
 import com.android.tools.r8.profile.art.ArtProfileCollection;
 import com.android.tools.r8.profile.art.ArtProfileMethodRule;
@@ -156,12 +157,14 @@
     private ArtProfileCollection artProfiles;
     private ClassToFeatureSplitMap classToFeatureSplitMap;
     private Map<DexType, DexProgramClass> dexingOutputClasses;
+    private List<KeepDeclaration> keepDeclarations;
     private StartupProfile startupProfile;
 
     public R8PartialR8SubCompilationConfiguration(
         ArtProfileCollection artProfiles,
         ClassToFeatureSplitMap classToFeatureSplitMap,
         Collection<DexProgramClass> dexingOutputClasses,
+        List<KeepDeclaration> keepDeclarations,
         StartupProfile startupProfile,
         Timing timing) {
       super(timing);
@@ -169,6 +172,7 @@
       this.classToFeatureSplitMap = classToFeatureSplitMap;
       this.dexingOutputClasses =
           MapUtils.transform(dexingOutputClasses, IdentityHashMap::new, DexClass::getType);
+      this.keepDeclarations = keepDeclarations;
       this.startupProfile = startupProfile;
     }
 
@@ -185,6 +189,13 @@
       return dexingOutputClasses.values();
     }
 
+    public List<KeepDeclaration> getAndClearKeepDeclarations() {
+      List<KeepDeclaration> result = keepDeclarations;
+      assert result != null;
+      keepDeclarations = null;
+      return result;
+    }
+
     public StartupProfile getStartupProfile() {
       assert startupProfile != null;
       return startupProfile;
diff --git a/src/test/java/com/android/tools/r8/keepanno/AnnotationPatternAnyRetentionTest.java b/src/test/java/com/android/tools/r8/keepanno/AnnotationPatternAnyRetentionTest.java
index 31de01d..dea3f0a 100644
--- a/src/test/java/com/android/tools/r8/keepanno/AnnotationPatternAnyRetentionTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/AnnotationPatternAnyRetentionTest.java
@@ -13,7 +13,6 @@
 import com.android.tools.r8.keepanno.annotations.KeepTarget;
 import com.android.tools.r8.keepanno.annotations.UsedByReflection;
 import com.android.tools.r8.keepanno.annotations.UsesReflection;
-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;
@@ -38,7 +37,7 @@
   @Parameterized.Parameters(name = "{0}")
   public static List<KeepAnnoParameters> data() {
     return createParameters(
-        getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build());
+        getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/keepanno/AnnotationPatternClassRetentionTest.java b/src/test/java/com/android/tools/r8/keepanno/AnnotationPatternClassRetentionTest.java
index df1bee8..860f1bb 100644
--- a/src/test/java/com/android/tools/r8/keepanno/AnnotationPatternClassRetentionTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/AnnotationPatternClassRetentionTest.java
@@ -14,7 +14,6 @@
 import com.android.tools.r8.keepanno.annotations.KeepTarget;
 import com.android.tools.r8.keepanno.annotations.UsedByReflection;
 import com.android.tools.r8.keepanno.annotations.UsesReflection;
-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;
@@ -39,7 +38,7 @@
   @Parameterized.Parameters(name = "{0}")
   public static List<KeepAnnoParameters> data() {
     return createParameters(
-        getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build());
+        getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/keepanno/AnnotationPatternMultipleTest.java b/src/test/java/com/android/tools/r8/keepanno/AnnotationPatternMultipleTest.java
index feafc7f..bc8a3a7 100644
--- a/src/test/java/com/android/tools/r8/keepanno/AnnotationPatternMultipleTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/AnnotationPatternMultipleTest.java
@@ -15,7 +15,6 @@
 import com.android.tools.r8.keepanno.annotations.KeepTarget;
 import com.android.tools.r8.keepanno.annotations.UsedByReflection;
 import com.android.tools.r8.keepanno.annotations.UsesReflection;
-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;
@@ -40,7 +39,7 @@
   @Parameterized.Parameters(name = "{0}")
   public static List<KeepAnnoParameters> data() {
     return createParameters(
-        getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build());
+        getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/keepanno/ArrayPatternsTest.java b/src/test/java/com/android/tools/r8/keepanno/ArrayPatternsTest.java
index 2f1f572..d37eb76 100644
--- a/src/test/java/com/android/tools/r8/keepanno/ArrayPatternsTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/ArrayPatternsTest.java
@@ -13,7 +13,6 @@
 import com.android.tools.r8.keepanno.annotations.TypePattern;
 import com.android.tools.r8.keepanno.annotations.UsedByReflection;
 import com.android.tools.r8.keepanno.annotations.UsesReflection;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
@@ -35,7 +34,7 @@
   @Parameterized.Parameters(name = "{0}")
   public static List<KeepAnnoParameters> data() {
     return createParameters(
-        getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build());
+        getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/keepanno/CheckOptimizedOutAnnotationTest.java b/src/test/java/com/android/tools/r8/keepanno/CheckOptimizedOutAnnotationTest.java
index f44c479..8382ce5 100644
--- a/src/test/java/com/android/tools/r8/keepanno/CheckOptimizedOutAnnotationTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/CheckOptimizedOutAnnotationTest.java
@@ -4,6 +4,7 @@
 package com.android.tools.r8.keepanno;
 
 import static com.android.tools.r8.DiagnosticsMatcher.diagnosticMessage;
+import static com.android.tools.r8.utils.codeinspector.AssertUtils.assertThrowsIf;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isAbsent;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.CoreMatchers.allOf;
@@ -19,7 +20,6 @@
 import com.android.tools.r8.DiagnosticsMatcher;
 import com.android.tools.r8.errors.CheckDiscardDiagnostic;
 import com.android.tools.r8.keepanno.annotations.CheckOptimizedOut;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
@@ -39,7 +39,7 @@
   @Parameterized.Parameters(name = "{0}")
   public static List<KeepAnnoParameters> data() {
     return createParameters(
-        getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build());
+        getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build());
   }
 
   @Test
@@ -58,34 +58,45 @@
   @Test
   public void testCurrentR8() throws Throwable {
     assumeTrue(parameters.isR8() && parameters.isCurrentR8());
-    testForKeepAnno(parameters)
-        .enableNativeInterpretation()
-        .addProgramClasses(getInputClasses())
-        .addKeepMainRule(TestClass.class)
-        .applyIfR8Current(
-            b ->
-                b.allowDiagnosticWarningMessages()
-                    .setDiagnosticsLevelModifier(
-                        (level, diagnostic) ->
-                            level == DiagnosticsLevel.ERROR ? DiagnosticsLevel.WARNING : level)
-                    .compileWithExpectedDiagnostics(
-                        diagnostics -> {
-                          diagnostics
-                              .assertOnlyWarnings()
-                              .assertWarningsMatch(
-                                  DiagnosticsMatcher.diagnosticType(CheckDiscardDiagnostic.class));
-                          CheckDiscardDiagnostic discard =
-                              (CheckDiscardDiagnostic) diagnostics.getWarnings().get(0);
-                          // The discard error should report one error for A.toString.
-                          assertEquals(
-                              discard.getDiagnosticMessage(), 1, discard.getNumberOfFailures());
-                          assertThat(
-                              discard,
-                              diagnosticMessage(containsString("A.toString() was not discarded")));
-                        })
-                    .run(parameters.getRuntime(), TestClass.class)
-                    .assertSuccessWithOutput(EXPECTED)
-                    .inspect(this::checkOutput));
+    // TODO(b/392828287): Investigate R8 partial.
+    assertThrowsIf(
+        parameters.isR8Partial(),
+        RuntimeException.class,
+        () ->
+            testForKeepAnno(parameters)
+                .enableNativeInterpretation()
+                .addProgramClasses(getInputClasses())
+                .addKeepMainRule(TestClass.class)
+                .applyIfR8Current(
+                    b ->
+                        b.allowDiagnosticWarningMessages()
+                            .setDiagnosticsLevelModifier(
+                                (level, diagnostic) ->
+                                    level == DiagnosticsLevel.ERROR
+                                        ? DiagnosticsLevel.WARNING
+                                        : level)
+                            .compileWithExpectedDiagnostics(
+                                diagnostics -> {
+                                  diagnostics
+                                      .assertOnlyWarnings()
+                                      .assertWarningsMatch(
+                                          DiagnosticsMatcher.diagnosticType(
+                                              CheckDiscardDiagnostic.class));
+                                  CheckDiscardDiagnostic discard =
+                                      (CheckDiscardDiagnostic) diagnostics.getWarnings().get(0);
+                                  // The discard error should report one error for A.toString.
+                                  assertEquals(
+                                      discard.getDiagnosticMessage(),
+                                      1,
+                                      discard.getNumberOfFailures());
+                                  assertThat(
+                                      discard,
+                                      diagnosticMessage(
+                                          containsString("A.toString() was not discarded")));
+                                })
+                            .run(parameters.getRuntime(), TestClass.class)
+                            .assertSuccessWithOutput(EXPECTED)
+                            .inspect(this::checkOutput)));
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/keepanno/CheckRemovedAnnotationTest.java b/src/test/java/com/android/tools/r8/keepanno/CheckRemovedAnnotationTest.java
index 2d13454..c3ad87d 100644
--- a/src/test/java/com/android/tools/r8/keepanno/CheckRemovedAnnotationTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/CheckRemovedAnnotationTest.java
@@ -4,6 +4,7 @@
 package com.android.tools.r8.keepanno;
 
 import static com.android.tools.r8.DiagnosticsMatcher.diagnosticMessage;
+import static com.android.tools.r8.utils.codeinspector.AssertUtils.assertThrowsIf;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isAbsent;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.CoreMatchers.allOf;
@@ -19,7 +20,6 @@
 import com.android.tools.r8.DiagnosticsMatcher;
 import com.android.tools.r8.errors.CheckDiscardDiagnostic;
 import com.android.tools.r8.keepanno.annotations.CheckRemoved;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
@@ -39,7 +39,7 @@
   @Parameterized.Parameters(name = "{0}")
   public static List<KeepAnnoParameters> data() {
     return createParameters(
-        getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build());
+        getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build());
   }
 
   @Test
@@ -57,38 +57,49 @@
   @Test
   public void testCurrentR8() throws Exception {
     assumeTrue(parameters.isR8() && parameters.isCurrentR8());
-    testForKeepAnno(parameters)
-        .enableNativeInterpretation()
-        .addProgramClasses(getInputClasses())
-        .addKeepMainRule(TestClass.class)
-        .applyIfR8Current(
-            b ->
-                b.allowDiagnosticWarningMessages()
-                    .setDiagnosticsLevelModifier(
-                        (level, diagnostic) ->
-                            level == DiagnosticsLevel.ERROR ? DiagnosticsLevel.WARNING : level)
-                    .compileWithExpectedDiagnostics(
-                        diagnostics -> {
-                          diagnostics
-                              .assertOnlyWarnings()
-                              .assertWarningsMatch(
-                                  DiagnosticsMatcher.diagnosticType(CheckDiscardDiagnostic.class));
-                          CheckDiscardDiagnostic discard =
-                              (CheckDiscardDiagnostic) diagnostics.getWarnings().get(0);
-                          // The discard error should report for both the method A.foo and the class
-                          // B.
-                          assertEquals(
-                              discard.getDiagnosticMessage(), 2, discard.getNumberOfFailures());
-                          assertThat(
-                              discard,
-                              diagnosticMessage(
-                                  allOf(
-                                      containsString("A.foo() was not discarded"),
-                                      containsString("B was not discarded"))));
-                        })
-                    .run(parameters.getRuntime(), TestClass.class)
-                    .assertSuccessWithOutput(EXPECTED)
-                    .inspect(this::checkOutput));
+    // TODO(b/392828287): Investigate R8 partial.
+    assertThrowsIf(
+        parameters.isR8Partial(),
+        RuntimeException.class,
+        () ->
+            testForKeepAnno(parameters)
+                .enableNativeInterpretation()
+                .addProgramClasses(getInputClasses())
+                .addKeepMainRule(TestClass.class)
+                .applyIfR8Current(
+                    b ->
+                        b.allowDiagnosticWarningMessages()
+                            .setDiagnosticsLevelModifier(
+                                (level, diagnostic) ->
+                                    level == DiagnosticsLevel.ERROR
+                                        ? DiagnosticsLevel.WARNING
+                                        : level)
+                            .compileWithExpectedDiagnostics(
+                                diagnostics -> {
+                                  diagnostics
+                                      .assertOnlyWarnings()
+                                      .assertWarningsMatch(
+                                          DiagnosticsMatcher.diagnosticType(
+                                              CheckDiscardDiagnostic.class));
+                                  CheckDiscardDiagnostic discard =
+                                      (CheckDiscardDiagnostic) diagnostics.getWarnings().get(0);
+                                  // The discard error should report for both the method A.foo and
+                                  // the class
+                                  // B.
+                                  assertEquals(
+                                      discard.getDiagnosticMessage(),
+                                      2,
+                                      discard.getNumberOfFailures());
+                                  assertThat(
+                                      discard,
+                                      diagnosticMessage(
+                                          allOf(
+                                              containsString("A.foo() was not discarded"),
+                                              containsString("B was not discarded"))));
+                                })
+                            .run(parameters.getRuntime(), TestClass.class)
+                            .assertSuccessWithOutput(EXPECTED)
+                            .inspect(this::checkOutput)));
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/keepanno/ClassAnnotatedByAnyAnnoConstraintPatternTest.java b/src/test/java/com/android/tools/r8/keepanno/ClassAnnotatedByAnyAnnoConstraintPatternTest.java
index 7d56b7a..c1db6c8 100644
--- a/src/test/java/com/android/tools/r8/keepanno/ClassAnnotatedByAnyAnnoConstraintPatternTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/ClassAnnotatedByAnyAnnoConstraintPatternTest.java
@@ -15,7 +15,6 @@
 import com.android.tools.r8.keepanno.annotations.KeepTarget;
 import com.android.tools.r8.keepanno.annotations.UsedByReflection;
 import com.android.tools.r8.keepanno.annotations.UsesReflection;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
@@ -39,7 +38,7 @@
   @Parameterized.Parameters(name = "{0}")
   public static List<KeepAnnoParameters> data() {
     return createParameters(
-        getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build());
+        getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/keepanno/ClassAnnotatedByAnyAnnoPatternTest.java b/src/test/java/com/android/tools/r8/keepanno/ClassAnnotatedByAnyAnnoPatternTest.java
index 7f3840f..79566db 100644
--- a/src/test/java/com/android/tools/r8/keepanno/ClassAnnotatedByAnyAnnoPatternTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/ClassAnnotatedByAnyAnnoPatternTest.java
@@ -14,7 +14,6 @@
 import com.android.tools.r8.keepanno.annotations.KeepTarget;
 import com.android.tools.r8.keepanno.annotations.UsedByReflection;
 import com.android.tools.r8.keepanno.annotations.UsesReflection;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
@@ -38,7 +37,7 @@
   @Parameterized.Parameters(name = "{0}")
   public static List<KeepAnnoParameters> data() {
     return createParameters(
-        getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build());
+        getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/keepanno/ClassAnnotatedByPatternsTest.java b/src/test/java/com/android/tools/r8/keepanno/ClassAnnotatedByPatternsTest.java
index 6d0f966..67fbdae 100644
--- a/src/test/java/com/android/tools/r8/keepanno/ClassAnnotatedByPatternsTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/ClassAnnotatedByPatternsTest.java
@@ -14,7 +14,6 @@
 import com.android.tools.r8.keepanno.annotations.KeepTarget;
 import com.android.tools.r8.keepanno.annotations.UsedByReflection;
 import com.android.tools.r8.keepanno.annotations.UsesReflection;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
@@ -38,7 +37,7 @@
   @Parameterized.Parameters(name = "{0}")
   public static List<KeepAnnoParameters> data() {
     return createParameters(
-        getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build());
+        getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/keepanno/ClassAnnotatedBySingleAnnotationTest.java b/src/test/java/com/android/tools/r8/keepanno/ClassAnnotatedBySingleAnnotationTest.java
index f98c155..b545044 100644
--- a/src/test/java/com/android/tools/r8/keepanno/ClassAnnotatedBySingleAnnotationTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/ClassAnnotatedBySingleAnnotationTest.java
@@ -15,7 +15,6 @@
 import com.android.tools.r8.keepanno.annotations.KeepTarget;
 import com.android.tools.r8.keepanno.annotations.UsedByReflection;
 import com.android.tools.r8.keepanno.annotations.UsesReflection;
-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;
@@ -40,7 +39,7 @@
   @Parameterized.Parameters(name = "{0}")
   public static List<KeepAnnoParameters> data() {
     return createParameters(
-        getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build());
+        getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/keepanno/ClassNameStringPatternsTest.java b/src/test/java/com/android/tools/r8/keepanno/ClassNameStringPatternsTest.java
index 43cf4a7..8961217 100644
--- a/src/test/java/com/android/tools/r8/keepanno/ClassNameStringPatternsTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/ClassNameStringPatternsTest.java
@@ -15,7 +15,6 @@
 import com.android.tools.r8.keepanno.annotations.TypePattern;
 import com.android.tools.r8.keepanno.annotations.UsedByReflection;
 import com.android.tools.r8.keepanno.annotations.UsesReflection;
-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;
@@ -37,7 +36,7 @@
   @Parameterized.Parameters(name = "{0}")
   public static List<KeepAnnoParameters> data() {
     return createParameters(
-        getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build());
+        getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/keepanno/FieldNameStringPatternsTest.java b/src/test/java/com/android/tools/r8/keepanno/FieldNameStringPatternsTest.java
index d6a6b90..fafbe72 100644
--- a/src/test/java/com/android/tools/r8/keepanno/FieldNameStringPatternsTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/FieldNameStringPatternsTest.java
@@ -13,7 +13,6 @@
 import com.android.tools.r8.keepanno.annotations.StringPattern;
 import com.android.tools.r8.keepanno.annotations.UsedByReflection;
 import com.android.tools.r8.keepanno.annotations.UsesReflection;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
@@ -34,7 +33,7 @@
   @Parameterized.Parameters(name = "{0}")
   public static List<KeepAnnoParameters> data() {
     return createParameters(
-        getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build());
+        getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/keepanno/FieldPatternsTest.java b/src/test/java/com/android/tools/r8/keepanno/FieldPatternsTest.java
index 669d945..8cea2b6 100644
--- a/src/test/java/com/android/tools/r8/keepanno/FieldPatternsTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/FieldPatternsTest.java
@@ -11,7 +11,6 @@
 import com.android.tools.r8.keepanno.annotations.KeepTarget;
 import com.android.tools.r8.keepanno.annotations.TypePattern;
 import com.android.tools.r8.keepanno.annotations.UsesReflection;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
@@ -32,7 +31,7 @@
   @Parameterized.Parameters(name = "{0}")
   public static List<KeepAnnoParameters> data() {
     return createParameters(
-        getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build());
+        getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepAccessFlagsOnFieldsTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepAccessFlagsOnFieldsTest.java
index 8aa593a..314cb1e 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepAccessFlagsOnFieldsTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepAccessFlagsOnFieldsTest.java
@@ -18,7 +18,6 @@
 import com.android.tools.r8.keepanno.ast.AnnotationConstants.FieldAccess;
 import com.android.tools.r8.transformers.ClassTransformer;
 import com.android.tools.r8.transformers.MethodTransformer;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.lang.reflect.Field;
@@ -57,8 +56,7 @@
           configs.add(c.invert());
         });
     return buildParameters(
-        getTestParameters().withDefaultDexRuntime().withApiLevel(AndroidApiLevel.B).build(),
-        configs);
+        getTestParameters().withDefaultDexRuntime().withMaximumApiLevel().build(), configs);
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepAccessFlagsOnMembersTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepAccessFlagsOnMembersTest.java
index 66ed07b..0bb6896 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepAccessFlagsOnMembersTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepAccessFlagsOnMembersTest.java
@@ -17,7 +17,6 @@
 import com.android.tools.r8.keepanno.ast.AnnotationConstants;
 import com.android.tools.r8.transformers.ClassTransformer;
 import com.android.tools.r8.transformers.MethodTransformer;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
@@ -49,8 +48,7 @@
           configs.add(c.invert());
         });
     return buildParameters(
-        getTestParameters().withDefaultDexRuntime().withApiLevel(AndroidApiLevel.B).build(),
-        configs);
+        getTestParameters().withDefaultDexRuntime().withMaximumApiLevel().build(), configs);
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepAccessFlagsOnMethodsTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepAccessFlagsOnMethodsTest.java
index 8e49b23..2e48bee 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepAccessFlagsOnMethodsTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepAccessFlagsOnMethodsTest.java
@@ -18,7 +18,6 @@
 import com.android.tools.r8.keepanno.ast.AnnotationConstants.MethodAccess;
 import com.android.tools.r8.transformers.ClassTransformer;
 import com.android.tools.r8.transformers.MethodTransformer;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.lang.reflect.Method;
@@ -58,8 +57,7 @@
           configs.add(c.invert());
         });
     return buildParameters(
-        getTestParameters().withDefaultDexRuntime().withApiLevel(AndroidApiLevel.B).build(),
-        configs);
+        getTestParameters().withDefaultDexRuntime().withMaximumApiLevel().build(), configs);
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepAccessVisibilityFlagsTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepAccessVisibilityFlagsTest.java
index a9dec7d..f15c973 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepAccessVisibilityFlagsTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepAccessVisibilityFlagsTest.java
@@ -14,7 +14,6 @@
 import com.android.tools.r8.keepanno.annotations.MemberAccessFlags;
 import com.android.tools.r8.keepanno.annotations.MethodAccessFlags;
 import com.android.tools.r8.keepanno.annotations.UsesReflection;
-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;
@@ -76,7 +75,7 @@
   @Parameterized.Parameters(name = "{0}")
   public static List<KeepAnnoParameters> data() {
     return createParameters(
-        getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build());
+        getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepAnnoInstanceOfTargetTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepAnnoInstanceOfTargetTest.java
index 9605e14..abf727f 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepAnnoInstanceOfTargetTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepAnnoInstanceOfTargetTest.java
@@ -8,7 +8,6 @@
 
 import com.android.tools.r8.keepanno.annotations.KeepTarget;
 import com.android.tools.r8.keepanno.annotations.UsesReflection;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import java.util.List;
 import org.junit.Test;
@@ -26,7 +25,7 @@
   @Parameterized.Parameters(name = "{0}")
   public static List<KeepAnnoParameters> data() {
     return createParameters(
-        getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build());
+        getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepAnnoParameters.java b/src/test/java/com/android/tools/r8/keepanno/KeepAnnoParameters.java
index 04e7bf8..184a024 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepAnnoParameters.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepAnnoParameters.java
@@ -13,8 +13,11 @@
   public enum KeepAnnoConfig {
     REFERENCE,
     R8_DIRECT,
+    R8_PARTIAL_DIRECT,
     R8_NORMALIZED,
+    R8_PARTIAL_NORMALIZED,
     R8_RULES,
+    R8_PARTIAL_RULES,
     R8_LEGACY,
     PG;
   }
@@ -60,12 +63,20 @@
     return isCurrentR8() || isLegacyR8();
   }
 
+  public boolean isR8Partial() {
+    return config == KeepAnnoConfig.R8_PARTIAL_DIRECT
+        || config == KeepAnnoConfig.R8_PARTIAL_NORMALIZED
+        || config == KeepAnnoConfig.R8_PARTIAL_RULES;
+  }
+
   public boolean isPG() {
     return config == KeepAnnoConfig.PG;
   }
 
   public boolean isCurrentR8() {
-    return isNativeR8() || config == KeepAnnoConfig.R8_RULES;
+    return isNativeR8()
+        || config == KeepAnnoConfig.R8_RULES
+        || config == KeepAnnoConfig.R8_PARTIAL_RULES;
   }
 
   public boolean isLegacyR8() {
@@ -73,11 +84,15 @@
   }
 
   public boolean isNativeR8() {
-    return config == KeepAnnoConfig.R8_DIRECT || config == KeepAnnoConfig.R8_NORMALIZED;
+    return config == KeepAnnoConfig.R8_DIRECT
+        || config == KeepAnnoConfig.R8_PARTIAL_DIRECT
+        || config == KeepAnnoConfig.R8_NORMALIZED
+        || config == KeepAnnoConfig.R8_PARTIAL_NORMALIZED;
   }
 
   public boolean isExtractRules() {
     return config == KeepAnnoConfig.R8_RULES
+        || config == KeepAnnoConfig.R8_PARTIAL_RULES
         || config == KeepAnnoConfig.R8_LEGACY
         || config == KeepAnnoConfig.PG;
   }
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepAnnoTestBase.java b/src/test/java/com/android/tools/r8/keepanno/KeepAnnoTestBase.java
index 35c00ff..4d24fa8 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepAnnoTestBase.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepAnnoTestBase.java
@@ -7,6 +7,7 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.keepanno.KeepAnnoParameters.KeepAnnoConfig;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
@@ -17,19 +18,11 @@
       TestParametersCollection parametersCollection) {
     List<KeepAnnoParameters> keepAnnoParams = new ArrayList<>();
     for (TestParameters parameters : parametersCollection) {
-      keepAnnoParams.add(
-          new KeepAnnoParameters(parameters, KeepAnnoParameters.KeepAnnoConfig.REFERENCE));
-      keepAnnoParams.add(
-          new KeepAnnoParameters(parameters, KeepAnnoParameters.KeepAnnoConfig.R8_DIRECT));
-      keepAnnoParams.add(
-          new KeepAnnoParameters(parameters, KeepAnnoParameters.KeepAnnoConfig.R8_NORMALIZED));
-      keepAnnoParams.add(
-          new KeepAnnoParameters(parameters, KeepAnnoParameters.KeepAnnoConfig.R8_RULES));
-      keepAnnoParams.add(
-          new KeepAnnoParameters(parameters, KeepAnnoParameters.KeepAnnoConfig.R8_LEGACY));
-      if (parameters.isCfRuntime()) {
-        keepAnnoParams.add(
-            new KeepAnnoParameters(parameters, KeepAnnoParameters.KeepAnnoConfig.PG));
+      for (KeepAnnoConfig config : KeepAnnoConfig.values()) {
+        if (config == KeepAnnoConfig.PG && !parameters.isCfRuntime()) {
+          continue;
+        }
+        keepAnnoParams.add(new KeepAnnoParameters(parameters, config));
       }
     }
     return keepAnnoParams;
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepAnnoTestBuilder.java b/src/test/java/com/android/tools/r8/keepanno/KeepAnnoTestBuilder.java
index 5a548bc..4082c0a 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepAnnoTestBuilder.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepAnnoTestBuilder.java
@@ -8,8 +8,11 @@
 import com.android.tools.r8.ExternalR8TestBuilder;
 import com.android.tools.r8.ProguardTestBuilder;
 import com.android.tools.r8.R8FullTestBuilder;
+import com.android.tools.r8.R8PartialTestBuilder;
+import com.android.tools.r8.R8PartialTestCompileResult;
 import com.android.tools.r8.R8TestBuilder;
 import com.android.tools.r8.R8TestCompileResult;
+import com.android.tools.r8.R8TestCompileResultBase;
 import com.android.tools.r8.SingleTestRunResult;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestBuilder;
@@ -25,6 +28,7 @@
 import com.android.tools.r8.keepanno.keeprules.KeepRuleExtractorOptions;
 import com.android.tools.r8.keepanno.proto.KeepSpecProtos.KeepSpec;
 import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.partial.R8PartialCompilationConfiguration.Builder;
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
@@ -45,6 +49,11 @@
       case R8_NORMALIZED:
       case R8_RULES:
         return new R8NativeBuilder(params, temp);
+      case R8_PARTIAL_DIRECT:
+      case R8_PARTIAL_NORMALIZED:
+      case R8_PARTIAL_RULES:
+        params.parameters().assumeR8PartialTestParameters();
+        return new R8PartialNativeBuilder(params, temp);
       case R8_LEGACY:
         return new R8LegacyBuilder(params, temp);
       case PG:
@@ -56,7 +65,7 @@
 
   private final KeepAnnoParameters keepAnnoParams;
 
-  private KeepAnnoTestBuilder(KeepAnnoParameters params, TemporaryFolder temp) {
+  private KeepAnnoTestBuilder(KeepAnnoParameters params) {
     this.keepAnnoParams = params;
   }
 
@@ -148,7 +157,7 @@
     private final TestBuilder<? extends SingleTestRunResult<?>, ?> builder;
 
     public ReferenceBuilder(KeepAnnoParameters params, TemporaryFolder temp) {
-      super(params, temp);
+      super(params);
       if (parameters().isCfRuntime()) {
         builder = TestBase.testForJvm(temp);
       } else {
@@ -182,36 +191,26 @@
     }
   }
 
-  private static class R8NativeBuilder extends KeepAnnoTestBuilder {
+  private abstract static class R8NativeBuilderBase<
+          B extends R8TestBuilder<R, ?, ?>, R extends R8TestCompileResultBase<R>>
+      extends KeepAnnoTestBuilder {
 
-    private KeepAnnoConfig config;
-    private final R8FullTestBuilder builder;
-    private List<Consumer<R8TestCompileResult>> compileResultConsumers = new ArrayList<>();
+    final B builder;
+    final KeepAnnoConfig config;
 
-    private R8NativeBuilder(KeepAnnoParameters params, TemporaryFolder temp) {
-      super(params, temp);
-      config = params.config();
-      builder =
-          TestBase.testForR8(temp, parameters().getBackend())
-              .enableExperimentalKeepAnnotations()
-              .setMinApi(parameters());
+    final List<Consumer<R>> compileResultConsumers = new ArrayList<>();
 
-      // TODO(b/323816623): Replace the testing flag by the API call.
-      builder.getBuilder().setEnableExperimentalKeepAnnotations(false);
-      builder.addOptionsModification(o -> o.testing.enableEmbeddedKeepAnnotations = isDirect());
+    private R8NativeBuilderBase(KeepAnnoParameters params, B builder) {
+      super(params);
+      this.builder = builder;
+      this.config = params.config();
     }
 
-    private boolean isExtractRules() {
-      return config == KeepAnnoConfig.R8_RULES;
-    }
+    abstract boolean isExtractRules();
 
-    private boolean isNormalizeEdges() {
-      return config == KeepAnnoConfig.R8_NORMALIZED;
-    }
+    abstract boolean isNormalizeEdges();
 
-    private boolean isDirect() {
-      return config == KeepAnnoConfig.R8_DIRECT;
-    }
+    abstract boolean isDirect();
 
     @Override
     public KeepAnnoTestBuilder allowUnusedProguardConfigurationRules() {
@@ -252,21 +251,13 @@
     }
 
     @Override
-    public KeepAnnoTestBuilder addProgramClassFileData(List<byte[]> programClasses)
-        throws IOException {
+    public KeepAnnoTestBuilder addProgramClassFileData(List<byte[]> programClasses) {
       for (byte[] programClass : programClasses) {
         extractAndAdd(programClass);
       }
       return this;
     }
 
-    @Override
-    public KeepAnnoTestBuilder inspectOutputConfig(Consumer<String> configConsumer) {
-      compileResultConsumers.add(
-          result -> configConsumer.accept(result.getProguardConfiguration()));
-      return this;
-    }
-
     private void extractAndAdd(byte[] classFileData) {
       builder.addProgramClassFileData(classFileData);
       if (isExtractRules()) {
@@ -295,13 +286,81 @@
     }
 
     @Override
+    public KeepAnnoTestBuilder inspectOutputConfig(Consumer<String> configConsumer) {
+      compileResultConsumers.add(
+          result -> configConsumer.accept(result.getProguardConfiguration()));
+      return this;
+    }
+
+    @Override
     public SingleTestRunResult<?> run(Class<?> mainClass) throws Exception {
-      R8TestCompileResult compileResult = builder.compile();
+      R compileResult = builder.compile();
       compileResultConsumers.forEach(fn -> fn.accept(compileResult));
       return compileResult.run(parameters().getRuntime(), mainClass);
     }
   }
 
+  private static class R8NativeBuilder
+      extends R8NativeBuilderBase<R8FullTestBuilder, R8TestCompileResult> {
+
+    private R8NativeBuilder(KeepAnnoParameters params, TemporaryFolder temp) {
+      super(params, TestBase.testForR8(temp, params.getBackend()));
+      builder.enableExperimentalKeepAnnotations().setMinApi(parameters());
+
+      // TODO(b/323816623): Replace the testing flag by the API call.
+      builder.getBuilder().setEnableExperimentalKeepAnnotations(false);
+      builder.addOptionsModification(o -> o.testing.enableEmbeddedKeepAnnotations = isDirect());
+    }
+
+    @Override
+    boolean isExtractRules() {
+      return config == KeepAnnoConfig.R8_RULES;
+    }
+
+    @Override
+    boolean isNormalizeEdges() {
+      return config == KeepAnnoConfig.R8_NORMALIZED;
+    }
+
+    @Override
+    boolean isDirect() {
+      return config == KeepAnnoConfig.R8_DIRECT;
+    }
+  }
+
+  private static class R8PartialNativeBuilder
+      extends R8NativeBuilderBase<R8PartialTestBuilder, R8PartialTestCompileResult> {
+
+    private R8PartialNativeBuilder(KeepAnnoParameters params, TemporaryFolder temp) {
+      super(params, TestBase.testForR8Partial(temp, params.getBackend()));
+
+      builder
+          .setR8PartialConfiguration(Builder::includeAll)
+          .enableExperimentalKeepAnnotations()
+          .setMinApi(parameters());
+
+      // TODO(b/323816623): Replace the testing flag by the API call.
+      builder.getBuilder().setEnableExperimentalKeepAnnotations(false);
+      builder.addR8PartialOptionsModification(
+          o -> o.testing.enableEmbeddedKeepAnnotations = isDirect());
+    }
+
+    @Override
+    boolean isExtractRules() {
+      return config == KeepAnnoConfig.R8_PARTIAL_RULES;
+    }
+
+    @Override
+    boolean isNormalizeEdges() {
+      return config == KeepAnnoConfig.R8_PARTIAL_NORMALIZED;
+    }
+
+    @Override
+    boolean isDirect() {
+      return config == KeepAnnoConfig.R8_PARTIAL_DIRECT;
+    }
+  }
+
   private static class R8LegacyBuilder extends KeepAnnoTestBuilder {
 
     private final KeepRuleExtractorOptions extractorOptions =
@@ -310,7 +369,7 @@
     private final List<Consumer<List<String>>> configConsumers = new ArrayList<>();
 
     public R8LegacyBuilder(KeepAnnoParameters params, TemporaryFolder temp) throws IOException {
-      super(params, temp);
+      super(params);
       builder =
           TestBase.testForExternalR8(temp, parameters().getBackend())
               .useProvidedR8(KeepAnnoTestUtils.R8_LIB)
@@ -372,7 +431,7 @@
     private final List<Consumer<List<String>>> configConsumers = new ArrayList<>();
 
     public PGBuilder(KeepAnnoParameters params, TemporaryFolder temp) throws IOException {
-      super(params, temp);
+      super(params);
       builder =
           TestBase.testForProguard(KeepAnnoTestUtils.PG_VERSION, temp)
               .addProgramFiles(KeepAnnoTestUtils.getKeepAnnoLib(temp))
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepAnnoWithWhyAreYouKeepingTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepAnnoWithWhyAreYouKeepingTest.java
index 52b9cd9..25ddd75 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepAnnoWithWhyAreYouKeepingTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepAnnoWithWhyAreYouKeepingTest.java
@@ -9,7 +9,6 @@
 import com.android.tools.r8.keepanno.annotations.KeepItemKind;
 import com.android.tools.r8.keepanno.annotations.KeepTarget;
 import com.android.tools.r8.keepanno.annotations.UsesReflection;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import java.util.List;
 import org.junit.Test;
@@ -27,7 +26,7 @@
   @Parameterized.Parameters(name = "{0}")
   public static List<KeepAnnoParameters> data() {
     return createParameters(
-        getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build());
+        getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepAnnotationViaSuperTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepAnnotationViaSuperTest.java
index a9dd273..3412fc4 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepAnnotationViaSuperTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepAnnotationViaSuperTest.java
@@ -12,7 +12,6 @@
 import com.android.tools.r8.keepanno.annotations.InstanceOfPattern;
 import com.android.tools.r8.keepanno.annotations.KeepTarget;
 import com.android.tools.r8.keepanno.annotations.UsesReflection;
-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;
@@ -37,7 +36,7 @@
   @Parameterized.Parameters(name = "{0}")
   public static List<KeepAnnoParameters> data() {
     return createParameters(
-        getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build());
+        getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepBindingTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepBindingTest.java
index 464ee91..a58376c 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepBindingTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepBindingTest.java
@@ -11,7 +11,6 @@
 import com.android.tools.r8.keepanno.annotations.KeepCondition;
 import com.android.tools.r8.keepanno.annotations.KeepEdge;
 import com.android.tools.r8.keepanno.annotations.KeepTarget;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
@@ -31,7 +30,7 @@
   @Parameterized.Parameters(name = "{0}")
   public static List<KeepAnnoParameters> data() {
     return createParameters(
-        getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build());
+        getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepClassApiTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepClassApiTest.java
index 4abe376..8d098fb 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepClassApiTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepClassApiTest.java
@@ -13,7 +13,6 @@
 
 import com.android.tools.r8.keepanno.annotations.KeepForApi;
 import com.android.tools.r8.keepanno.annotations.MemberAccessFlags;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.Box;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
@@ -38,7 +37,7 @@
     return createParameters(
         getTestParameters()
             .withDefaultRuntimes()
-            .withApiLevel(AndroidApiLevel.B)
+            .withMaximumApiLevel()
             .enableApiLevelsForCf()
             .build());
   }
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepConjunctiveBindingsTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepConjunctiveBindingsTest.java
index 7c230d0..41d0b88 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepConjunctiveBindingsTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepConjunctiveBindingsTest.java
@@ -11,7 +11,6 @@
 import com.android.tools.r8.keepanno.annotations.KeepBinding;
 import com.android.tools.r8.keepanno.annotations.KeepEdge;
 import com.android.tools.r8.keepanno.annotations.KeepTarget;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
@@ -32,7 +31,7 @@
   @Parameterized.Parameters(name = "{0}")
   public static List<KeepAnnoParameters> data() {
     return createParameters(
-        getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build());
+        getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepConjunctiveBindingsWithInlineMembersTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepConjunctiveBindingsWithInlineMembersTest.java
index 1163008..57f78cb 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepConjunctiveBindingsWithInlineMembersTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepConjunctiveBindingsWithInlineMembersTest.java
@@ -11,7 +11,6 @@
 import com.android.tools.r8.keepanno.annotations.KeepBinding;
 import com.android.tools.r8.keepanno.annotations.KeepEdge;
 import com.android.tools.r8.keepanno.annotations.KeepTarget;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
@@ -32,7 +31,7 @@
   @Parameterized.Parameters(name = "{0}")
   public static List<KeepAnnoParameters> data() {
     return createParameters(
-        getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build());
+        getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepConjunctiveBindingsWithoutHolderTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepConjunctiveBindingsWithoutHolderTest.java
index cfd59fa..3a14be1 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepConjunctiveBindingsWithoutHolderTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepConjunctiveBindingsWithoutHolderTest.java
@@ -11,7 +11,6 @@
 import com.android.tools.r8.keepanno.annotations.KeepBinding;
 import com.android.tools.r8.keepanno.annotations.KeepEdge;
 import com.android.tools.r8.keepanno.annotations.KeepTarget;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
@@ -32,7 +31,7 @@
   @Parameterized.Parameters(name = "{0}")
   public static List<KeepAnnoParameters> data() {
     return createParameters(
-        getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build());
+        getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepDisjunctiveConsequencesTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepDisjunctiveConsequencesTest.java
index cf0b2a2..77a00b4 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepDisjunctiveConsequencesTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepDisjunctiveConsequencesTest.java
@@ -10,7 +10,6 @@
 import com.android.tools.r8.keepanno.annotations.KeepConstraint;
 import com.android.tools.r8.keepanno.annotations.KeepTarget;
 import com.android.tools.r8.keepanno.annotations.UsesReflection;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
@@ -31,7 +30,7 @@
   @Parameterized.Parameters(name = "{0}")
   public static List<KeepAnnoParameters> data() {
     return createParameters(
-        getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build());
+        getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepEmptyClassTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepEmptyClassTest.java
index 80e226d..9ba7ff6 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepEmptyClassTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepEmptyClassTest.java
@@ -14,7 +14,6 @@
 import com.android.tools.r8.keepanno.annotations.UsedByReflection;
 import com.android.tools.r8.keepanno.annotations.UsesReflection;
 import com.android.tools.r8.transformers.ClassFileTransformer.MethodPredicate;
-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;
@@ -35,7 +34,7 @@
   @Parameterized.Parameters(name = "{0}")
   public static List<KeepAnnoParameters> data() {
     return createParameters(
-        getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build());
+        getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepFieldValueApiTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepFieldValueApiTest.java
index 9ac84d1..fd059aa 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepFieldValueApiTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepFieldValueApiTest.java
@@ -12,7 +12,6 @@
 import com.android.tools.r8.keepanno.annotations.KeepForApi;
 import com.android.tools.r8.keepanno.annotations.KeepItemKind;
 import com.android.tools.r8.keepanno.annotations.KeepTarget;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.Box;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
@@ -37,7 +36,7 @@
     return createParameters(
         getTestParameters()
             .withDefaultRuntimes()
-            .withApiLevel(AndroidApiLevel.B)
+            .withMaximumApiLevel()
             .enableApiLevelsForCf()
             .build());
   }
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepFooIfBarAnyClassTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepFooIfBarAnyClassTest.java
index bf82204..9ce1e74 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepFooIfBarAnyClassTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepFooIfBarAnyClassTest.java
@@ -9,7 +9,6 @@
 import com.android.tools.r8.keepanno.annotations.KeepCondition;
 import com.android.tools.r8.keepanno.annotations.KeepEdge;
 import com.android.tools.r8.keepanno.annotations.KeepTarget;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
@@ -29,7 +28,7 @@
   @Parameterized.Parameters(name = "{0}")
   public static List<KeepAnnoParameters> data() {
     return createParameters(
-        getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build());
+        getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepFooIfBarSameClassTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepFooIfBarSameClassTest.java
index 0a2e16b..f071c4b 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepFooIfBarSameClassTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepFooIfBarSameClassTest.java
@@ -11,7 +11,6 @@
 import com.android.tools.r8.keepanno.annotations.KeepCondition;
 import com.android.tools.r8.keepanno.annotations.KeepEdge;
 import com.android.tools.r8.keepanno.annotations.KeepTarget;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.android.tools.r8.utils.codeinspector.Subject;
@@ -33,7 +32,7 @@
   @Parameterized.Parameters(name = "{0}")
   public static List<KeepAnnoParameters> data() {
     return createParameters(
-        getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build());
+        getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepInclusiveInstanceOfTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepInclusiveInstanceOfTest.java
index 1293e79..d17e742 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepInclusiveInstanceOfTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepInclusiveInstanceOfTest.java
@@ -8,7 +8,6 @@
 
 import com.android.tools.r8.keepanno.annotations.KeepTarget;
 import com.android.tools.r8.keepanno.annotations.UsesReflection;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
@@ -27,7 +26,7 @@
   @Parameterized.Parameters(name = "{0}")
   public static List<KeepAnnoParameters> data() {
     return createParameters(
-        getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build());
+        getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepMainViaBindingTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepMainViaBindingTest.java
index 9246d9d..607d9c5 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepMainViaBindingTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepMainViaBindingTest.java
@@ -7,7 +7,6 @@
 import com.android.tools.r8.keepanno.annotations.KeepEdge;
 import com.android.tools.r8.keepanno.annotations.KeepItemKind;
 import com.android.tools.r8.keepanno.annotations.KeepTarget;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
@@ -26,7 +25,7 @@
   @Parameterized.Parameters(name = "{0}")
   public static List<KeepAnnoParameters> data() {
     return createParameters(
-        getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build());
+        getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepMembersAccessFlagsTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepMembersAccessFlagsTest.java
index fe8eacd..ef96447 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepMembersAccessFlagsTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepMembersAccessFlagsTest.java
@@ -12,7 +12,6 @@
 import com.android.tools.r8.keepanno.annotations.KeepTarget;
 import com.android.tools.r8.keepanno.annotations.MemberAccessFlags;
 import com.android.tools.r8.keepanno.annotations.UsesReflection;
-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;
@@ -36,7 +35,7 @@
   @Parameterized.Parameters(name = "{0}")
   public static List<KeepAnnoParameters> data() {
     return createParameters(
-        getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build());
+        getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepMembersApiTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepMembersApiTest.java
index c6d3b7d..26f55e3 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepMembersApiTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepMembersApiTest.java
@@ -12,7 +12,6 @@
 
 import com.android.tools.r8.keepanno.annotations.KeepForApi;
 import com.android.tools.r8.keepanno.annotations.KeepItemKind;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.Box;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
@@ -37,7 +36,7 @@
     return createParameters(
         getTestParameters()
             .withDefaultRuntimes()
-            .withApiLevel(AndroidApiLevel.B)
+            .withMaximumApiLevel()
             .enableApiLevelsForCf()
             .build());
   }
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepMethodsAccessFlagsTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepMethodsAccessFlagsTest.java
index 0de2eaf..dd9b5ca 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepMethodsAccessFlagsTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepMethodsAccessFlagsTest.java
@@ -11,7 +11,6 @@
 import com.android.tools.r8.keepanno.annotations.KeepTarget;
 import com.android.tools.r8.keepanno.annotations.MethodAccessFlags;
 import com.android.tools.r8.keepanno.annotations.UsesReflection;
-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;
@@ -35,7 +34,7 @@
   @Parameterized.Parameters(name = "{0}")
   public static List<KeepAnnoParameters> data() {
     return createParameters(
-        getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build());
+        getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepMethodsEmptyAccessFlagsTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepMethodsEmptyAccessFlagsTest.java
index cac4ddb..3140f50 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepMethodsEmptyAccessFlagsTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepMethodsEmptyAccessFlagsTest.java
@@ -9,7 +9,6 @@
 import com.android.tools.r8.keepanno.annotations.KeepItemKind;
 import com.android.tools.r8.keepanno.annotations.KeepTarget;
 import com.android.tools.r8.keepanno.annotations.UsesReflection;
-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;
@@ -34,7 +33,7 @@
   @Parameterized.Parameters(name = "{0}")
   public static List<KeepAnnoParameters> data() {
     return createParameters(
-        getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build());
+        getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepNameAndInstanceOfTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepNameAndInstanceOfTest.java
index b36cca3..e3687c6 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepNameAndInstanceOfTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepNameAndInstanceOfTest.java
@@ -5,7 +5,6 @@
 
 import com.android.tools.r8.keepanno.annotations.KeepTarget;
 import com.android.tools.r8.keepanno.annotations.UsesReflection;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
@@ -25,7 +24,7 @@
   @Parameterized.Parameters(name = "{0}")
   public static List<KeepAnnoParameters> data() {
     return createParameters(
-        getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build());
+        getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepSameMethodTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepSameMethodTest.java
index 2dac67a..96670a0 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepSameMethodTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepSameMethodTest.java
@@ -13,7 +13,6 @@
 import com.android.tools.r8.keepanno.annotations.KeepEdge;
 import com.android.tools.r8.keepanno.annotations.KeepItemKind;
 import com.android.tools.r8.keepanno.annotations.KeepTarget;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
@@ -33,7 +32,7 @@
   @Parameterized.Parameters(name = "{0}")
   public static List<KeepAnnoParameters> data() {
     return createParameters(
-        getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build());
+        getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepStaticBindingTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepStaticBindingTest.java
index 1fbe385..35b999c 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepStaticBindingTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepStaticBindingTest.java
@@ -10,7 +10,6 @@
 import com.android.tools.r8.keepanno.annotations.KeepBinding;
 import com.android.tools.r8.keepanno.annotations.KeepEdge;
 import com.android.tools.r8.keepanno.annotations.KeepTarget;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
@@ -30,7 +29,7 @@
   @Parameterized.Parameters(name = "{0}")
   public static List<KeepAnnoParameters> data() {
     return createParameters(
-        getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build());
+        getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepTargetClassAndMemberKindTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepTargetClassAndMemberKindTest.java
index 9afb8b1..f02358a 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepTargetClassAndMemberKindTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepTargetClassAndMemberKindTest.java
@@ -10,7 +10,6 @@
 import com.android.tools.r8.keepanno.annotations.KeepItemKind;
 import com.android.tools.r8.keepanno.annotations.KeepTarget;
 import com.android.tools.r8.keepanno.annotations.UsesReflection;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
@@ -30,7 +29,7 @@
   @Parameterized.Parameters(name = "{0}")
   public static List<KeepAnnoParameters> data() {
     return createParameters(
-        getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build());
+        getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepTypePatternWithInstanceOfTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepTypePatternWithInstanceOfTest.java
index ce7c1d7..ee311a5 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepTypePatternWithInstanceOfTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepTypePatternWithInstanceOfTest.java
@@ -11,7 +11,6 @@
 import com.android.tools.r8.keepanno.annotations.KeepTarget;
 import com.android.tools.r8.keepanno.annotations.TypePattern;
 import com.android.tools.r8.keepanno.annotations.UsesReflection;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
@@ -31,7 +30,7 @@
     return createParameters(
         getTestParameters()
             .withDefaultRuntimes()
-            .withApiLevel(AndroidApiLevel.B)
+            .withMaximumApiLevel()
             .enableApiLevelsForCf()
             .build());
   }
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepUsedByNativeAnnotationTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepUsedByNativeAnnotationTest.java
index dfe0e2b..8bf1f75 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepUsedByNativeAnnotationTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepUsedByNativeAnnotationTest.java
@@ -11,7 +11,6 @@
 import com.android.tools.r8.keepanno.annotations.KeepCondition;
 import com.android.tools.r8.keepanno.annotations.KeepItemKind;
 import com.android.tools.r8.keepanno.annotations.UsedByNative;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
@@ -34,7 +33,7 @@
   @Parameterized.Parameters(name = "{0}")
   public static List<KeepAnnoParameters> data() {
     return createParameters(
-        getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build());
+        getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepUsedByReflectionAnnotationTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepUsedByReflectionAnnotationTest.java
index 0bc2417..9e7f5e0 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepUsedByReflectionAnnotationTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepUsedByReflectionAnnotationTest.java
@@ -11,7 +11,6 @@
 import com.android.tools.r8.keepanno.annotations.KeepConstraint;
 import com.android.tools.r8.keepanno.annotations.KeepItemKind;
 import com.android.tools.r8.keepanno.annotations.UsedByReflection;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
@@ -30,7 +29,7 @@
   @Parameterized.Parameters(name = "{0}")
   public static List<KeepAnnoParameters> data() {
     return createParameters(
-        getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build());
+        getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build());
   }
 
   public KeepUsedByReflectionAnnotationTest(KeepAnnoParameters parameters) {
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepUsesReflectionAnnotationTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepUsesReflectionAnnotationTest.java
index 1c0313a..d08fd34 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepUsesReflectionAnnotationTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepUsesReflectionAnnotationTest.java
@@ -9,7 +9,6 @@
 
 import com.android.tools.r8.keepanno.annotations.KeepTarget;
 import com.android.tools.r8.keepanno.annotations.UsesReflection;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
@@ -29,7 +28,7 @@
   @Parameterized.Parameters(name = "{0}")
   public static List<KeepAnnoParameters> data() {
     return createParameters(
-        getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build());
+        getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepUsesReflectionAnnotationWithAdditionalPreconditionTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepUsesReflectionAnnotationWithAdditionalPreconditionTest.java
index 117cac7..26e0321 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepUsesReflectionAnnotationWithAdditionalPreconditionTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepUsesReflectionAnnotationWithAdditionalPreconditionTest.java
@@ -9,7 +9,6 @@
 import com.android.tools.r8.keepanno.annotations.KeepCondition;
 import com.android.tools.r8.keepanno.annotations.KeepTarget;
 import com.android.tools.r8.keepanno.annotations.UsesReflection;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
@@ -29,7 +28,7 @@
   @Parameterized.Parameters(name = "{0}")
   public static List<KeepAnnoParameters> data() {
     return createParameters(
-        getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build());
+        getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepUsesReflectionAnnotationWithAdditionalPreconditionUnsatisfiedTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepUsesReflectionAnnotationWithAdditionalPreconditionUnsatisfiedTest.java
index 02070d5..8ac574c 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepUsesReflectionAnnotationWithAdditionalPreconditionUnsatisfiedTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepUsesReflectionAnnotationWithAdditionalPreconditionUnsatisfiedTest.java
@@ -11,7 +11,6 @@
 import com.android.tools.r8.keepanno.annotations.KeepCondition;
 import com.android.tools.r8.keepanno.annotations.KeepTarget;
 import com.android.tools.r8.keepanno.annotations.UsesReflection;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
@@ -37,7 +36,7 @@
   @Parameterized.Parameters(name = "{0}")
   public static List<KeepAnnoParameters> data() {
     return createParameters(
-        getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build());
+        getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepUsesReflectionFieldAnnotationTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepUsesReflectionFieldAnnotationTest.java
index 22ffd9b..e411906 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepUsesReflectionFieldAnnotationTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepUsesReflectionFieldAnnotationTest.java
@@ -9,7 +9,6 @@
 
 import com.android.tools.r8.keepanno.annotations.KeepTarget;
 import com.android.tools.r8.keepanno.annotations.UsesReflection;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
@@ -29,7 +28,7 @@
   @Parameterized.Parameters(name = "{0}")
   public static List<KeepAnnoParameters> data() {
     return createParameters(
-        getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build());
+        getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepUsesReflectionOnFieldTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepUsesReflectionOnFieldTest.java
index f85dcd7..556dd44 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepUsesReflectionOnFieldTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepUsesReflectionOnFieldTest.java
@@ -5,13 +5,11 @@
 
 import static com.android.tools.r8.utils.codeinspector.Matchers.isAbsent;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static org.hamcrest.CoreMatchers.containsString;
 import static org.hamcrest.MatcherAssert.assertThat;
 
 import com.android.tools.r8.keepanno.annotations.KeepConstraint;
 import com.android.tools.r8.keepanno.annotations.KeepTarget;
 import com.android.tools.r8.keepanno.annotations.UsesReflection;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
@@ -32,7 +30,7 @@
   @Parameterized.Parameters(name = "{0}")
   public static List<KeepAnnoParameters> data() {
     return createParameters(
-        getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build());
+        getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/keepanno/MembersAnnotatedByPatternsTest.java b/src/test/java/com/android/tools/r8/keepanno/MembersAnnotatedByPatternsTest.java
index a024909..8697fa0 100644
--- a/src/test/java/com/android/tools/r8/keepanno/MembersAnnotatedByPatternsTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/MembersAnnotatedByPatternsTest.java
@@ -14,7 +14,6 @@
 import com.android.tools.r8.keepanno.annotations.KeepTarget;
 import com.android.tools.r8.keepanno.annotations.UsedByReflection;
 import com.android.tools.r8.keepanno.annotations.UsesReflection;
-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;
@@ -41,7 +40,7 @@
   @Parameterized.Parameters(name = "{0}")
   public static List<KeepAnnoParameters> data() {
     return createParameters(
-        getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build());
+        getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/keepanno/MethodNameStringPatternsTest.java b/src/test/java/com/android/tools/r8/keepanno/MethodNameStringPatternsTest.java
index 9306ca4..836876d 100644
--- a/src/test/java/com/android/tools/r8/keepanno/MethodNameStringPatternsTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/MethodNameStringPatternsTest.java
@@ -13,7 +13,6 @@
 import com.android.tools.r8.keepanno.annotations.StringPattern;
 import com.android.tools.r8.keepanno.annotations.UsedByReflection;
 import com.android.tools.r8.keepanno.annotations.UsesReflection;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
@@ -34,7 +33,7 @@
   @Parameterized.Parameters(name = "{0}")
   public static List<KeepAnnoParameters> data() {
     return createParameters(
-        getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build());
+        getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/keepanno/MethodPatternsTest.java b/src/test/java/com/android/tools/r8/keepanno/MethodPatternsTest.java
index cbb208a..d364ee9 100644
--- a/src/test/java/com/android/tools/r8/keepanno/MethodPatternsTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/MethodPatternsTest.java
@@ -13,7 +13,6 @@
 import com.android.tools.r8.keepanno.annotations.TypePattern;
 import com.android.tools.r8.keepanno.annotations.UsedByReflection;
 import com.android.tools.r8.keepanno.annotations.UsesReflection;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
@@ -35,7 +34,7 @@
   @Parameterized.Parameters(name = "{0}")
   public static List<KeepAnnoParameters> data() {
     return createParameters(
-        getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build());
+        getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/keepanno/UsedByReflectionMemberInlingingAllowed.java b/src/test/java/com/android/tools/r8/keepanno/UsedByReflectionMemberInlingingAllowed.java
index b5d6f00..649f37e 100644
--- a/src/test/java/com/android/tools/r8/keepanno/UsedByReflectionMemberInlingingAllowed.java
+++ b/src/test/java/com/android/tools/r8/keepanno/UsedByReflectionMemberInlingingAllowed.java
@@ -11,7 +11,6 @@
 
 import com.android.tools.r8.keepanno.annotations.KeepItemKind;
 import com.android.tools.r8.keepanno.annotations.UsedByReflection;
-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.InstructionSubject;
@@ -33,7 +32,7 @@
   @Parameterized.Parameters(name = "{0}")
   public static List<KeepAnnoParameters> data() {
     return createParameters(
-        getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build());
+        getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/keepanno/UsedByReflectionWithNonMatchingMemberPatternsTest.java b/src/test/java/com/android/tools/r8/keepanno/UsedByReflectionWithNonMatchingMemberPatternsTest.java
index a77ec25..1f6659a 100644
--- a/src/test/java/com/android/tools/r8/keepanno/UsedByReflectionWithNonMatchingMemberPatternsTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/UsedByReflectionWithNonMatchingMemberPatternsTest.java
@@ -5,7 +5,6 @@
 
 import com.android.tools.r8.keepanno.annotations.KeepItemKind;
 import com.android.tools.r8.keepanno.annotations.UsedByReflection;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
@@ -24,7 +23,7 @@
   @Parameterized.Parameters(name = "{0}")
   public static List<KeepAnnoParameters> data() {
     return createParameters(
-        getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build());
+        getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/keepanno/classpatterns/ClassNamePatternsTest.java b/src/test/java/com/android/tools/r8/keepanno/classpatterns/ClassNamePatternsTest.java
index d6b97d1..c64f958 100644
--- a/src/test/java/com/android/tools/r8/keepanno/classpatterns/ClassNamePatternsTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/classpatterns/ClassNamePatternsTest.java
@@ -12,7 +12,6 @@
 import com.android.tools.r8.keepanno.annotations.TypePattern;
 import com.android.tools.r8.keepanno.annotations.UsedByReflection;
 import com.android.tools.r8.keepanno.annotations.UsesReflection;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import com.google.common.collect.ImmutableList;
 import java.lang.reflect.InvocationTargetException;
@@ -51,7 +50,7 @@
 
   @Parameterized.Parameters(name = "{0}")
   public static TestParametersCollection data() {
-    return getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build();
+    return getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build();
   }
 
   public ClassNamePatternsTest(TestParameters parameters) {
diff --git a/src/test/java/com/android/tools/r8/keepanno/doctests/ForApiDocumentationTest.java b/src/test/java/com/android/tools/r8/keepanno/doctests/ForApiDocumentationTest.java
index 7df53d6..63a3ca4 100644
--- a/src/test/java/com/android/tools/r8/keepanno/doctests/ForApiDocumentationTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/doctests/ForApiDocumentationTest.java
@@ -8,7 +8,6 @@
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.keepanno.annotations.KeepForApi;
 import com.android.tools.r8.keepanno.annotations.MemberAccessFlags;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import com.google.common.collect.ImmutableList;
 import java.lang.reflect.Method;
@@ -55,7 +54,7 @@
 
   @Parameterized.Parameters(name = "{0}")
   public static TestParametersCollection data() {
-    return getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build();
+    return getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build();
   }
 
   public ForApiDocumentationTest(TestParameters parameters) {
diff --git a/src/test/java/com/android/tools/r8/keepanno/doctests/MainMethodsDocumentationTest.java b/src/test/java/com/android/tools/r8/keepanno/doctests/MainMethodsDocumentationTest.java
index fdbe498..de40ed9 100644
--- a/src/test/java/com/android/tools/r8/keepanno/doctests/MainMethodsDocumentationTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/doctests/MainMethodsDocumentationTest.java
@@ -10,7 +10,6 @@
 import com.android.tools.r8.keepanno.annotations.KeepItemKind;
 import com.android.tools.r8.keepanno.annotations.KeepTarget;
 import com.android.tools.r8.keepanno.annotations.MethodAccessFlags;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
@@ -27,7 +26,7 @@
 
   @Parameterized.Parameters(name = "{0}")
   public static TestParametersCollection data() {
-    return getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build();
+    return getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build();
   }
 
   public MainMethodsDocumentationTest(TestParameters parameters) {
diff --git a/src/test/java/com/android/tools/r8/keepanno/doctests/SignatureConstraintsDocumentationTest.java b/src/test/java/com/android/tools/r8/keepanno/doctests/SignatureConstraintsDocumentationTest.java
index 2ab401c..2473300 100644
--- a/src/test/java/com/android/tools/r8/keepanno/doctests/SignatureConstraintsDocumentationTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/doctests/SignatureConstraintsDocumentationTest.java
@@ -6,7 +6,6 @@
 import com.android.tools.r8.keepanno.KeepAnnoParameters;
 import com.android.tools.r8.keepanno.KeepAnnoTestBase;
 import com.android.tools.r8.keepanno.doctests.GenericSignaturePrinter.TestClass;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import java.util.List;
 import org.junit.Test;
@@ -27,7 +26,7 @@
   @Parameterized.Parameters(name = "{0}")
   public static List<KeepAnnoParameters> data() {
     return createParameters(
-        getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build());
+        getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/keepanno/doctests/UsesReflectionAnnotationsDocumentationTest.java b/src/test/java/com/android/tools/r8/keepanno/doctests/UsesReflectionAnnotationsDocumentationTest.java
index a694a82..5d5cca9 100644
--- a/src/test/java/com/android/tools/r8/keepanno/doctests/UsesReflectionAnnotationsDocumentationTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/doctests/UsesReflectionAnnotationsDocumentationTest.java
@@ -15,7 +15,6 @@
 import com.android.tools.r8.keepanno.annotations.KeepTarget;
 import com.android.tools.r8.keepanno.annotations.UsesReflection;
 import com.android.tools.r8.keepanno.doctests.UsesReflectionAnnotationsDocumentationTest.Example1.MyAnnotationPrinter.MyClass;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.google.common.collect.ImmutableList;
@@ -38,7 +37,7 @@
 
   @Parameterized.Parameters(name = "{0}")
   public static TestParametersCollection data() {
-    return getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build();
+    return getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build();
   }
 
   public UsesReflectionAnnotationsDocumentationTest(TestParameters parameters) {
diff --git a/src/test/java/com/android/tools/r8/keepanno/doctests/UsesReflectionDocumentationTest.java b/src/test/java/com/android/tools/r8/keepanno/doctests/UsesReflectionDocumentationTest.java
index 95a8d5b..4cc673c 100644
--- a/src/test/java/com/android/tools/r8/keepanno/doctests/UsesReflectionDocumentationTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/doctests/UsesReflectionDocumentationTest.java
@@ -12,7 +12,6 @@
 import com.android.tools.r8.keepanno.annotations.KeepTarget;
 import com.android.tools.r8.keepanno.annotations.UsedByReflection;
 import com.android.tools.r8.keepanno.annotations.UsesReflection;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import com.google.common.collect.ImmutableList;
 import java.lang.reflect.Field;
@@ -41,7 +40,7 @@
 
   @Parameterized.Parameters(name = "{0}")
   public static TestParametersCollection data() {
-    return getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build();
+    return getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build();
   }
 
   public UsesReflectionDocumentationTest(TestParameters parameters) {
diff --git a/src/test/testbase/java/com/android/tools/r8/R8FullTestBuilder.java b/src/test/testbase/java/com/android/tools/r8/R8FullTestBuilder.java
index 3caab28..0647d72 100644
--- a/src/test/testbase/java/com/android/tools/r8/R8FullTestBuilder.java
+++ b/src/test/testbase/java/com/android/tools/r8/R8FullTestBuilder.java
@@ -32,11 +32,6 @@
   }
 
   @Override
-  public boolean isR8TestBuilder() {
-    return true;
-  }
-
-  @Override
   R8FullTestBuilder self() {
     return this;
   }
diff --git a/src/test/testbase/java/com/android/tools/r8/R8PartialTestBuilder.java b/src/test/testbase/java/com/android/tools/r8/R8PartialTestBuilder.java
index f32f03c..7f9442f 100644
--- a/src/test/testbase/java/com/android/tools/r8/R8PartialTestBuilder.java
+++ b/src/test/testbase/java/com/android/tools/r8/R8PartialTestBuilder.java
@@ -208,7 +208,7 @@
 
   @Override
   public R8PartialTestBuilder enableExperimentalKeepAnnotations() {
-    return addR8PartialR8OptionsModification(
+    return addR8PartialOptionsModification(
             o -> o.getTestingOptions().enableEmbeddedKeepAnnotations = true)
         .addKeepAnnoLibToClasspath();
   }
diff --git a/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/AssertUtils.java b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/AssertUtils.java
index e7e5ed0..229836f 100644
--- a/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/AssertUtils.java
+++ b/src/test/testbase/java/com/android/tools/r8/utils/codeinspector/AssertUtils.java
@@ -12,6 +12,7 @@
 import java.io.ByteArrayOutputStream;
 import java.io.PrintStream;
 import java.util.function.Consumer;
+import org.junit.AssumptionViolatedException;
 
 public class AssertUtils {
 
@@ -56,6 +57,9 @@
         action.execute();
         fail("Expected action to fail with an exception, but succeeded");
       } catch (Throwable e) {
+        if (e instanceof AssumptionViolatedException) {
+          throw e;
+        }
         assertEquals(printStackTraceToString(e), clazz, e.getClass());
         if (consumer != null) {
           consumer.accept(e);