Add Art from Android 14 (Android U, api level 34)

Built from branch udc-preview1-release (DP1).

Test: ./tools/test.py --no-internal --runtimes=dex-14.0.0:dex-9.0.0:jdk11:none
Fixes: b/270670592

Content of third_party/android_jar/libcore_latest/README.google:

Name: libcore
URL: https://source.android.com/
Version: Libcore AOSP master 938cf8bddefb1f96e67f2450da0eb492599f8516
Revision: NA
License: The GNU General Public License (GPL)

Description:
This is the core-oj.jar pulled from building aosp master.

lunch aosp_redfin-userdebug
m -j
cp out/soong/.intermediates/libcore/core-oj/android_common_apex10000/javac/core-oj.jar ...

Change-Id: I2c9f1346a049b734596d4bef1821bf495b5a1588
diff --git a/.gitignore b/.gitignore
index 442dc51..13e30c3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -286,6 +286,8 @@
 tools/*/host/art-12.0.0-beta4.tar.gz
 tools/*/host/art-13.0.0
 tools/*/host/art-13.0.0.tar.gz
+tools/*/host/art-14.0.0-dp1
+tools/*/host/art-14.0.0-dp1.tar.gz
 tools/*/host/art-master
 tools/*/host/art-master.tar.gz
 tools/*/art.tar.gz
diff --git a/build.gradle b/build.gradle
index 759507d..11cc609 100644
--- a/build.gradle
+++ b/build.gradle
@@ -393,6 +393,7 @@
                 "linux/art-10.0.0",
                 "linux/host/art-12.0.0-beta4",
                 "linux/host/art-13.0.0",
+                "linux/host/art-14.0.0-dp1",
                 "linux/host/art-master",
                 "linux/dalvik",
                 "linux/dalvik-4.0.4",
diff --git a/src/main/java/com/android/tools/r8/utils/AndroidApiLevel.java b/src/main/java/com/android/tools/r8/utils/AndroidApiLevel.java
index 2e7e2e3..fd21f2a 100644
--- a/src/main/java/com/android/tools/r8/utils/AndroidApiLevel.java
+++ b/src/main/java/com/android/tools/r8/utils/AndroidApiLevel.java
@@ -47,12 +47,13 @@
   MASTER(35), // API level for master is tentative.
   ANDROID_PLATFORM(10000);
 
-  // When updating LATEST and a new version goes stable, add a new api-versions.xml to third_party
-  // and update the version and generated jar in AndroidApiDatabaseBuilderGeneratorTest.
-  public static final AndroidApiLevel LATEST = T;
+  // When updating LATEST and a new version goes public, add a new api-versions.xml to third_party
+  // and update the version and generated jar in AndroidApiDatabaseBuilderGeneratorTest. Together
+  // with that update third_party/android_jar/libcore_latest/core-oj.jar and run
+  // GenerateCovariantReturnTypeMethodsTest.
+  public static final AndroidApiLevel LATEST = U;
 
-  // TODO(b/268601605): When adding U to the test matrix, set this to LATEST.
-  public static final AndroidApiLevel API_DATABASE_LEVEL = U;
+  public static final AndroidApiLevel API_DATABASE_LEVEL = LATEST;
 
   private final int level;
 
@@ -109,7 +110,7 @@
 
   public static AndroidApiLevel getAndroidApiLevel(int apiLevel) {
     assert apiLevel > 0;
-    assert T == LATEST; // This has to be updated when we add new api levels.
+    assert U == LATEST; // This has to be updated when we add new api levels.
     assert ANDROID_PLATFORM.isGreaterThan(LATEST);
     switch (apiLevel) {
       case 1:
diff --git a/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java b/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
index da660e7..a1a6580 100644
--- a/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
+++ b/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
@@ -100,7 +100,8 @@
           DexVm.Version.V9_0_0,
           DexVm.Version.V10_0_0,
           DexVm.Version.V12_0_0,
-          DexVm.Version.V13_0_0);
+          DexVm.Version.V13_0_0,
+          DexVm.Version.V14_0_0);
 
   private static final String JUNIT_TEST_RUNNER = "org.junit.runner.JUnitCore";
   private static final String JUNIT_JAR = "third_party/junit/junit-4.13-beta-2.jar";
@@ -184,13 +185,15 @@
           .put(
               "098-ddmc",
               TestCondition.match(
-                  TestCondition.runtimes(DexVm.Version.V12_0_0, DexVm.Version.V13_0_0)))
+                  TestCondition.runtimes(
+                      DexVm.Version.V12_0_0, DexVm.Version.V13_0_0, DexVm.Version.V14_0_0)))
           // TODO(b/197079442): Triage - fails with "java.lang.NoSuchMethodException:
           //  org.apache.harmony.dalvik.ddmc.DdmVmInternal.enableRecentAllocations [boolean]"
           .put(
               "145-alloc-tracking-stress",
               TestCondition.match(
-                  TestCondition.runtimes(DexVm.Version.V12_0_0, DexVm.Version.V13_0_0)))
+                  TestCondition.runtimes(
+                      DexVm.Version.V12_0_0, DexVm.Version.V13_0_0, DexVm.Version.V14_0_0)))
           .build();
 
   // Tests that are flaky with the Art version we currently use.
@@ -496,6 +499,7 @@
   static {
     ImmutableMap.Builder<DexVm.Version, List<String>> builder = ImmutableMap.builder();
     builder
+        .put(DexVm.Version.V14_0_0, ImmutableList.of("543-env-long-ref", "518-null-array-get"))
         .put(DexVm.Version.V13_0_0, ImmutableList.of("543-env-long-ref", "518-null-array-get"))
         .put(DexVm.Version.V12_0_0, ImmutableList.of("543-env-long-ref", "518-null-array-get"))
         .put(
@@ -832,7 +836,8 @@
                           DexVm.Version.V5_1_1,
                           DexVm.Version.V6_0_1,
                           DexVm.Version.V7_0_0,
-                          DexVm.Version.V13_0_0)),
+                          DexVm.Version.V13_0_0,
+                          DexVm.Version.V14_0_0)),
                   TestCondition.match(
                       TestCondition.compilers(
                           CompilerUnderTest.R8,
@@ -861,7 +866,8 @@
                       DexVm.Version.V9_0_0,
                       DexVm.Version.V10_0_0,
                       DexVm.Version.V12_0_0,
-                      DexVm.Version.V13_0_0)))
+                      DexVm.Version.V13_0_0,
+                      DexVm.Version.V14_0_0)))
           .put("454-get-vreg", TestCondition.match(TestCondition.R8DEX_COMPILER))
           // Fails: regs_jni.cc:42] Check failed: GetVReg(m, 0, kIntVReg, &value)
           // The R8/D8 code does not put values in the same registers as the tests expects.
@@ -878,7 +884,8 @@
                       DexVm.Version.V9_0_0,
                       DexVm.Version.V10_0_0,
                       DexVm.Version.V12_0_0,
-                      DexVm.Version.V13_0_0)))
+                      DexVm.Version.V13_0_0,
+                      DexVm.Version.V14_0_0)))
           .put("457-regs", TestCondition.match(TestCondition.R8DEX_COMPILER))
           // Class not found.
           .put("529-checker-unresolved", TestCondition.any())
diff --git a/src/test/java/com/android/tools/r8/R8RunSmaliTestsTest.java b/src/test/java/com/android/tools/r8/R8RunSmaliTestsTest.java
index a4cbbc2..a89ee46 100644
--- a/src/test/java/com/android/tools/r8/R8RunSmaliTestsTest.java
+++ b/src/test/java/com/android/tools/r8/R8RunSmaliTestsTest.java
@@ -132,29 +132,41 @@
   private static final Map<DexVm.Version, Map<String, String>> customProcessedOutputExpectation =
       ImmutableMap.of(
           Version.V4_4_4,
-              ImmutableMap.of(
-                  "bad-codegen", "java.lang.NullPointerException\n",
-                  "type-confusion-regression2", "java.lang.NullPointerException\n",
-                  "type-confusion-regression3", "java.lang.NullPointerException\n",
-                  "merge-blocks-regression", "java.lang.NullPointerException\n"),
+          ImmutableMap.of(
+              "bad-codegen", "java.lang.NullPointerException\n",
+              "type-confusion-regression2", "java.lang.NullPointerException\n",
+              "type-confusion-regression3", "java.lang.NullPointerException\n",
+              "merge-blocks-regression", "java.lang.NullPointerException\n"),
           Version.V4_0_4,
-              ImmutableMap.of(
-                  "bad-codegen", "java.lang.NullPointerException\n",
-                  "type-confusion-regression2", "java.lang.NullPointerException\n",
-                  "type-confusion-regression3", "java.lang.NullPointerException\n",
-                  "merge-blocks-regression", "java.lang.NullPointerException\n"),
+          ImmutableMap.of(
+              "bad-codegen", "java.lang.NullPointerException\n",
+              "type-confusion-regression2", "java.lang.NullPointerException\n",
+              "type-confusion-regression3", "java.lang.NullPointerException\n",
+              "merge-blocks-regression", "java.lang.NullPointerException\n"),
           Version.V13_0_0,
-              ImmutableMap.of(
-                  "bad-codegen",
-                      StringUtils.lines(
-                          "java.lang.NullPointerException: Attempt to read from field 'Test Test.a'"
-                              + " on a null object reference in method 'Test TestObject.a(Test,"
-                              + " Test, Test, Test, boolean)'"),
-                  "type-confusion-regression3",
-                      StringUtils.lines(
-                          "java.lang.NullPointerException: Attempt to read from field 'byte[]"
-                              + " Test.a' on a null object reference in method 'int"
-                              + " TestObject.a(Test, Test)'")));
+          ImmutableMap.of(
+              "bad-codegen",
+              StringUtils.lines(
+                  "java.lang.NullPointerException: Attempt to read from field 'Test Test.a'"
+                      + " on a null object reference in method 'Test TestObject.a(Test,"
+                      + " Test, Test, Test, boolean)'"),
+              "type-confusion-regression3",
+              StringUtils.lines(
+                  "java.lang.NullPointerException: Attempt to read from field 'byte[]"
+                      + " Test.a' on a null object reference in method 'int"
+                      + " TestObject.a(Test, Test)'")),
+          Version.V14_0_0,
+          ImmutableMap.of(
+              "bad-codegen",
+                  StringUtils.lines(
+                      "java.lang.NullPointerException: Attempt to read from field 'Test Test.a'"
+                          + " on a null object reference in method 'Test TestObject.a(Test,"
+                          + " Test, Test, Test, boolean)'"),
+              "type-confusion-regression3",
+                  StringUtils.lines(
+                      "java.lang.NullPointerException: Attempt to read from field 'byte[]"
+                          + " Test.a' on a null object reference in method 'int"
+                          + " TestObject.a(Test, Test)'")));
 
   // Tests where the input fails with a verification error on Dalvik instead of the
   // expected runtime exception.
diff --git a/src/test/java/com/android/tools/r8/TestCondition.java b/src/test/java/com/android/tools/r8/TestCondition.java
index e4cec10..a23c980 100644
--- a/src/test/java/com/android/tools/r8/TestCondition.java
+++ b/src/test/java/com/android/tools/r8/TestCondition.java
@@ -27,6 +27,7 @@
     ART_V10_0_0,
     ART_V12_0_0,
     ART_V13_0_0,
+    ART_V14_0_0,
     ART_DEFAULT,
     ART_MASTER,
     JAVA;
@@ -56,6 +57,8 @@
           return ART_V12_0_0;
         case V13_0_0:
           return ART_V13_0_0;
+        case V14_0_0:
+          return ART_V14_0_0;
         case DEFAULT:
           return ART_DEFAULT;
         case MASTER:
diff --git a/src/test/java/com/android/tools/r8/TestParameters.java b/src/test/java/com/android/tools/r8/TestParameters.java
index a05309c..c22f43e 100644
--- a/src/test/java/com/android/tools/r8/TestParameters.java
+++ b/src/test/java/com/android/tools/r8/TestParameters.java
@@ -105,6 +105,11 @@
     return false;
   }
 
+  public boolean runtimeWithClassValue() {
+    assert isCfRuntime() || isDexRuntime();
+    return isCfRuntime() || getDexRuntimeVersion().isNewerThanOrEqual(DexVm.Version.V14_0_0);
+  }
+
   // Convenience predicates.
   public boolean isDexRuntime() {
     return runtime.isDex();
@@ -127,7 +132,11 @@
   }
 
   public boolean isDexRuntimeVersion(DexVm.Version vm) {
-    return isDexRuntime() && vm == getDexRuntimeVersion();
+    return isDexRuntime() && getDexRuntimeVersion().isEqualTo(vm);
+  }
+
+  public boolean isDexRuntimeVersionNewerThanOrEqual(DexVm.Version vm) {
+    return isDexRuntime() && getDexRuntimeVersion().isNewerThanOrEqual(vm);
   }
 
   public boolean isNoneRuntime() {
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java
index bbdc05b..51ed733 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -273,6 +273,8 @@
     ART_12_0_0_HOST(Version.V12_0_0, Kind.HOST),
     ART_13_0_0_TARGET(Version.V13_0_0, Kind.TARGET),
     ART_13_0_0_HOST(Version.V13_0_0, Kind.HOST),
+    ART_14_0_0_TARGET(Version.V14_0_0, Kind.TARGET),
+    ART_14_0_0_HOST(Version.V14_0_0, Kind.HOST),
     ART_MASTER_TARGET(Version.MASTER, Kind.TARGET),
     ART_MASTER_HOST(Version.MASTER, Kind.HOST);
 
@@ -293,6 +295,7 @@
       V10_0_0("10.0.0"),
       V12_0_0("12.0.0"),
       V13_0_0("13.0.0"),
+      V14_0_0("14.0.0"),
       MASTER("master");
 
       /** This should generally be the latest DEX VM fully supported. */
@@ -355,7 +358,7 @@
       }
 
       public static Version last() {
-        return V13_0_0;
+        return V14_0_0;
       }
 
       public static Version master() {
@@ -630,6 +633,7 @@
       ImmutableMap.<DexVm, String>builder()
           .put(DexVm.ART_DEFAULT, "art")
           .put(DexVm.ART_MASTER_HOST, "host/art-master")
+          .put(DexVm.ART_14_0_0_HOST, "host/art-14.0.0-dp1")
           .put(DexVm.ART_13_0_0_HOST, "host/art-13.0.0")
           .put(DexVm.ART_12_0_0_HOST, "host/art-12.0.0-beta4")
           .put(DexVm.ART_10_0_0_HOST, "art-10.0.0")
@@ -645,6 +649,7 @@
       ImmutableMap.<DexVm, String>builder()
           .put(DexVm.ART_DEFAULT, "bin/art")
           .put(DexVm.ART_MASTER_HOST, "bin/art")
+          .put(DexVm.ART_14_0_0_HOST, "bin/art")
           .put(DexVm.ART_13_0_0_HOST, "bin/art")
           .put(DexVm.ART_12_0_0_HOST, "bin/art")
           .put(DexVm.ART_10_0_0_HOST, "bin/art")
@@ -660,6 +665,7 @@
   private static final Map<DexVm, String> ART_BINARY_VERSIONS_X64 =
       ImmutableMap.<DexVm, String>builder()
           .put(DexVm.ART_DEFAULT, "bin/art")
+          .put(DexVm.ART_14_0_0_HOST, "bin/art")
           .put(DexVm.ART_13_0_0_HOST, "bin/art")
           .put(DexVm.ART_12_0_0_HOST, "bin/art")
           .put(DexVm.ART_10_0_0_HOST, "bin/art")
@@ -694,6 +700,7 @@
     ImmutableMap.Builder<DexVm, List<String>> builder = ImmutableMap.builder();
     builder
         .put(DexVm.ART_DEFAULT, ART_BOOT_LIBS)
+        .put(DexVm.ART_14_0_0_HOST, NEWER_ART_BOOT_LIBS)
         .put(DexVm.ART_13_0_0_HOST, NEWER_ART_BOOT_LIBS)
         .put(DexVm.ART_12_0_0_HOST, NEWER_ART_BOOT_LIBS)
         .put(DexVm.ART_10_0_0_HOST, ART_BOOT_LIBS)
@@ -713,6 +720,7 @@
     ImmutableMap.Builder<DexVm, String> builder = ImmutableMap.builder();
     builder
         .put(DexVm.ART_DEFAULT, "angler")
+        .put(DexVm.ART_14_0_0_HOST, "redfin")
         .put(DexVm.ART_13_0_0_HOST, "redfin")
         .put(DexVm.ART_12_0_0_HOST, "redfin")
         .put(DexVm.ART_10_0_0_HOST, "coral")
@@ -746,6 +754,7 @@
       case V12_0_0:
         return base.resolve("host").resolve("art-12.0.0-beta4");
       case V13_0_0:
+      case V14_0_0:
       case MASTER:
         return base.resolve("host").resolve("art-" + version);
       default:
@@ -780,6 +789,7 @@
         return "arm64";
       case V12_0_0:
       case V13_0_0:
+      case V14_0_0:
       case MASTER:
         return "x86_64";
       default:
@@ -787,10 +797,6 @@
     }
   }
 
-  private static Path getProductBootImagePath(DexVm vm) {
-    return getProductPath(vm).resolve("system").resolve("framework").resolve("boot.art");
-  }
-
   public static byte[] getClassAsBytes(Class clazz) throws IOException {
     return Files.readAllBytes(getClassFileForTestClass(clazz));
   }
@@ -1073,6 +1079,8 @@
     switch (dexVm.version) {
       case MASTER:
         return AndroidApiLevel.MASTER;
+      case V14_0_0:
+        return AndroidApiLevel.U;
       case V13_0_0:
         return AndroidApiLevel.T;
       case V12_0_0:
diff --git a/src/test/java/com/android/tools/r8/androidapi/GenerateCovariantReturnTypeMethodsTest.java b/src/test/java/com/android/tools/r8/androidapi/GenerateCovariantReturnTypeMethodsTest.java
index cf867dd..df687ed 100644
--- a/src/test/java/com/android/tools/r8/androidapi/GenerateCovariantReturnTypeMethodsTest.java
+++ b/src/test/java/com/android/tools/r8/androidapi/GenerateCovariantReturnTypeMethodsTest.java
@@ -68,7 +68,7 @@
       Paths.get(ToolHelper.SOURCE_DIR)
           .resolve(PACKAGE_NAME.replace('.', '/'))
           .resolve(CLASS_NAME + ".java");
-  private static final AndroidApiLevel GENERATED_FOR_API_LEVEL = AndroidApiLevel.T;
+  private static final AndroidApiLevel GENERATED_FOR_API_LEVEL = AndroidApiLevel.U;
 
   @Parameter public TestParameters parameters;
 
@@ -79,7 +79,7 @@
 
   @Test
   public void testLibCoreNeedsUpgrading() {
-    assertEquals(GENERATED_FOR_API_LEVEL, AndroidApiLevel.LATEST);
+    assertEquals(GENERATED_FOR_API_LEVEL, AndroidApiLevel.API_DATABASE_LEVEL);
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/apimodel/ClassValueTest.java b/src/test/java/com/android/tools/r8/apimodel/ClassValueTest.java
index 091cff8..f247e38 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ClassValueTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ClassValueTest.java
@@ -68,7 +68,10 @@
         .compile()
         .inspect(this::computeValuePresent)
         .run(parameters.getRuntime(), TestClass.class)
-        .assertFailureWithErrorThatThrows(NoClassDefFoundError.class);
+        .applyIf(
+            parameters.runtimeWithClassValue(),
+            r -> r.assertSuccessWithOutput(EXPECTED_OUTPUT),
+            r -> r.assertFailureWithErrorThatThrows(NoClassDefFoundError.class));
   }
 
   @Test
@@ -83,7 +86,7 @@
         .inspect(this::computeValueAbsent)
         .run(parameters.getRuntime(), TestClass.class)
         .applyIf(
-            parameters.isCfRuntime(),
+            parameters.runtimeWithClassValue(),
             r -> r.assertFailureWithErrorThatThrows(AbstractMethodError.class),
             r -> r.assertFailureWithErrorThatThrows(NoClassDefFoundError.class));
   }
@@ -132,7 +135,7 @@
         .inspect(this::computeValueAbsent)
         .run(parameters.getRuntime(), TestClass.class)
         .applyIf(
-            parameters.isCfRuntime(),
+            parameters.runtimeWithClassValue(),
             r -> r.assertFailureWithErrorThatThrows(AbstractMethodError.class),
             r -> r.assertFailureWithErrorThatThrows(NoClassDefFoundError.class));
   }
@@ -177,7 +180,7 @@
           .inspect(this::computeValuePresent)
           .run(parameters.getRuntime(), TestClass.class)
           .applyIf(
-              parameters.isCfRuntime(),
+              parameters.runtimeWithClassValue(),
               r -> r.assertSuccessWithOutput(EXPECTED_OUTPUT),
               r -> r.assertFailureWithErrorThatThrows(NoClassDefFoundError.class));
     }
diff --git a/src/test/java/com/android/tools/r8/cf/varhandle/VarHandleDesugaringInstanceObjectFieldTest.java b/src/test/java/com/android/tools/r8/cf/varhandle/VarHandleDesugaringInstanceObjectFieldTest.java
index 2673e46..13a5073 100644
--- a/src/test/java/com/android/tools/r8/cf/varhandle/VarHandleDesugaringInstanceObjectFieldTest.java
+++ b/src/test/java/com/android/tools/r8/cf/varhandle/VarHandleDesugaringInstanceObjectFieldTest.java
@@ -4,6 +4,7 @@
 
 package com.android.tools.r8.cf.varhandle;
 
+import com.android.tools.r8.ToolHelper.DexVm.Version;
 import com.android.tools.r8.examples.jdk9.VarHandle;
 import com.android.tools.r8.utils.StringUtils;
 import com.google.common.collect.ImmutableList;
@@ -73,6 +74,9 @@
   @Override
   protected String getExpectedOutputForArtImplementation() {
     assert parameters.isDexRuntime();
-    return StringUtils.lines(EXPECTED_OUTPUT.trim(), "Art implementation", "Art implementation");
+    return parameters.isDexRuntimeVersionNewerThanOrEqual(Version.V14_0_0)
+        ? StringUtils.lines(
+            EXPECTED_OUTPUT.trim(), "Reference implementation", "Reference implementation")
+        : StringUtils.lines(EXPECTED_OUTPUT.trim(), "Art implementation", "Art implementation");
   }
 }
diff --git a/src/test/java/com/android/tools/r8/debug/InterfaceMethodTest.java b/src/test/java/com/android/tools/r8/debug/InterfaceMethodTest.java
index 51e8ab2..7a73a31 100644
--- a/src/test/java/com/android/tools/r8/debug/InterfaceMethodTest.java
+++ b/src/test/java/com/android/tools/r8/debug/InterfaceMethodTest.java
@@ -47,9 +47,12 @@
 
   @Test
   public void testDefaultMethod() throws Throwable {
-    // TODO(b/244683447): This test fails on ART 13 when checking current method in doSomething.
+    // TODO(b/244683447): This test fails on Art 13 and Art 14 when checking current method in
+    //  doSomething.
     assumeTrue(
-        parameters.isCfRuntime() || !parameters.getDexRuntimeVersion().isEqualTo(Version.V13_0_0));
+        parameters.isCfRuntime()
+            || !(parameters.getDexRuntimeVersion().isEqualTo(Version.V13_0_0)
+                || parameters.getDexRuntimeVersion().isEqualTo(Version.V14_0_0)));
     testForRuntime(parameters)
         .addProgramFiles(JAR)
         .run(parameters.getRuntime(), debuggeeClass)
diff --git a/src/test/java/com/android/tools/r8/debug/KotlinInlineTest.java b/src/test/java/com/android/tools/r8/debug/KotlinInlineTest.java
index 901e412..2205c9c 100644
--- a/src/test/java/com/android/tools/r8/debug/KotlinInlineTest.java
+++ b/src/test/java/com/android/tools/r8/debug/KotlinInlineTest.java
@@ -259,7 +259,9 @@
   public void testNestedInlining() throws Throwable {
     assumeTrue(
         "b/244704042: Incorrect step-into StringBuilder.",
-        parameters.isCfRuntime() || !parameters.getDexRuntimeVersion().isEqualTo(Version.V13_0_0));
+        parameters.isCfRuntime()
+            || !(parameters.getDexRuntimeVersion().isEqualTo(Version.V13_0_0)
+                || parameters.getDexRuntimeVersion().isEqualTo(Version.V14_0_0)));
     // Count the number of lines in the source file. This is needed to check that inlined code
     // refers to non-existing line numbers.
     Path sourceFilePath =
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/MathBackportJava17Test.java b/src/test/java/com/android/tools/r8/desugar/backports/MathBackportJava17Test.java
index fde89f0..8f9332d 100644
--- a/src/test/java/com/android/tools/r8/desugar/backports/MathBackportJava17Test.java
+++ b/src/test/java/com/android/tools/r8/desugar/backports/MathBackportJava17Test.java
@@ -34,7 +34,6 @@
     super(parameters, Math.class, TEST_JAR, "backport.MathBackportJava17Main");
 
     // Math.absExact.
-    // The exact number needs to be updated once we test Android U.
-    registerTarget(AndroidApiLevel.U, 27);
+    registerTarget(AndroidApiLevel.U, 8);
   }
 }
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/ObjectsBackportJava17Test.java b/src/test/java/com/android/tools/r8/desugar/backports/ObjectsBackportJava17Test.java
index d54a044..4a5345fe 100644
--- a/src/test/java/com/android/tools/r8/desugar/backports/ObjectsBackportJava17Test.java
+++ b/src/test/java/com/android/tools/r8/desugar/backports/ObjectsBackportJava17Test.java
@@ -35,7 +35,6 @@
   public ObjectsBackportJava17Test(TestParameters parameters) {
     super(parameters, Objects.class, TEST_JAR, TEST_CLASS);
     // Objects.checkFromIndexSize, Objects.checkFromToIndex, Objects.checkIndex.
-    // The exact number needs to be updated once we test Android U.
-    registerTarget(AndroidApiLevel.U, 28);
+    registerTarget(AndroidApiLevel.U, 21);
   }
 }
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/StreamBackportJava9Test.java b/src/test/java/com/android/tools/r8/desugar/backports/StreamBackportJava9Test.java
index 073c179..5e33276 100644
--- a/src/test/java/com/android/tools/r8/desugar/backports/StreamBackportJava9Test.java
+++ b/src/test/java/com/android/tools/r8/desugar/backports/StreamBackportJava9Test.java
@@ -34,12 +34,15 @@
 
   public StreamBackportJava9Test(TestParameters parameters) {
     super(parameters, Stream.class, TEST_JAR, "backport.StreamBackportJava9Main");
-    // Note: None of the methods in this test exist in the latest android.jar. If/when they ship in
-    // an actual API level, migrate these tests to StreamBackportTest.
+    // Note: The methods in this test exist from Android U. However, they are only available from
+    // Java 9. When tests build with Java 9 migrate to StreamBackportTest and add insert
+    // StreamBackportJava9Main as an inner class here.
 
     // Available since N as part of library desugaring.
     ignoreInvokes("of");
     ignoreInvokes("empty");
     ignoreInvokes("count");
+
+    registerTarget(AndroidApiLevel.U, 2);
   }
 }
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/StrictMathBackportJava17Test.java b/src/test/java/com/android/tools/r8/desugar/backports/StrictMathBackportJava17Test.java
index 3089d40..c93b1ee 100644
--- a/src/test/java/com/android/tools/r8/desugar/backports/StrictMathBackportJava17Test.java
+++ b/src/test/java/com/android/tools/r8/desugar/backports/StrictMathBackportJava17Test.java
@@ -33,7 +33,6 @@
 
   public StrictMathBackportJava17Test(TestParameters parameters) {
     super(parameters, StrictMath.class, TEST_JAR, "backport.StrictMathBackportJava17Main");
-    // The exact number needs to be updated once we test Android U.
-    registerTarget(AndroidApiLevel.U, 75);
+    registerTarget(AndroidApiLevel.U, 30);
   }
 }
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DateTimeFormatterTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DateTimeFormatterTest.java
index 16021f7..089553b 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DateTimeFormatterTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DateTimeFormatterTest.java
@@ -9,6 +9,7 @@
 
 import com.android.tools.r8.SingleTestRunResult;
 import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.ToolHelper.DexVm.Version;
 import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification;
 import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification;
 import com.android.tools.r8.utils.StringUtils;
@@ -29,6 +30,11 @@
       StringUtils.lines("2/3/01 4:05 AM - Feb 3, 1 4:05 AM");
   private static final String expectedOutput =
       StringUtils.lines("2/3/01, 4:05 AM - Feb 3, 1, 4:05 AM");
+  // From ICU 72, see https://android-review.git.corp.google.com/c/platform/libcore/+/2292140
+  private static final String expectedOutputDesugaredLibNNBSP =
+      StringUtils.lines("2/3/01 4:05\u202FAM - Feb 3, 1 4:05\u202FAM");
+  private static final String expectedOutputNNBSP =
+      StringUtils.lines("2/3/01, 4:05\u202FAM - Feb 3, 1, 4:05\u202FAM");
 
   private final TestParameters parameters;
   private final CompilationSpecification compilationSpecification;
@@ -61,9 +67,15 @@
             .run(parameters.getRuntime(), TestClass.class)
             .assertSuccess();
     if (libraryDesugaringSpecification.hasTimeDesugaring(parameters)) {
-      run.assertSuccessWithOutput(expectedOutputDesugaredLib);
+      run.assertSuccessWithOutput(
+          parameters.isDexRuntimeVersionNewerThanOrEqual(Version.V14_0_0)
+              ? expectedOutputDesugaredLibNNBSP
+              : expectedOutputDesugaredLib);
     } else {
-      run.assertSuccessWithOutput(expectedOutput);
+      run.assertSuccessWithOutput(
+          parameters.isDexRuntimeVersionNewerThanOrEqual(Version.V14_0_0)
+              ? expectedOutputNNBSP
+              : expectedOutput);
     }
   }
 
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11TimeAbstractTests.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11TimeAbstractTests.java
index 8b67b20..a2c95c1 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11TimeAbstractTests.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11TimeAbstractTests.java
@@ -169,7 +169,6 @@
         "test.java.time.TestOffsetTime",
         "test.java.time.TestClock_Offset",
         "test.java.time.TestPeriod",
-        "test.java.time.TestClock_System",
         "test.java.time.TestOffsetDateTime_instants",
         "test.java.time.temporal.TestDateTimeBuilderCombinations",
         "test.java.time.temporal.TestJulianFields",
@@ -180,6 +179,12 @@
       new String[] {"tck.java.time.TestIsoChronology"};
   static final String[] RAW_TEMPORAL_SUCCESSES_UP_TO_11 =
       new String[] {"test.java.time.temporal.TestIsoWeekFields"};
+  static final String[] RAW_TEMPORAL_SUCCESSES_UP_TO_14 =
+      new String[] {
+        // Reflective lookup Class.forName("java.time.Clock$SystemClock").getDeclaredField("offset")
+        // fails.
+        "test.java.time.TestClock_System"
+      };
   static final String[] FORMAT_CHRONO_SUCCESSES =
       new String[] {
         "test.java.time.format.TestFractionPrinterParser",
@@ -230,6 +235,10 @@
       // In 12 some ISO is supported that other versions do not support.
       Collections.addAll(allTests, RAW_TEMPORAL_SUCCESSES_UP_TO_11);
     }
+    if (parameters.getDexRuntimeVersion().isOlderThan(Version.V14_0_0)) {
+      // In 14 some reflection used in test fails.
+      Collections.addAll(allTests, RAW_TEMPORAL_SUCCESSES_UP_TO_14);
+    }
     // The bridge is always present with JDK11 due to partial desugaring between 26 and 33.
     // On JDK8 the bridge is absent in between 26 and 33.
     if (libraryDesugaringSpecification != JDK8
diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexRewriteInvokeInterfaceTest.java b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexRewriteInvokeInterfaceTest.java
index 3b6ac61..9c36e69 100644
--- a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexRewriteInvokeInterfaceTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexRewriteInvokeInterfaceTest.java
@@ -77,7 +77,7 @@
   public void testD8() throws Exception {
     parameters.assumeDexRuntime();
     // TODO(b/247047415): Update test when a DEX VM natively supporting nests is added.
-    assertFalse(parameters.getApiLevel().getLevel() > 33);
+    assertFalse(parameters.getApiLevel().getLevel() > 34);
     testForD8()
         .addProgramClassFileData(
             dumpHost(),
@@ -111,8 +111,8 @@
   @Test
   public void testD8WithClasspathAndMerge() throws Exception {
     assumeTrue(parameters.isDexRuntime());
-    // TODO(sgjesse): Update test when a DEX VM natively supporting nests is added.
-    assertFalse(parameters.getApiLevel().getLevel() > 33);
+    // TODO(b/247047415): Update test when a DEX VM natively supporting nests is added.
+    assertFalse(parameters.getApiLevel().getLevel() > 34);
 
     Path host =
         testForD8()
@@ -199,8 +199,8 @@
   @Test
   public void testD8WithoutMembersOnClasspath() {
     assumeTrue(parameters.isDexRuntime());
-    // TODO(sgjesse): Update test when a DEX VM natively supporting nests is added.
-    assertFalse(parameters.getApiLevel().getLevel() > 33);
+    // TODO(b/247047415): Update test when a DEX VM natively supporting nests is added.
+    assertFalse(parameters.getApiLevel().getLevel() > 34);
 
     assertThrows(
         CompilationFailedException.class,
@@ -220,8 +220,8 @@
   @Test
   public void testD8WithoutHostOnClasspath() {
     assumeTrue(parameters.isDexRuntime());
-    // TODO(sgjesse): Update test when a DEX VM natively supporting nests is added.
-    assertFalse(parameters.getApiLevel().getLevel() > 33);
+    // TODO(b/247047415): Update test when a DEX VM natively supporting nests is added.
+    assertFalse(parameters.getApiLevel().getLevel() > 34);
 
     assertThrows(
         CompilationFailedException.class,
diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexRewriteInvokeSuperTest.java b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexRewriteInvokeSuperTest.java
index b629ed8..36290f2 100644
--- a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexRewriteInvokeSuperTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexRewriteInvokeSuperTest.java
@@ -69,7 +69,7 @@
   public void testD8() throws Exception {
     parameters.assumeDexRuntime();
     // TODO(b/247047415): Update test when a DEX VM natively supporting nests is added.
-    assertFalse(parameters.getApiLevel().getLevel() > 33);
+    assertFalse(parameters.getApiLevel().getLevel() > 34);
     testForD8()
         .addProgramClassFileData(dumpHost(), dumpMember(), dumpSubMember())
         .setMinApi(parameters)
@@ -101,8 +101,8 @@
   @Test
   public void testD8WithClasspathAndMerge() throws Exception {
     assumeTrue(parameters.isDexRuntime());
-    // TODO(sgjesse): Update test when a DEX VM natively supporting nests is added.
-    assertFalse(parameters.getApiLevel().getLevel() > 33);
+    // TODO(b/247047415): Update test when a DEX VM natively supporting nests is added.
+    assertFalse(parameters.getApiLevel().getLevel() > 34);
 
     Path host =
         testForD8()
@@ -188,8 +188,8 @@
   @Test
   public void testD8WithoutMembersOnClasspath() {
     assumeTrue(parameters.isDexRuntime());
-    // TODO(sgjesse): Update test when a DEX VM natively supporting nests is added.
-    assertFalse(parameters.getApiLevel().getLevel() > 33);
+    // TODO(b/247047415): Update test when a DEX VM natively supporting nests is added.
+    assertFalse(parameters.getApiLevel().getLevel() > 34);
 
     assertThrows(
         CompilationFailedException.class,
@@ -209,8 +209,8 @@
   @Test
   public void testD8WithoutHostOnClasspath() {
     assumeTrue(parameters.isDexRuntime());
-    // TODO(sgjesse): Update test when a DEX VM natively supporting nests is added.
-    assertFalse(parameters.getApiLevel().getLevel() > 33);
+    // TODO(b/247047415): Update test when a DEX VM natively supporting nests is added.
+    assertFalse(parameters.getApiLevel().getLevel() > 34);
 
     assertThrows(
         CompilationFailedException.class,
diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexRewriteInvokeVirtualTest.java b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexRewriteInvokeVirtualTest.java
index 6e516a4..9e2d0c0 100644
--- a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexRewriteInvokeVirtualTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexRewriteInvokeVirtualTest.java
@@ -69,7 +69,7 @@
   public void testD8() throws Exception {
     parameters.assumeDexRuntime();
     // TODO(b/247047415): Update test when a DEX VM natively supporting nests is added.
-    assertFalse(parameters.getApiLevel().getLevel() > 33);
+    assertFalse(parameters.getApiLevel().getLevel() > 34);
     testForD8()
         .addProgramClassFileData(dumpHost(), dumpMember1(), dumpMember2())
         .setMinApi(parameters)
@@ -101,8 +101,8 @@
   @Test
   public void testD8WithClasspathAndMerge() throws Exception {
     assumeTrue(parameters.isDexRuntime());
-    // TODO(sgjesse): Update test when a DEX VM natively supporting nests is added.
-    assertFalse(parameters.getApiLevel().getLevel() > 33);
+    // TODO(b/247047415): Update test when a DEX VM natively supporting nests is added.
+    assertFalse(parameters.getApiLevel().getLevel() > 34);
 
     Path host =
         testForD8()
@@ -188,8 +188,8 @@
   @Test
   public void testD8WithoutMembersOnClasspath() {
     assumeTrue(parameters.isDexRuntime());
-    // TODO(sgjesse): Update test when a DEX VM natively supporting nests is added.
-    assertFalse(parameters.getApiLevel().getLevel() > 33);
+    // TODO(b/247047415): Update test when a DEX VM natively supporting nests is added.
+    assertFalse(parameters.getApiLevel().getLevel() > 34);
 
     assertThrows(
         CompilationFailedException.class,
@@ -209,8 +209,8 @@
   @Test
   public void testD8WithoutHostOnClasspath() {
     assumeTrue(parameters.isDexRuntime());
-    // TODO(sgjesse): Update test when a DEX VM natively supporting nests is added.
-    assertFalse(parameters.getApiLevel().getLevel() > 33);
+    // TODO(b/247047415): Update test when a DEX VM natively supporting nests is added.
+    assertFalse(parameters.getApiLevel().getLevel() > 34);
 
     assertThrows(
         CompilationFailedException.class,
diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexShrinkingFieldsTest.java b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexShrinkingFieldsTest.java
index 5bd24bf..4a1e82c 100644
--- a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexShrinkingFieldsTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexShrinkingFieldsTest.java
@@ -81,7 +81,7 @@
     parameters.assumeR8TestParameters();
     assumeTrue(parameters.isDexRuntime() || isRuntimeWithNestSupport(parameters.asCfRuntime()));
     // TODO(b/247047415): Update test when a DEX VM natively supporting nests is added.
-    assertFalse(parameters.getApiLevel().getLevel() > 33);
+    assertFalse(parameters.getApiLevel().getLevel() > 34);
     testForR8(parameters.getBackend())
         .addProgramClassFileData(
             dumpHost(ACC_PRIVATE), dumpMember1(ACC_PRIVATE), dumpMember2(ACC_PRIVATE))
@@ -99,7 +99,7 @@
     parameters.assumeR8TestParameters();
     assumeTrue(parameters.isDexRuntime() || isRuntimeWithNestSupport(parameters.asCfRuntime()));
     // TODO(b/247047415): Update test when a DEX VM natively supporting nests is added.
-    assertFalse(parameters.getApiLevel().getLevel() > 33);
+    assertFalse(parameters.getApiLevel().getLevel() > 34);
     testForR8(parameters.getBackend())
         .addProgramClassFileData(
             dumpHost(ACC_PRIVATE), dumpMember1(ACC_PRIVATE), dumpMember2(ACC_PRIVATE))
@@ -121,7 +121,7 @@
     parameters.assumeR8TestParameters();
     assumeTrue(parameters.isDexRuntime() || isRuntimeWithNestSupport(parameters.asCfRuntime()));
     // TODO(b/247047415): Update test when a DEX VM natively supporting nests is added.
-    assertFalse(parameters.getApiLevel().getLevel() > 33);
+    assertFalse(parameters.getApiLevel().getLevel() > 34);
     testForR8(parameters.getBackend())
         .addProgramClassFileData(
             dumpHost(ACC_PUBLIC), dumpMember1(ACC_PUBLIC), dumpMember2(ACC_PUBLIC))
diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexShrinkingMethodsTest.java b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexShrinkingMethodsTest.java
index 8d924dc..eca6260 100644
--- a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexShrinkingMethodsTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexShrinkingMethodsTest.java
@@ -80,7 +80,7 @@
     parameters.assumeR8TestParameters();
     assumeTrue(parameters.isDexRuntime() || isRuntimeWithNestSupport(parameters.asCfRuntime()));
     // TODO(b/247047415): Update test when a DEX VM natively supporting nests is added.
-    assertFalse(parameters.getApiLevel().getLevel() > 33);
+    assertFalse(parameters.getApiLevel().getLevel() > 34);
     testForR8(parameters.getBackend())
         .addProgramClassFileData(
             dumpHost(ACC_PRIVATE), dumpMember1(ACC_PRIVATE), dumpMember2(ACC_PRIVATE))
@@ -98,7 +98,7 @@
     parameters.assumeR8TestParameters();
     assumeTrue(parameters.isDexRuntime() || isRuntimeWithNestSupport(parameters.asCfRuntime()));
     // TODO(b/247047415): Update test when a DEX VM natively supporting nests is added.
-    assertFalse(parameters.getApiLevel().getLevel() > 33);
+    assertFalse(parameters.getApiLevel().getLevel() > 34);
     testForR8(parameters.getBackend())
         .addProgramClassFileData(
             dumpHost(ACC_PRIVATE), dumpMember1(ACC_PRIVATE), dumpMember2(ACC_PRIVATE))
@@ -120,7 +120,7 @@
     parameters.assumeR8TestParameters();
     assumeTrue(parameters.isDexRuntime() || isRuntimeWithNestSupport(parameters.asCfRuntime()));
     // TODO(b/247047415): Update test when a DEX VM natively supporting nests is added.
-    assertFalse(parameters.getApiLevel().getLevel() > 33);
+    assertFalse(parameters.getApiLevel().getLevel() > 34);
     testForR8(parameters.getBackend())
         .addProgramClassFileData(
             dumpHost(ACC_PUBLIC), dumpMember1(ACC_PUBLIC), dumpMember2(ACC_PUBLIC))
diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexTest.java b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexTest.java
index 1c740a4..74ea12f 100644
--- a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexTest.java
@@ -13,6 +13,7 @@
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.TestRunResult;
 import com.android.tools.r8.TestRuntime.CfVm;
+import com.android.tools.r8.ToolHelper.DexVm.Version;
 import com.android.tools.r8.desugar.nestaccesscontrol.NestAttributesInDexTest.Host.Member1;
 import com.android.tools.r8.desugar.nestaccesscontrol.NestAttributesInDexTest.Host.Member2;
 import com.android.tools.r8.transformers.ClassFileTransformer;
@@ -62,13 +63,18 @@
   private void checkResult(TestRunResult<?> result) {
     if (isRuntimeWithNestSupport(parameters.getRuntime())) {
       result.assertSuccessWithOutput(EXPECTED_OUTPUT);
+    } else if (parameters.isDexRuntimeVersionNewerThanOrEqual(Version.V14_0_0)) {
+      // TODO(b/247047415): Partial DEX support in Android U DP1 (reflective APIs).
+      result.assertSuccessWithOutput(R8_EXPECTED_OUTPUT);
     } else {
       result.assertFailureWithErrorThatThrows(NoSuchMethodError.class);
     }
   }
 
   private void checkResultR8(TestRunResult<?> result) {
-    if (isRuntimeWithNestSupport(parameters.getRuntime())) {
+    // TODO(b/247047415): Partial DEX support in Android U DP1 (reflective APIs).
+    if (parameters.isDexRuntimeVersionNewerThanOrEqual(Version.V14_0_0)
+        || isRuntimeWithNestSupport(parameters.getRuntime())) {
       result.assertSuccessWithOutput(R8_EXPECTED_OUTPUT);
     } else {
       result.assertFailureWithErrorThatThrows(NoSuchMethodError.class);
diff --git a/src/test/java/com/android/tools/r8/desugar/sealed/PermittedSubclassesAttributeInDexTest.java b/src/test/java/com/android/tools/r8/desugar/sealed/PermittedSubclassesAttributeInDexTest.java
index 32cee2a..cc01489 100644
--- a/src/test/java/com/android/tools/r8/desugar/sealed/PermittedSubclassesAttributeInDexTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/sealed/PermittedSubclassesAttributeInDexTest.java
@@ -11,6 +11,7 @@
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.TestRuntime.CfVm;
+import com.android.tools.r8.ToolHelper.DexVm.Version;
 import com.android.tools.r8.transformers.ClassFileTransformer;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.DescriptorUtils;
@@ -72,8 +73,11 @@
         .compile()
         .inspect(this::inspect)
         .run(parameters.getRuntime(), TestClass.class)
-        // No Art versions have support for sealed classes yet.
-        .assertFailureWithErrorThatThrows(NoSuchMethodError.class);
+        .applyIf(
+            // TODO(b/270941147): Partial DEX support in Android U DP1 (reflective APIs).
+            parameters.isDexRuntimeVersionNewerThanOrEqual(Version.V14_0_0),
+            r -> r.assertSuccessWithOutput(EXPECTED_OUTPUT),
+            r -> r.assertFailureWithErrorThatThrows(NoSuchMethodError.class));
   }
 
   public Collection<byte[]> getTransformedClasses() throws Exception {
diff --git a/src/test/java/com/android/tools/r8/graph/invokespecial/InvokeSpecialOnOtherInterfaceTest.java b/src/test/java/com/android/tools/r8/graph/invokespecial/InvokeSpecialOnOtherInterfaceTest.java
index 475a8e7..c66a13d 100644
--- a/src/test/java/com/android/tools/r8/graph/invokespecial/InvokeSpecialOnOtherInterfaceTest.java
+++ b/src/test/java/com/android/tools/r8/graph/invokespecial/InvokeSpecialOnOtherInterfaceTest.java
@@ -44,7 +44,7 @@
         .applyIf(
             parameters.isCfRuntime(),
             r -> r.assertFailureWithErrorThatThrows(VerifyError.class),
-            !(parameters.isDexRuntimeVersion(Version.V13_0_0)
+            !(parameters.isDexRuntimeVersionNewerThanOrEqual(Version.V13_0_0)
                 && parameters.canUseDefaultAndStaticInterfaceMethods()),
             r -> r.assertSuccessWithOutputLines("Hello World!"),
             r -> r.assertFailureWithErrorThatThrows(NoSuchMethodError.class));
@@ -67,7 +67,7 @@
             parameters.isDexRuntime() && !parameters.canUseDefaultAndStaticInterfaceMethods(),
             r -> r.assertSuccessWithOutputLines("Hello World!"),
             parameters.isDexRuntime()
-                && !parameters.isDexRuntimeVersion(Version.V13_0_0)
+                && !parameters.isDexRuntimeVersionNewerThanOrEqual(Version.V13_0_0)
                 && parameters.canUseDefaultAndStaticInterfaceMethods(),
             r -> r.assertFailureWithErrorThatThrows(NullPointerException.class),
             r -> r.assertFailureWithErrorThatThrows(NoSuchMethodError.class));
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/interfaces/OpenUninstantiatedInterfaceInstanceofTest.java b/src/test/java/com/android/tools/r8/ir/optimize/interfaces/OpenUninstantiatedInterfaceInstanceofTest.java
index 6765723..a53ca72 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/interfaces/OpenUninstantiatedInterfaceInstanceofTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/interfaces/OpenUninstantiatedInterfaceInstanceofTest.java
@@ -94,7 +94,7 @@
   private List<String> getExpectedOutputLines() {
     if (parameters.isDexRuntime()) {
       if (parameters.getDexRuntimeVersion().isEqualTo(Version.V7_0_0)
-          || parameters.getDexRuntimeVersion().isEqualTo(Version.V13_0_0)) {
+          || parameters.isDexRuntimeVersionNewerThanOrEqual(Version.V13_0_0)) {
         return ImmutableList.of("true");
       }
     }
diff --git a/src/test/java/com/android/tools/r8/kotlin/reflection/KotlinReflectTest.java b/src/test/java/com/android/tools/r8/kotlin/reflection/KotlinReflectTest.java
index 61c7a61..15fccd2 100644
--- a/src/test/java/com/android/tools/r8/kotlin/reflection/KotlinReflectTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/reflection/KotlinReflectTest.java
@@ -99,6 +99,7 @@
         .addKeepAttributes(ProguardKeepAttributes.RUNTIME_VISIBLE_ANNOTATIONS)
         .allowDiagnosticMessages()
         .allowUnusedDontWarnKotlinReflectJvmInternal(kotlinc.isNot(KOTLINC_1_3_72))
+        .allowUnusedDontWarnJavaLangClassValue()
         .applyIf(
             parameters.isCfRuntime() && kotlinParameters.isNewerThanOrEqualTo(KOTLINC_1_8_0),
             TestShrinkerBuilder::addDontWarnJavaLangInvokeLambdaMetadataFactory)
diff --git a/src/test/java/com/android/tools/r8/kotlin/reflection/ReflectiveConstructionWithInlineClassTest.java b/src/test/java/com/android/tools/r8/kotlin/reflection/ReflectiveConstructionWithInlineClassTest.java
index 9a4c93a..32568f9 100644
--- a/src/test/java/com/android/tools/r8/kotlin/reflection/ReflectiveConstructionWithInlineClassTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/reflection/ReflectiveConstructionWithInlineClassTest.java
@@ -108,7 +108,8 @@
         .addKeepEnumsRule()
         .addKeepAttributes(ProguardKeepAttributes.RUNTIME_VISIBLE_ANNOTATIONS)
         .allowDiagnosticMessages()
-        .allowUnusedDontWarnKotlinReflectJvmInternal();
+        .allowUnusedDontWarnKotlinReflectJvmInternal()
+        .allowUnusedDontWarnJavaLangClassValue();
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/shaking/InvalidTypesTest.java b/src/test/java/com/android/tools/r8/shaking/InvalidTypesTest.java
index c67394a..3d3ed7f 100644
--- a/src/test/java/com/android/tools/r8/shaking/InvalidTypesTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/InvalidTypesTest.java
@@ -87,6 +87,7 @@
 
               case V7_0_0:
               case V13_0_0:
+              case V14_0_0:
                 return StringUtils.joinLines(
                     "Hello!",
                     "Unexpected outcome of checkcast",
diff --git a/third_party/android_jar/libcore_latest.tar.gz.sha1 b/third_party/android_jar/libcore_latest.tar.gz.sha1
index c300639..a4bef52 100644
--- a/third_party/android_jar/libcore_latest.tar.gz.sha1
+++ b/third_party/android_jar/libcore_latest.tar.gz.sha1
@@ -1 +1 @@
-f7570bec27977e786b637241778e6cfdadf25f7f
\ No newline at end of file
+a82e05e08874d8b869d7f614c24ef8981888c702
\ No newline at end of file
diff --git a/tools/linux/README.art-versions b/tools/linux/README.art-versions
index 611c06e..03ddaa3 100644
--- a/tools/linux/README.art-versions
+++ b/tools/linux/README.art-versions
@@ -65,6 +65,37 @@
 
 (cd tools/linux/host; upload_to_google_storage.py -a --bucket r8-deps art-master)
 
+repo init -b udc-preview1-release
+
+art-14 (Android U)
+------------------
+Build branch udc-preview1-release.
+
+export BRANCH=udc-preview1-release
+mkdir ${BRANCH}
+cd ${BRANCH}
+export ANDROID_CHECKOUT=$(pwd)
+repo init -u https://android.googlesource.com/platform/manifest -b ${BRANCH}
+repo sync -cq -j48
+source build/envsetup.sh
+lunch aosp_redfin-userdebug
+m -j48
+m -j48 build-art
+m -j48 test-art-host
+repo manifest -r -o build_spec.xml
+
+Collected into tools/linux/host/art-14.0.0-dp1. The "host" path element is checked
+by the script for running Art.
+
+  cd <r8 checkout>
+  scripts/update-host-art.sh \
+     --android-checkout $ANDROID_CHECKOUT \
+     --art-dir host/art-14.0.0-dp1 \
+     --android-product redfin
+
+  (cd tools/linux/host; upload_to_google_storage.py -a --bucket r8-deps art-14.0.0-dp1)
+
+
 art-13 (Android T)
 ------------------
 Build branch android-13.0.0_r3.
@@ -86,10 +117,10 @@
   cd <r8 checkout>
   scripts/update-host-art.sh \
      --android-checkout <...>/android-13.0.0_r3 \
-     --art-dir host/art-13 \
+     --art-dir host/art-13.0.0 \
      --android-product redfin
 
-  (cd tools/linux/host; upload_to_google_storage.py -a --bucket r8-deps art-13)
+  (cd tools/linux/host; upload_to_google_storage.py -a --bucket r8-deps art-13.0.0)
 
 art-12.0.0 (Android S)
 ---------------------
diff --git a/tools/linux/host/art-14.0.0-dp1.tar.gz.sha1 b/tools/linux/host/art-14.0.0-dp1.tar.gz.sha1
new file mode 100644
index 0000000..c88b923
--- /dev/null
+++ b/tools/linux/host/art-14.0.0-dp1.tar.gz.sha1
@@ -0,0 +1 @@
+1c41f5d79e335ff132b7a95d995b65581c250df8
\ No newline at end of file
diff --git a/tools/test.py b/tools/test.py
index 72b2962..2f0254c 100755
--- a/tools/test.py
+++ b/tools/test.py
@@ -28,6 +28,7 @@
 
 ALL_ART_VMS = [
     "default",
+    "14.0.0",
     "13.0.0",
     "12.0.0",
     "10.0.0",