[Retrace] Change api to allow for partial reading mapping provider

Bug: b/234758957
Bug: b/201666766
Change-Id: Id8a0d6e5050670bc6ee71813c2bbd33312a6ccc6
diff --git a/src/main/java/com/android/tools/r8/naming/ClassNameMapper.java b/src/main/java/com/android/tools/r8/naming/ClassNameMapper.java
index a3dbc6c..1f7ca0d 100644
--- a/src/main/java/com/android/tools/r8/naming/ClassNameMapper.java
+++ b/src/main/java/com/android/tools/r8/naming/ClassNameMapper.java
@@ -242,6 +242,12 @@
   }
 
   public ClassNameMapper combine(ClassNameMapper other) {
+    if (other == null || other.isEmpty()) {
+      return this;
+    }
+    if (this.isEmpty()) {
+      return other;
+    }
     ImmutableMap.Builder<String, ClassNamingForNameMapper> builder = ImmutableMap.builder();
     Map<String, ClassNamingForNameMapper> otherClassMappings = other.getClassNameMappings();
     for (Entry<String, ClassNamingForNameMapper> mappingEntry : classNameMappings.entrySet()) {
diff --git a/src/main/java/com/android/tools/r8/retrace/MappingProvider.java b/src/main/java/com/android/tools/r8/retrace/MappingProvider.java
deleted file mode 100644
index 18bf9ee..0000000
--- a/src/main/java/com/android/tools/r8/retrace/MappingProvider.java
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package com.android.tools.r8.retrace;
-
-import com.android.tools.r8.Keep;
-import com.android.tools.r8.retrace.internal.MappingProviderInternal;
-
-@Keep
-public abstract class MappingProvider extends MappingProviderInternal {}
diff --git a/src/main/java/com/android/tools/r8/retrace/MappingSupplier.java b/src/main/java/com/android/tools/r8/retrace/MappingSupplier.java
new file mode 100644
index 0000000..068335d
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/retrace/MappingSupplier.java
@@ -0,0 +1,30 @@
+// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.retrace;
+
+import com.android.tools.r8.DiagnosticsHandler;
+import com.android.tools.r8.Keep;
+import com.android.tools.r8.references.ClassReference;
+import com.android.tools.r8.retrace.internal.MappingSupplierInternal;
+
+@Keep
+public abstract class MappingSupplier<T extends MappingSupplier<T>>
+    extends MappingSupplierInternal {
+
+  /***
+   * Register an allowed mapping lookup
+   *
+   * @param classReference The minified class reference allowed to be lookup up.
+   */
+  public abstract T registerUse(ClassReference classReference);
+
+  /***
+   * Allow looking up all class references. This can cause a slow down because it may fetch
+   * information multiple times or read the entire mapping.
+   */
+  public abstract T allowLookupAllClasses();
+
+  public abstract void verifyMappingFileHash(DiagnosticsHandler diagnosticsHandler);
+}
diff --git a/src/main/java/com/android/tools/r8/retrace/MappingProviderBuilder.java b/src/main/java/com/android/tools/r8/retrace/MappingSupplierBuilder.java
similarity index 64%
rename from src/main/java/com/android/tools/r8/retrace/MappingProviderBuilder.java
rename to src/main/java/com/android/tools/r8/retrace/MappingSupplierBuilder.java
index f9dbd492..c57d88a 100644
--- a/src/main/java/com/android/tools/r8/retrace/MappingProviderBuilder.java
+++ b/src/main/java/com/android/tools/r8/retrace/MappingSupplierBuilder.java
@@ -4,18 +4,15 @@
 
 package com.android.tools.r8.retrace;
 
-import com.android.tools.r8.DiagnosticsHandler;
 import com.android.tools.r8.Keep;
 
 @Keep
-public abstract class MappingProviderBuilder<
-    P extends MappingProvider, T extends MappingProviderBuilder<P, T>> {
+public abstract class MappingSupplierBuilder<
+    P extends MappingSupplier, T extends MappingSupplierBuilder<P, T>> {
 
   public abstract T self();
 
   public abstract T setAllowExperimental(boolean allowExperimental);
 
-  public abstract T setDiagnosticsHandler(DiagnosticsHandler diagnosticsHandler);
-
   public abstract P build();
 }
diff --git a/src/main/java/com/android/tools/r8/retrace/ProguardMappingProvider.java b/src/main/java/com/android/tools/r8/retrace/ProguardMappingProvider.java
deleted file mode 100644
index e192003..0000000
--- a/src/main/java/com/android/tools/r8/retrace/ProguardMappingProvider.java
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package com.android.tools.r8.retrace;
-
-import com.android.tools.r8.Keep;
-import com.android.tools.r8.references.ClassReference;
-import com.android.tools.r8.retrace.internal.ProguardMappingProviderBuilderImpl;
-
-@Keep
-public abstract class ProguardMappingProvider extends MappingProvider {
-
-  public static Builder builder() {
-    return new ProguardMappingProviderBuilderImpl();
-  }
-
-  @Keep
-  public abstract static class Builder
-      extends MappingProviderBuilder<ProguardMappingProvider, Builder> {
-
-    public abstract Builder registerUse(ClassReference classReference);
-
-    public abstract Builder allowLookupAllClasses();
-
-    public abstract Builder setProguardMapProducer(ProguardMapProducer proguardMapProducer);
-  }
-}
diff --git a/src/main/java/com/android/tools/r8/retrace/ProguardMappingSupplier.java b/src/main/java/com/android/tools/r8/retrace/ProguardMappingSupplier.java
new file mode 100644
index 0000000..74cd98f
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/retrace/ProguardMappingSupplier.java
@@ -0,0 +1,23 @@
+// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.retrace;
+
+import com.android.tools.r8.Keep;
+import com.android.tools.r8.retrace.internal.ProguardMappingSupplierBuilderImpl;
+
+@Keep
+public abstract class ProguardMappingSupplier extends MappingSupplier<ProguardMappingSupplier> {
+
+  public static Builder builder() {
+    return new ProguardMappingSupplierBuilderImpl();
+  }
+
+  @Keep
+  public abstract static class Builder
+      extends MappingSupplierBuilder<ProguardMappingSupplier, Builder> {
+
+    public abstract Builder setProguardMapProducer(ProguardMapProducer proguardMapProducer);
+  }
+}
diff --git a/src/main/java/com/android/tools/r8/retrace/Retrace.java b/src/main/java/com/android/tools/r8/retrace/Retrace.java
index 890e4d3..9b00f34 100644
--- a/src/main/java/com/android/tools/r8/retrace/Retrace.java
+++ b/src/main/java/com/android/tools/r8/retrace/Retrace.java
@@ -10,8 +10,6 @@
 import com.android.tools.r8.DiagnosticsHandler;
 import com.android.tools.r8.Keep;
 import com.android.tools.r8.Version;
-import com.android.tools.r8.naming.ProguardMapSupplier.ProguardMapChecker;
-import com.android.tools.r8.naming.ProguardMapSupplier.ProguardMapChecker.VerifyMappingFileHashResult;
 import com.android.tools.r8.references.Reference;
 import com.android.tools.r8.references.TypeReference;
 import com.android.tools.r8.retrace.RetraceCommand.Builder;
@@ -31,9 +29,7 @@
 import com.google.common.base.Charsets;
 import com.google.common.base.Equivalence;
 import com.google.common.base.Equivalence.Wrapper;
-import com.google.common.io.CharStreams;
 import java.io.IOException;
-import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.PrintStream;
 import java.io.UnsupportedEncodingException;
@@ -110,7 +106,7 @@
         continue;
       }
       if (!hasSetProguardMap) {
-        builder.setProguardMapProducer(getMappingSupplier(context.head(), diagnosticsHandler));
+        builder.setMappingSupplier(getMappingSupplier(context.head(), diagnosticsHandler));
         context.next();
         hasSetProguardMap = true;
       } else if (!hasSetStackTrace) {
@@ -135,7 +131,7 @@
     return builder;
   }
 
-  private static ProguardMapProducer getMappingSupplier(
+  private static MappingSupplier getMappingSupplier(
       String mappingPath, DiagnosticsHandler diagnosticsHandler) {
     Path path = Paths.get(mappingPath);
     if (!Files.exists(path)) {
@@ -143,7 +139,12 @@
           new StringDiagnostic(String.format("Could not find mapping file '%s'.", mappingPath)));
       throw new RetraceAbortException();
     }
-    return ProguardMapProducer.fromPath(Paths.get(mappingPath));
+    boolean allowExperimentalMapVersion =
+        System.getProperty("com.android.tools.r8.experimentalmapping") != null;
+    return ProguardMappingSupplier.builder()
+        .setProguardMapProducer(ProguardMapProducer.fromPath(Paths.get(mappingPath)))
+        .setAllowExperimental(allowExperimentalMapVersion)
+        .build();
   }
 
   private static List<String> getStackTraceFromFile(
@@ -292,37 +293,12 @@
    * @param command The command that describes the desired behavior of this retrace invocation.
    */
   public static void run(RetraceCommand command) {
-    boolean allowExperimentalMapVersion =
-        System.getProperty("com.android.tools.r8.experimentalmapping") != null;
-    runForTesting(command, allowExperimentalMapVersion);
-  }
-
-  static void runForTesting(RetraceCommand command, boolean allowExperimentalMapping) {
     try {
       Timing timing = Timing.create("R8 retrace", command.printMemory());
       RetraceOptions options = command.getOptions();
+      MappingSupplier mappingSupplier = options.getMappingSupplier();
       if (command.getOptions().isVerifyMappingFileHash()) {
-        try (InputStream reader = options.getProguardMapProducer().get()) {
-          VerifyMappingFileHashResult checkResult =
-              ProguardMapChecker.validateProguardMapHash(
-                  CharStreams.toString(new InputStreamReader(reader, Charsets.UTF_8)));
-          if (checkResult.isError()) {
-            command
-                .getOptions()
-                .getDiagnosticsHandler()
-                .error(new StringDiagnostic(checkResult.getMessage()));
-            throw new RuntimeException(checkResult.getMessage());
-          }
-          if (!checkResult.isOk()) {
-            command
-                .getOptions()
-                .getDiagnosticsHandler()
-                .warning(new StringDiagnostic(checkResult.getMessage()));
-          }
-        } catch (IOException e) {
-          command.getOptions().getDiagnosticsHandler().error(new ExceptionDiagnostic(e));
-          throw new RuntimeException(e);
-        }
+        mappingSupplier.verifyMappingFileHash(options.getDiagnosticsHandler());
         return;
       }
       DiagnosticsHandler diagnosticsHandler = options.getDiagnosticsHandler();
@@ -342,30 +318,24 @@
           });
       timing.end();
       timing.begin("Read proguard map");
-      ProguardMappingProvider.Builder mappingBuilder =
-          ProguardMappingProvider.builder()
-              .setProguardMapProducer(options.getProguardMapProducer())
-              .setDiagnosticsHandler(diagnosticsHandler)
-              .setAllowExperimental(allowExperimentalMapping);
       parsedStackTrace.forEach(
           proxy -> {
             if (proxy.hasClassName()) {
-              mappingBuilder.registerUse(proxy.getClassReference());
+              mappingSupplier.registerUse(proxy.getClassReference());
             }
             if (proxy.hasMethodArguments()) {
               Arrays.stream(proxy.getMethodArguments().split(","))
-                  .forEach(typeName -> registerUseFromTypeReference(mappingBuilder, typeName));
+                  .forEach(typeName -> registerUseFromTypeReference(mappingSupplier, typeName));
             }
             if (proxy.hasFieldOrReturnType() && !proxy.getFieldOrReturnType().equals("void")) {
-              registerUseFromTypeReference(mappingBuilder, proxy.getFieldOrReturnType());
+              registerUseFromTypeReference(mappingSupplier, proxy.getFieldOrReturnType());
             }
           });
-      MappingProvider mappingProvider = mappingBuilder.build();
       timing.end();
       timing.begin("Retracing");
       RetracerImpl retracer =
           RetracerImpl.builder()
-              .setMappingProvider(mappingProvider)
+              .setMappingSupplier(mappingSupplier)
               .setDiagnosticsHandler(diagnosticsHandler)
               .build();
       retracer
@@ -398,13 +368,13 @@
   }
 
   private static void registerUseFromTypeReference(
-      ProguardMappingProvider.Builder builder, String typeName) {
+      MappingSupplier mappingSupplier, String typeName) {
     TypeReference typeReference = Reference.typeFromTypeName(typeName);
     if (typeReference.isArray()) {
       typeReference = typeReference.asArray().getBaseType();
     }
     if (typeReference.isClass()) {
-      builder.registerUse(typeReference.asClass());
+      mappingSupplier.registerUse(typeReference.asClass());
     }
   }
 
diff --git a/src/main/java/com/android/tools/r8/retrace/RetraceCommand.java b/src/main/java/com/android/tools/r8/retrace/RetraceCommand.java
index b6d70e9..54b5737 100644
--- a/src/main/java/com/android/tools/r8/retrace/RetraceCommand.java
+++ b/src/main/java/com/android/tools/r8/retrace/RetraceCommand.java
@@ -69,7 +69,7 @@
 
     private boolean isVerbose;
     private final DiagnosticsHandler diagnosticsHandler;
-    private ProguardMapProducer proguardMapProducer;
+    private MappingSupplier mappingSupplier;
     private String regularExpression = StackTraceRegularExpressionParser.DEFAULT_REGULAR_EXPRESSION;
     private List<String> stackTrace;
     private Consumer<List<String>> retracedStackTraceConsumer;
@@ -85,13 +85,9 @@
       return this;
     }
 
-    /**
-     * Set a producer for the proguard mapping contents.
-     *
-     * @param producer Producer for
-     */
-    public Builder setProguardMapProducer(ProguardMapProducer producer) {
-      this.proguardMapProducer = producer;
+    /** Set a mapping supplier for providing mapping contents. */
+    public Builder setMappingSupplier(MappingSupplier mappingSupplier) {
+      this.mappingSupplier = mappingSupplier;
       return this;
     }
 
@@ -138,7 +134,7 @@
       if (this.diagnosticsHandler == null) {
         throw new RuntimeException("DiagnosticsHandler not specified");
       }
-      if (this.proguardMapProducer == null) {
+      if (this.mappingSupplier == null) {
         throw new RuntimeException("ProguardMapSupplier not specified");
       }
       if (this.stackTrace == null && !verifyMappingFileHash) {
@@ -150,7 +146,7 @@
       RetraceOptions retraceOptions =
           RetraceOptions.builder(diagnosticsHandler)
               .setRegularExpression(regularExpression)
-              .setProguardMapProducer(proguardMapProducer)
+              .setMappingSupplier(mappingSupplier)
               .setVerbose(isVerbose)
               .setVerifyMappingFileHash(verifyMappingFileHash)
               .build();
diff --git a/src/main/java/com/android/tools/r8/retrace/RetraceHelper.java b/src/main/java/com/android/tools/r8/retrace/RetraceHelper.java
deleted file mode 100644
index c966897..0000000
--- a/src/main/java/com/android/tools/r8/retrace/RetraceHelper.java
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.retrace;
-
-/** Non-kept class for internal access from tests. */
-public class RetraceHelper {
-
-  public static void runForTesting(RetraceCommand command, boolean allowExperimentalMapping) {
-    Retrace.runForTesting(command, allowExperimentalMapping);
-  }
-}
diff --git a/src/main/java/com/android/tools/r8/retrace/RetraceOptions.java b/src/main/java/com/android/tools/r8/retrace/RetraceOptions.java
index 2543f35..7c00ed2 100644
--- a/src/main/java/com/android/tools/r8/retrace/RetraceOptions.java
+++ b/src/main/java/com/android/tools/r8/retrace/RetraceOptions.java
@@ -20,22 +20,22 @@
   private final boolean verifyMappingFileHash;
   private final String regularExpression;
   private final DiagnosticsHandler diagnosticsHandler;
-  private final ProguardMapProducer proguardMapProducer;
+  private final MappingSupplier mappingSupplier;
 
   private RetraceOptions(
       String regularExpression,
       DiagnosticsHandler diagnosticsHandler,
-      ProguardMapProducer proguardMapProducer,
+      MappingSupplier mappingSupplier,
       boolean isVerbose,
       boolean verifyMappingFileHash) {
     this.regularExpression = regularExpression;
     this.diagnosticsHandler = diagnosticsHandler;
-    this.proguardMapProducer = proguardMapProducer;
+    this.mappingSupplier = mappingSupplier;
     this.isVerbose = isVerbose;
     this.verifyMappingFileHash = verifyMappingFileHash;
 
     assert diagnosticsHandler != null;
-    assert proguardMapProducer != null;
+    assert mappingSupplier != null;
   }
 
   public boolean isVerbose() {
@@ -54,8 +54,8 @@
     return diagnosticsHandler;
   }
 
-  public ProguardMapProducer getProguardMapProducer() {
-    return proguardMapProducer;
+  public MappingSupplier getMappingSupplier() {
+    return mappingSupplier;
   }
 
   /** Utility method for obtaining a builder with a default diagnostics handler. */
@@ -78,7 +78,7 @@
     private boolean isVerbose;
     private boolean verifyMappingFileHash;
     private final DiagnosticsHandler diagnosticsHandler;
-    private ProguardMapProducer proguardMapProducer;
+    private MappingSupplier mappingSupplier;
     private String regularExpression = defaultRegularExpression();
 
     Builder(DiagnosticsHandler diagnosticsHandler) {
@@ -97,13 +97,9 @@
       return this;
     }
 
-    /**
-     * Set a producer for the proguard mapping contents.
-     *
-     * @param producer Producer for
-     */
-    public Builder setProguardMapProducer(ProguardMapProducer producer) {
-      this.proguardMapProducer = producer;
+    /** Set a mapping supplier for providing mapping contents. */
+    public Builder setMappingSupplier(MappingSupplier producer) {
+      this.mappingSupplier = producer;
       return this;
     }
 
@@ -123,18 +119,14 @@
       if (this.diagnosticsHandler == null) {
         throw new RuntimeException("DiagnosticsHandler not specified");
       }
-      if (this.proguardMapProducer == null) {
+      if (this.mappingSupplier == null) {
         throw new RuntimeException("ProguardMapSupplier not specified");
       }
       if (this.regularExpression == null) {
         throw new RuntimeException("Regular expression not specified");
       }
       return new RetraceOptions(
-          regularExpression,
-          diagnosticsHandler,
-          proguardMapProducer,
-          isVerbose,
-          verifyMappingFileHash);
+          regularExpression, diagnosticsHandler, mappingSupplier, isVerbose, verifyMappingFileHash);
     }
   }
 }
diff --git a/src/main/java/com/android/tools/r8/retrace/Retracer.java b/src/main/java/com/android/tools/r8/retrace/Retracer.java
index 15d3b48..b1f4d95 100644
--- a/src/main/java/com/android/tools/r8/retrace/Retracer.java
+++ b/src/main/java/com/android/tools/r8/retrace/Retracer.java
@@ -73,14 +73,13 @@
   static Retracer createDefault(
       ProguardMapProducer proguardMapProducer, DiagnosticsHandler diagnosticsHandler) {
     try {
-      ProguardMappingProvider mappingProvider =
-          ProguardMappingProvider.builder()
+      ProguardMappingSupplier mappingSupplier =
+          ProguardMappingSupplier.builder()
               .setProguardMapProducer(proguardMapProducer)
-              .setDiagnosticsHandler(diagnosticsHandler)
-              .allowLookupAllClasses()
-              .build();
+              .build()
+              .allowLookupAllClasses();
       return Retracer.builder()
-          .setMappingProvider(mappingProvider)
+          .setMappingSupplier(mappingSupplier)
           .setDiagnosticsHandler(diagnosticsHandler)
           .build();
     } catch (Exception e) {
diff --git a/src/main/java/com/android/tools/r8/retrace/RetracerBuilder.java b/src/main/java/com/android/tools/r8/retrace/RetracerBuilder.java
index efd56ce..21eb8e0 100644
--- a/src/main/java/com/android/tools/r8/retrace/RetracerBuilder.java
+++ b/src/main/java/com/android/tools/r8/retrace/RetracerBuilder.java
@@ -10,7 +10,7 @@
 @Keep
 public interface RetracerBuilder {
 
-  RetracerBuilder setMappingProvider(MappingProvider mappingProvider);
+  RetracerBuilder setMappingSupplier(MappingSupplier mappingSupplier);
 
   RetracerBuilder setDiagnosticsHandler(DiagnosticsHandler diagnosticsHandler);
 
diff --git a/src/main/java/com/android/tools/r8/retrace/StringRetrace.java b/src/main/java/com/android/tools/r8/retrace/StringRetrace.java
index b5ed6ae..99c7d8a 100644
--- a/src/main/java/com/android/tools/r8/retrace/StringRetrace.java
+++ b/src/main/java/com/android/tools/r8/retrace/StringRetrace.java
@@ -8,6 +8,7 @@
 
 import com.android.tools.r8.DiagnosticsHandler;
 import com.android.tools.r8.Keep;
+import com.android.tools.r8.retrace.internal.RetracerImpl;
 import com.android.tools.r8.retrace.internal.StackTraceElementStringProxy;
 import com.android.tools.r8.utils.ListUtils;
 import com.android.tools.r8.utils.StringUtils;
@@ -40,7 +41,10 @@
    */
   public static StringRetrace create(RetraceOptions command) {
     return create(
-        Retracer.createDefault(command.getProguardMapProducer(), command.getDiagnosticsHandler()),
+        RetracerImpl.builder()
+            .setMappingSupplier(command.getMappingSupplier())
+            .setDiagnosticsHandler(command.getDiagnosticsHandler())
+            .build(),
         command.getDiagnosticsHandler(),
         command.getRegularExpression(),
         command.isVerbose());
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/MappingProviderInternal.java b/src/main/java/com/android/tools/r8/retrace/internal/MappingProviderInternal.java
deleted file mode 100644
index 13187cc..0000000
--- a/src/main/java/com/android/tools/r8/retrace/internal/MappingProviderInternal.java
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package com.android.tools.r8.retrace.internal;
-
-import com.android.tools.r8.naming.ClassNamingForNameMapper;
-import com.android.tools.r8.naming.mappinginformation.MapVersionMappingInformation;
-import java.util.Set;
-
-public abstract class MappingProviderInternal {
-
-  abstract ClassNamingForNameMapper getClassNaming(String typeName);
-
-  abstract String getSourceFileForClass(String typeName);
-
-  abstract Set<MapVersionMappingInformation> getMapVersions();
-}
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/MappingSupplierInternal.java b/src/main/java/com/android/tools/r8/retrace/internal/MappingSupplierInternal.java
new file mode 100644
index 0000000..c47c467
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/retrace/internal/MappingSupplierInternal.java
@@ -0,0 +1,20 @@
+// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.retrace.internal;
+
+import com.android.tools.r8.DiagnosticsHandler;
+import com.android.tools.r8.naming.ClassNamingForNameMapper;
+import com.android.tools.r8.naming.mappinginformation.MapVersionMappingInformation;
+import java.util.Set;
+
+public abstract class MappingSupplierInternal {
+
+  abstract ClassNamingForNameMapper getClassNaming(
+      DiagnosticsHandler diagnosticsHandler, String typeName);
+
+  abstract String getSourceFileForClass(DiagnosticsHandler diagnosticsHandler, String typeName);
+
+  abstract Set<MapVersionMappingInformation> getMapVersions(DiagnosticsHandler diagnosticsHandler);
+}
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/ProguardMapReaderWithFiltering.java b/src/main/java/com/android/tools/r8/retrace/internal/ProguardMapReaderWithFiltering.java
index 0d764a5..e6589d5f 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/ProguardMapReaderWithFiltering.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/ProguardMapReaderWithFiltering.java
@@ -189,9 +189,12 @@
   private int endIndex = 0;
 
   private final Predicate<String> filter;
+  private final boolean readPreambleAndSourceFiles;
 
-  protected ProguardMapReaderWithFiltering(Predicate<String> filter) {
+  protected ProguardMapReaderWithFiltering(
+      Predicate<String> filter, boolean readPreambleAndSourceFiles) {
     this.filter = filter;
+    this.readPreambleAndSourceFiles = readPreambleAndSourceFiles;
   }
 
   public abstract byte[] read() throws IOException;
@@ -221,10 +224,12 @@
         String classMapping = getBufferAsString(bytes);
         String obfuscatedClassName = getObfuscatedClassName(classMapping);
         isInsideClassOfInterest = filter.test(obfuscatedClassName);
-        return classMapping;
-      } else if (lineParserState == IS_COMMENT_SOURCE_FILE) {
+        if (isInsideClassOfInterest || readPreambleAndSourceFiles) {
+          return classMapping;
+        }
+      } else if (lineParserState == IS_COMMENT_SOURCE_FILE && readPreambleAndSourceFiles) {
         return getBufferAsString(bytes);
-      } else if (isInsideClassOfInterest || !seenFirstClass) {
+      } else if (isInsideClassOfInterest || (!seenFirstClass && readPreambleAndSourceFiles)) {
         return getBufferAsString(bytes);
       }
     }
@@ -284,8 +289,11 @@
     private int temporaryBufferPosition = 0;
 
     public ProguardMapReaderWithFilteringMappedBuffer(
-        Path mappingFile, Predicate<String> classNamesOfInterest) throws IOException {
-      super(classNamesOfInterest);
+        Path mappingFile,
+        Predicate<String> classNamesOfInterest,
+        boolean readPreambleAndSourceFiles)
+        throws IOException {
+      super(classNamesOfInterest, readPreambleAndSourceFiles);
       fileChannel = FileChannel.open(mappingFile, StandardOpenOption.READ);
       channelSize = fileChannel.size();
       readFromChannel();
@@ -364,8 +372,10 @@
     private int endReadIndex = 0;
 
     public ProguardMapReaderWithFilteringInputBuffer(
-        InputStream inputStream, Predicate<String> classNamesOfInterest) {
-      super(classNamesOfInterest);
+        InputStream inputStream,
+        Predicate<String> classNamesOfInterest,
+        boolean readPreambleAndSourceFiles) {
+      super(classNamesOfInterest, readPreambleAndSourceFiles);
       this.inputStream = inputStream;
     }
 
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/ProguardMappingProviderBuilderImpl.java b/src/main/java/com/android/tools/r8/retrace/internal/ProguardMappingProviderBuilderImpl.java
deleted file mode 100644
index 8cf9ace..0000000
--- a/src/main/java/com/android/tools/r8/retrace/internal/ProguardMappingProviderBuilderImpl.java
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package com.android.tools.r8.retrace.internal;
-
-import com.android.tools.r8.DiagnosticsHandler;
-import com.android.tools.r8.naming.ClassNameMapper;
-import com.android.tools.r8.naming.LineReader;
-import com.android.tools.r8.references.ClassReference;
-import com.android.tools.r8.retrace.InvalidMappingFileException;
-import com.android.tools.r8.retrace.ProguardMapProducer;
-import com.android.tools.r8.retrace.ProguardMappingProvider;
-import com.android.tools.r8.retrace.internal.ProguardMapReaderWithFiltering.ProguardMapReaderWithFilteringInputBuffer;
-import com.android.tools.r8.retrace.internal.ProguardMapReaderWithFiltering.ProguardMapReaderWithFilteringMappedBuffer;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.function.Predicate;
-
-public class ProguardMappingProviderBuilderImpl extends ProguardMappingProvider.Builder {
-
-  private ProguardMapProducer proguardMapProducer;
-  private boolean allowExperimental = false;
-  private Set<String> allowedLookup = new HashSet<>();
-  private boolean allowLookupAllClasses = false;
-  private DiagnosticsHandler diagnosticsHandler = new DiagnosticsHandler() {};
-
-  @Override
-  public ProguardMappingProvider.Builder self() {
-    return this;
-  }
-
-  @Override
-  public ProguardMappingProvider.Builder setAllowExperimental(boolean allowExperimental) {
-    this.allowExperimental = allowExperimental;
-    return self();
-  }
-
-  @Override
-  public ProguardMappingProvider.Builder setDiagnosticsHandler(
-      DiagnosticsHandler diagnosticsHandler) {
-    this.diagnosticsHandler = diagnosticsHandler;
-    return self();
-  }
-
-  @Override
-  public ProguardMappingProvider.Builder registerUse(ClassReference classReference) {
-    allowedLookup.add(classReference.getTypeName());
-    return self();
-  }
-
-  @Override
-  public ProguardMappingProvider.Builder allowLookupAllClasses() {
-    allowLookupAllClasses = true;
-    return self();
-  }
-
-  @Override
-  public ProguardMappingProvider.Builder setProguardMapProducer(
-      ProguardMapProducer proguardMapProducer) {
-    this.proguardMapProducer = proguardMapProducer;
-    return self();
-  }
-
-  @Override
-  public ProguardMappingProvider build() {
-    try {
-      Predicate<String> buildForClass = allowLookupAllClasses ? null : allowedLookup::contains;
-      LineReader reader =
-          proguardMapProducer.isFileBacked()
-              ? new ProguardMapReaderWithFilteringMappedBuffer(
-                  proguardMapProducer.getPath(), buildForClass)
-              : new ProguardMapReaderWithFilteringInputBuffer(
-                  proguardMapProducer.get(), buildForClass);
-      return new ProguardMappingProviderImpl(
-          ClassNameMapper.mapperFromLineReaderWithFiltering(
-              reader, diagnosticsHandler, true, allowExperimental));
-    } catch (Exception e) {
-      throw new InvalidMappingFileException(e);
-    }
-  }
-}
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/ProguardMappingProviderImpl.java b/src/main/java/com/android/tools/r8/retrace/internal/ProguardMappingProviderImpl.java
deleted file mode 100644
index c15efef..0000000
--- a/src/main/java/com/android/tools/r8/retrace/internal/ProguardMappingProviderImpl.java
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package com.android.tools.r8.retrace.internal;
-
-import com.android.tools.r8.naming.ClassNameMapper;
-import com.android.tools.r8.naming.ClassNamingForNameMapper;
-import com.android.tools.r8.naming.mappinginformation.MapVersionMappingInformation;
-import com.android.tools.r8.retrace.IllegalClassNameLookupException;
-import com.android.tools.r8.retrace.ProguardMappingProvider;
-import java.util.Set;
-
-/**
- * IntelliJ highlights the class as being invalid because it cannot see getClassNameMapper is
- * defined on the class for some reason.
- */
-public class ProguardMappingProviderImpl extends ProguardMappingProvider {
-
-  private final ClassNameMapper classNameMapper;
-  private final Set<String> allowedLookupTypeNames;
-
-  public ProguardMappingProviderImpl(ClassNameMapper classNameMapper) {
-    this(classNameMapper, null);
-  }
-
-  public ProguardMappingProviderImpl(
-      ClassNameMapper classNameMapper, Set<String> allowedLookupTypeNames) {
-    this.classNameMapper = classNameMapper;
-    this.allowedLookupTypeNames = allowedLookupTypeNames;
-  }
-
-  @Override
-  Set<MapVersionMappingInformation> getMapVersions() {
-    return classNameMapper.getMapVersions();
-  }
-
-  @Override
-  ClassNamingForNameMapper getClassNaming(String typeName) {
-    // TODO(b/226885646): Enable lookup check when there are no additional lookups.
-    if (false && !allowedLookupTypeNames.contains(typeName)) {
-      throw new IllegalClassNameLookupException(typeName);
-    }
-    return classNameMapper.getClassNaming(typeName);
-  }
-
-  @Override
-  String getSourceFileForClass(String typeName) {
-    return classNameMapper.getSourceFile(typeName);
-  }
-}
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/ProguardMappingSupplierBuilderImpl.java b/src/main/java/com/android/tools/r8/retrace/internal/ProguardMappingSupplierBuilderImpl.java
new file mode 100644
index 0000000..8cea599
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/retrace/internal/ProguardMappingSupplierBuilderImpl.java
@@ -0,0 +1,37 @@
+// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.retrace.internal;
+
+import com.android.tools.r8.retrace.ProguardMapProducer;
+import com.android.tools.r8.retrace.ProguardMappingSupplier;
+
+public class ProguardMappingSupplierBuilderImpl extends ProguardMappingSupplier.Builder {
+
+  private ProguardMapProducer proguardMapProducer;
+  private boolean allowExperimental = false;
+
+  @Override
+  public ProguardMappingSupplier.Builder self() {
+    return this;
+  }
+
+  @Override
+  public ProguardMappingSupplier.Builder setAllowExperimental(boolean allowExperimental) {
+    this.allowExperimental = allowExperimental;
+    return self();
+  }
+
+  @Override
+  public ProguardMappingSupplier.Builder setProguardMapProducer(
+      ProguardMapProducer proguardMapProducer) {
+    this.proguardMapProducer = proguardMapProducer;
+    return self();
+  }
+
+  @Override
+  public ProguardMappingSupplier build() {
+    return new ProguardMappingSupplierImpl(proguardMapProducer, allowExperimental);
+  }
+}
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/ProguardMappingSupplierImpl.java b/src/main/java/com/android/tools/r8/retrace/internal/ProguardMappingSupplierImpl.java
new file mode 100644
index 0000000..5df37a4
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/retrace/internal/ProguardMappingSupplierImpl.java
@@ -0,0 +1,137 @@
+// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.retrace.internal;
+
+import com.android.tools.r8.DiagnosticsHandler;
+import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.naming.ClassNamingForNameMapper;
+import com.android.tools.r8.naming.LineReader;
+import com.android.tools.r8.naming.ProguardMapSupplier.ProguardMapChecker;
+import com.android.tools.r8.naming.ProguardMapSupplier.ProguardMapChecker.VerifyMappingFileHashResult;
+import com.android.tools.r8.naming.mappinginformation.MapVersionMappingInformation;
+import com.android.tools.r8.references.ClassReference;
+import com.android.tools.r8.retrace.IllegalClassNameLookupException;
+import com.android.tools.r8.retrace.InvalidMappingFileException;
+import com.android.tools.r8.retrace.ProguardMapProducer;
+import com.android.tools.r8.retrace.ProguardMappingSupplier;
+import com.android.tools.r8.retrace.internal.ProguardMapReaderWithFiltering.ProguardMapReaderWithFilteringInputBuffer;
+import com.android.tools.r8.retrace.internal.ProguardMapReaderWithFiltering.ProguardMapReaderWithFilteringMappedBuffer;
+import com.android.tools.r8.utils.ExceptionDiagnostic;
+import com.android.tools.r8.utils.StringDiagnostic;
+import com.google.common.io.CharStreams;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.nio.charset.StandardCharsets;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.function.Predicate;
+
+/**
+ * IntelliJ highlights the class as being invalid because it cannot see getClassNameMapper is
+ * defined on the class for some reason.
+ */
+public class ProguardMappingSupplierImpl extends ProguardMappingSupplier {
+
+  private final ProguardMapProducer proguardMapProducer;
+  private final boolean allowExperimental;
+  private boolean allowLookupAllClasses;
+
+  private ClassNameMapper classNameMapper;
+  private final Set<String> pendingClassMappings = new HashSet<>();
+  private final Set<String> buildClassMappings = new HashSet<>();
+
+  public ProguardMappingSupplierImpl(ClassNameMapper classNameMapper) {
+    this.classNameMapper = classNameMapper;
+    this.proguardMapProducer = null;
+    this.allowExperimental = true;
+    this.allowLookupAllClasses = true;
+  }
+
+  ProguardMappingSupplierImpl(ProguardMapProducer proguardMapProducer, boolean allowExperimental) {
+    this.proguardMapProducer = proguardMapProducer;
+    this.allowExperimental = allowExperimental;
+    this.allowLookupAllClasses = allowLookupAllClasses;
+  }
+
+  @Override
+  Set<MapVersionMappingInformation> getMapVersions(DiagnosticsHandler diagnosticsHandler) {
+    return getClassNameMapper(diagnosticsHandler).getMapVersions();
+  }
+
+  @Override
+  ClassNamingForNameMapper getClassNaming(DiagnosticsHandler diagnosticsHandler, String typeName) {
+    ClassNameMapper classNameMapper = getClassNameMapper(diagnosticsHandler);
+    if (!allowLookupAllClasses && !buildClassMappings.contains(typeName)) {
+      throw new IllegalClassNameLookupException(typeName);
+    }
+    return classNameMapper.getClassNaming(typeName);
+  }
+
+  @Override
+  String getSourceFileForClass(DiagnosticsHandler diagnosticsHandler, String typeName) {
+    return getClassNameMapper(diagnosticsHandler).getSourceFile(typeName);
+  }
+
+  private ClassNameMapper getClassNameMapper(DiagnosticsHandler diagnosticsHandler) {
+    if (classNameMapper != null && pendingClassMappings.isEmpty()) {
+      return classNameMapper;
+    }
+    if (classNameMapper != null && !proguardMapProducer.isFileBacked()) {
+      throw new RuntimeException("Cannot re-open a proguard map producer that is not file backed");
+    }
+    try {
+      Predicate<String> buildForClass =
+          allowLookupAllClasses ? null : pendingClassMappings::contains;
+      boolean readPreambleAndSourceFile = classNameMapper == null;
+      LineReader reader =
+          proguardMapProducer.isFileBacked()
+              ? new ProguardMapReaderWithFilteringMappedBuffer(
+                  proguardMapProducer.getPath(), buildForClass, readPreambleAndSourceFile)
+              : new ProguardMapReaderWithFilteringInputBuffer(
+                  proguardMapProducer.get(), buildForClass, readPreambleAndSourceFile);
+      classNameMapper =
+          ClassNameMapper.mapperFromLineReaderWithFiltering(
+                  reader, diagnosticsHandler, true, allowExperimental)
+              .combine(classNameMapper);
+      buildClassMappings.addAll(pendingClassMappings);
+      pendingClassMappings.clear();
+    } catch (Exception e) {
+      throw new InvalidMappingFileException(e);
+    }
+    return classNameMapper;
+  }
+
+  @Override
+  public ProguardMappingSupplier registerUse(ClassReference classReference) {
+    pendingClassMappings.add(classReference.getTypeName());
+    return this;
+  }
+
+  @Override
+  public ProguardMappingSupplier allowLookupAllClasses() {
+    this.allowLookupAllClasses = true;
+    return this;
+  }
+
+  @Override
+  public void verifyMappingFileHash(DiagnosticsHandler diagnosticsHandler) {
+    try (InputStream reader = proguardMapProducer.get()) {
+      VerifyMappingFileHashResult checkResult =
+          ProguardMapChecker.validateProguardMapHash(
+              CharStreams.toString(new InputStreamReader(reader, StandardCharsets.UTF_8)));
+      if (checkResult.isError()) {
+        diagnosticsHandler.error(new StringDiagnostic(checkResult.getMessage()));
+        throw new RuntimeException(checkResult.getMessage());
+      }
+      if (!checkResult.isOk()) {
+        diagnosticsHandler.warning(new StringDiagnostic(checkResult.getMessage()));
+      }
+    } catch (IOException e) {
+      diagnosticsHandler.error(new ExceptionDiagnostic(e));
+      throw new RuntimeException(e);
+    }
+  }
+}
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/RetracerImpl.java b/src/main/java/com/android/tools/r8/retrace/internal/RetracerImpl.java
index 346b417..daec745 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/RetracerImpl.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/RetracerImpl.java
@@ -10,7 +10,7 @@
 import com.android.tools.r8.references.FieldReference;
 import com.android.tools.r8.references.MethodReference;
 import com.android.tools.r8.references.TypeReference;
-import com.android.tools.r8.retrace.MappingProvider;
+import com.android.tools.r8.retrace.MappingSupplier;
 import com.android.tools.r8.retrace.RetraceFrameResult;
 import com.android.tools.r8.retrace.RetraceStackTraceContext;
 import com.android.tools.r8.retrace.Retracer;
@@ -21,14 +21,14 @@
 /** A default implementation for the retrace api using the ClassNameMapper defined in R8. */
 public class RetracerImpl implements Retracer {
 
-  private final MappingProviderInternal classNameMapperProvider;
+  private final MappingSupplierInternal classNameMapperSupplier;
   private final DiagnosticsHandler diagnosticsHandler;
 
   private RetracerImpl(
-      MappingProviderInternal classNameMapperProvider, DiagnosticsHandler diagnosticsHandler) {
-    this.classNameMapperProvider = classNameMapperProvider;
+      MappingSupplierInternal classNameMapperSupplier, DiagnosticsHandler diagnosticsHandler) {
+    this.classNameMapperSupplier = classNameMapperSupplier;
     this.diagnosticsHandler = diagnosticsHandler;
-    assert classNameMapperProvider != null;
+    assert classNameMapperSupplier != null;
   }
 
   public DiagnosticsHandler getDiagnosticsHandler() {
@@ -70,7 +70,9 @@
   @Override
   public RetraceClassResultImpl retraceClass(ClassReference classReference) {
     return RetraceClassResultImpl.create(
-        classReference, classNameMapperProvider.getClassNaming(classReference.getTypeName()), this);
+        classReference,
+        classNameMapperSupplier.getClassNaming(diagnosticsHandler, classReference.getTypeName()),
+        this);
   }
 
   @Override
@@ -84,11 +86,12 @@
   }
 
   public Set<MapVersionMappingInformation> getMapVersions() {
-    return classNameMapperProvider.getMapVersions();
+    return classNameMapperSupplier.getMapVersions(diagnosticsHandler);
   }
 
   public String getSourceFile(ClassReference classReference) {
-    return classNameMapperProvider.getSourceFileForClass(classReference.getTypeName());
+    return classNameMapperSupplier.getSourceFileForClass(
+        diagnosticsHandler, classReference.getTypeName());
   }
 
   public static Builder builder() {
@@ -97,14 +100,14 @@
 
   public static class Builder implements RetracerBuilder {
 
-    private MappingProvider mappingProvider;
+    private MappingSupplier mappingSupplier;
     private DiagnosticsHandler diagnosticsHandler = new DiagnosticsHandler() {};
 
     private Builder() {}
 
     @Override
-    public Builder setMappingProvider(MappingProvider mappingProvider) {
-      this.mappingProvider = mappingProvider;
+    public Builder setMappingSupplier(MappingSupplier mappingSupplier) {
+      this.mappingSupplier = mappingSupplier;
       return this;
     }
 
@@ -116,7 +119,7 @@
 
     @Override
     public RetracerImpl build() {
-      return new RetracerImpl(mappingProvider, diagnosticsHandler);
+      return new RetracerImpl(mappingSupplier, diagnosticsHandler);
     }
   }
 }
diff --git a/src/test/java/com/android/tools/r8/benchmarks/retrace/RetraceStackTraceBenchmark.java b/src/test/java/com/android/tools/r8/benchmarks/retrace/RetraceStackTraceBenchmark.java
index e1f0d55..001c239 100644
--- a/src/test/java/com/android/tools/r8/benchmarks/retrace/RetraceStackTraceBenchmark.java
+++ b/src/test/java/com/android/tools/r8/benchmarks/retrace/RetraceStackTraceBenchmark.java
@@ -10,6 +10,7 @@
 import com.android.tools.r8.benchmarks.BenchmarkMethod;
 import com.android.tools.r8.benchmarks.BenchmarkTarget;
 import com.android.tools.r8.retrace.ProguardMapProducer;
+import com.android.tools.r8.retrace.ProguardMappingSupplier;
 import com.android.tools.r8.retrace.Retrace;
 import com.android.tools.r8.retrace.RetraceCommand;
 import com.google.common.collect.ImmutableList;
@@ -69,8 +70,12 @@
                   long start = System.nanoTime();
                   Retrace.run(
                       RetraceCommand.builder()
-                          .setProguardMapProducer(
-                              ProguardMapProducer.fromPath(dependencyRoot.resolve("r8lib.jar.map")))
+                          .setMappingSupplier(
+                              ProguardMappingSupplier.builder()
+                                  .setProguardMapProducer(
+                                      ProguardMapProducer.fromPath(
+                                          dependencyRoot.resolve("r8lib.jar.map")))
+                                  .build())
                           .setStackTrace(stackTrace)
                           .setRetracedStackTraceConsumer(retraced::addAll)
                           .build());
diff --git a/src/test/java/com/android/tools/r8/cf/bootstrap/BootstrapCurrentEqualityTest.java b/src/test/java/com/android/tools/r8/cf/bootstrap/BootstrapCurrentEqualityTest.java
index 10ac394..f7ce233 100644
--- a/src/test/java/com/android/tools/r8/cf/bootstrap/BootstrapCurrentEqualityTest.java
+++ b/src/test/java/com/android/tools/r8/cf/bootstrap/BootstrapCurrentEqualityTest.java
@@ -21,6 +21,7 @@
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.ProcessResult;
 import com.android.tools.r8.retrace.ProguardMapProducer;
+import com.android.tools.r8.retrace.ProguardMappingSupplier;
 import com.android.tools.r8.retrace.Retrace;
 import com.android.tools.r8.retrace.RetraceCommand;
 import com.android.tools.r8.utils.FileUtils;
@@ -138,7 +139,10 @@
     RetraceCommand retraceCommand =
         RetraceCommand.builder()
             .setStackTrace(StringUtils.splitLines(processResult.stderr))
-            .setProguardMapProducer(ProguardMapProducer.fromPath(r8R8Release.getSecond()))
+            .setMappingSupplier(
+                ProguardMappingSupplier.builder()
+                    .setProguardMapProducer(ProguardMapProducer.fromPath(r8R8Release.getSecond()))
+                    .build())
             .setRetracedStackTraceConsumer(
                 retraced -> {
                   int expectedIndex = -1;
diff --git a/src/test/java/com/android/tools/r8/internal/retrace/RetraceTests.java b/src/test/java/com/android/tools/r8/internal/retrace/RetraceTests.java
index d283ee6..0e5ce56 100644
--- a/src/test/java/com/android/tools/r8/internal/retrace/RetraceTests.java
+++ b/src/test/java/com/android/tools/r8/internal/retrace/RetraceTests.java
@@ -14,6 +14,7 @@
 import com.android.tools.r8.internal.retrace.stacktraces.FinskyStackTrace;
 import com.android.tools.r8.internal.retrace.stacktraces.VelvetStackTrace;
 import com.android.tools.r8.retrace.ProguardMapProducer;
+import com.android.tools.r8.retrace.ProguardMappingSupplier;
 import com.android.tools.r8.retrace.Retrace;
 import com.android.tools.r8.retrace.RetraceCommand;
 import com.android.tools.r8.retrace.stacktraces.StackTraceForTest;
@@ -199,7 +200,11 @@
     TestDiagnosticMessagesImpl diagnosticsHandler = new TestDiagnosticMessagesImpl();
     RetraceCommand retraceCommand =
         RetraceCommand.builder(diagnosticsHandler)
-            .setProguardMapProducer(ProguardMapProducer.fromString(stackTraceForTest.mapping()))
+            .setMappingSupplier(
+                ProguardMappingSupplier.builder()
+                    .setProguardMapProducer(
+                        ProguardMapProducer.fromString(stackTraceForTest.mapping()))
+                    .build())
             .setStackTrace(stackTraceForTest.obfuscatedStackTrace())
             .setRegularExpression(regularExpression)
             .setRetracedStackTraceConsumer(
diff --git a/src/test/java/com/android/tools/r8/naming/retrace/StackTrace.java b/src/test/java/com/android/tools/r8/naming/retrace/StackTrace.java
index 4fdc4b7..1619359 100644
--- a/src/test/java/com/android/tools/r8/naming/retrace/StackTrace.java
+++ b/src/test/java/com/android/tools/r8/naming/retrace/StackTrace.java
@@ -12,8 +12,9 @@
 import com.android.tools.r8.ToolHelper.DexVm;
 import com.android.tools.r8.references.ClassReference;
 import com.android.tools.r8.retrace.ProguardMapProducer;
+import com.android.tools.r8.retrace.ProguardMappingSupplier;
+import com.android.tools.r8.retrace.Retrace;
 import com.android.tools.r8.retrace.RetraceCommand;
-import com.android.tools.r8.retrace.RetraceHelper;
 import com.android.tools.r8.utils.Box;
 import com.android.tools.r8.utils.StringUtils;
 import com.google.common.base.Equivalence;
@@ -378,13 +379,16 @@
     List<String> stackTrace =
         stackTraceLines.stream().map(line -> line.originalLine).collect(Collectors.toList());
     stackTrace.add(0, exceptionLine);
-    RetraceHelper.runForTesting(
+    Retrace.run(
         RetraceCommand.builder()
-            .setProguardMapProducer(ProguardMapProducer.fromString(map))
+            .setMappingSupplier(
+                ProguardMappingSupplier.builder()
+                    .setProguardMapProducer(ProguardMapProducer.fromString(map))
+                    .setAllowExperimental(allowExperimentalMapping)
+                    .build())
             .setStackTrace(stackTrace)
             .setRetracedStackTraceConsumer(box::set)
-            .build(),
-        allowExperimentalMapping);
+            .build());
     // Keep the original stderr in the retraced stacktrace.
     return new StackTrace(
         box.get().get(0), internalConvert(box.get().stream().skip(1)), originalStderr);
diff --git a/src/test/java/com/android/tools/r8/naming/retraceproguard/CatchAllRangeWithNoLineNumberTest.java b/src/test/java/com/android/tools/r8/naming/retraceproguard/CatchAllRangeWithNoLineNumberTest.java
index 34da9a6..4372134 100644
--- a/src/test/java/com/android/tools/r8/naming/retraceproguard/CatchAllRangeWithNoLineNumberTest.java
+++ b/src/test/java/com/android/tools/r8/naming/retraceproguard/CatchAllRangeWithNoLineNumberTest.java
@@ -10,8 +10,10 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.retrace.ProguardMapProducer;
-import com.android.tools.r8.retrace.RetraceOptions;
-import com.android.tools.r8.retrace.StringRetrace;
+import com.android.tools.r8.retrace.ProguardMappingSupplier;
+import com.android.tools.r8.retrace.Retrace;
+import com.android.tools.r8.retrace.RetraceCommand;
+import com.android.tools.r8.utils.Box;
 import com.android.tools.r8.utils.StringUtils;
 import java.io.IOException;
 import java.util.Arrays;
@@ -98,13 +100,18 @@
 
   @Test
   public void testCatchAllRangeR8() {
-    List<String> retrace =
-        StringRetrace.create(
-                RetraceOptions.builder()
+    Box<String> retracedString = new Box<>();
+    Retrace.run(
+        RetraceCommand.builder()
+            .setRetracedStackTraceConsumer(
+                retraced -> retracedString.set(StringUtils.lines(retraced)))
+            .setMappingSupplier(
+                ProguardMappingSupplier.builder()
                     .setProguardMapProducer(ProguardMapProducer.fromString(mapping))
                     .build())
-            .retrace(Arrays.asList(stackTrace));
-    assertEquals(retracedR8, StringUtils.lines(retrace));
+            .setStackTrace(Arrays.asList(stackTrace))
+            .build());
+    assertEquals(retracedR8, retracedString.get());
   }
 
   private String getExpected() {
diff --git a/src/test/java/com/android/tools/r8/retrace/DuplicateMappingsTest.java b/src/test/java/com/android/tools/r8/retrace/DuplicateMappingsTest.java
index 06899fd..5dcca78 100644
--- a/src/test/java/com/android/tools/r8/retrace/DuplicateMappingsTest.java
+++ b/src/test/java/com/android/tools/r8/retrace/DuplicateMappingsTest.java
@@ -37,13 +37,16 @@
     TestDiagnosticMessagesImpl diagnosticsHandler = new TestDiagnosticMessagesImpl();
     Retrace.run(
         RetraceCommand.builder(diagnosticsHandler)
-            .setProguardMapProducer(
-                ProguardMapProducer.fromString(
-                    StringUtils.lines(
-                        "com.android.tools.r8.retrace.SourceFileTest$ClassWithCustomFileName ->"
-                            + " com.android.tools.r8.retrace.a:",
-                        "# {'id':'sourceFile','fileName':'foobarbaz.java'}",
-                        "# {'id':'sourceFile','fileName':'foobarbaz2.java'}")))
+            .setMappingSupplier(
+                ProguardMappingSupplier.builder()
+                    .setProguardMapProducer(
+                        ProguardMapProducer.fromString(
+                            StringUtils.lines(
+                                "com.android.tools.r8.retrace.SourceFileTest"
+                                    + "$ClassWithCustomFileName -> com.android.tools.r8.retrace.a:",
+                                "# {'id':'sourceFile','fileName':'foobarbaz.java'}",
+                                "# {'id':'sourceFile','fileName':'foobarbaz2.java'}")))
+                    .build())
             .setStackTrace(ImmutableList.of(" at com.android.tools.r8.retrace.a.foo(Unknown)"))
             .setRetracedStackTraceConsumer(
                 strings -> {
diff --git a/src/test/java/com/android/tools/r8/retrace/OverloadsWithoutLineNumberTest.java b/src/test/java/com/android/tools/r8/retrace/OverloadsWithoutLineNumberTest.java
index 56622ac..3aa2f49 100644
--- a/src/test/java/com/android/tools/r8/retrace/OverloadsWithoutLineNumberTest.java
+++ b/src/test/java/com/android/tools/r8/retrace/OverloadsWithoutLineNumberTest.java
@@ -55,11 +55,14 @@
             .collect(Collectors.toList());
     RetraceCommand.Builder builder =
         RetraceCommand.builder()
-            .setProguardMapProducer(ProguardMapProducer.fromString(run.proguardMap()))
+            .setMappingSupplier(
+                ProguardMappingSupplier.builder()
+                    .setProguardMapProducer(ProguardMapProducer.fromString(run.proguardMap()))
+                    .build())
             .setStackTrace(originalStackTrace)
             .setRetracedStackTraceConsumer(box::set)
             .setVerbose(true);
-    RetraceHelper.runForTesting(builder.build(), false);
+    Retrace.run(builder.build());
     // TODO(b/221015863): This should ideally be:
     // at " + typeName(ClassWithOverload.class) + ".test(int)(OverloadsWithoutLineNumberTest.java)
     if (parameters.canUseNativeDexPC()) {
diff --git a/src/test/java/com/android/tools/r8/retrace/RetraceTests.java b/src/test/java/com/android/tools/r8/retrace/RetraceTests.java
index 31dd142..b36d379 100644
--- a/src/test/java/com/android/tools/r8/retrace/RetraceTests.java
+++ b/src/test/java/com/android/tools/r8/retrace/RetraceTests.java
@@ -152,7 +152,11 @@
     NullStackTrace nullStackTrace = new NullStackTrace();
     RetraceCommand retraceCommand =
         RetraceCommand.builder(diagnosticsHandler)
-            .setProguardMapProducer(ProguardMapProducer.fromString(nullStackTrace.mapping()))
+            .setMappingSupplier(
+                ProguardMappingSupplier.builder()
+                    .setProguardMapProducer(
+                        ProguardMapProducer.fromString(nullStackTrace.mapping()))
+                    .build())
             .setStackTrace(nullStackTrace.obfuscatedStackTrace())
             .setRetracedStackTraceConsumer(retraced -> fail())
             .build();
@@ -493,13 +497,18 @@
       TestDiagnosticMessagesImpl diagnosticsHandler = new TestDiagnosticMessagesImpl();
       RetraceCommand retraceCommand =
           RetraceCommand.builder(diagnosticsHandler)
-              .setProguardMapProducer(ProguardMapProducer.fromString(stackTraceForTest.mapping()))
+              .setMappingSupplier(
+                  ProguardMappingSupplier.builder()
+                      .setProguardMapProducer(
+                          ProguardMapProducer.fromString(stackTraceForTest.mapping()))
+                      .setAllowExperimental(allowExperimentalMapping)
+                      .build())
               .setStackTrace(stackTraceForTest.obfuscatedStackTrace())
               .setRetracedStackTraceConsumer(
                   retraced -> assertEquals(expectedStackTrace, StringUtils.joinLines(retraced)))
               .setVerbose(verbose)
               .build();
-      Retrace.runForTesting(retraceCommand, allowExperimentalMapping);
+      Retrace.run(retraceCommand);
       return diagnosticsHandler;
     }
   }
diff --git a/src/test/java/com/android/tools/r8/retrace/RetraceWhitespaceTest.java b/src/test/java/com/android/tools/r8/retrace/RetraceWhitespaceTest.java
index 7b9c08d..17b6600 100644
--- a/src/test/java/com/android/tools/r8/retrace/RetraceWhitespaceTest.java
+++ b/src/test/java/com/android/tools/r8/retrace/RetraceWhitespaceTest.java
@@ -64,7 +64,10 @@
         () ->
             Retrace.run(
                 RetraceCommand.builder()
-                    .setProguardMapProducer(ProguardMapProducer.fromPath(mappingFile))
+                    .setMappingSupplier(
+                        ProguardMappingSupplier.builder()
+                            .setProguardMapProducer(ProguardMapProducer.fromPath(mappingFile))
+                            .build())
                     .setStackTrace(STACKTRACE)
                     .setRetracedStackTraceConsumer(lines -> {})
                     .build()));
diff --git a/src/test/java/com/android/tools/r8/retrace/StackTraceRegularExpressionParserTests.java b/src/test/java/com/android/tools/r8/retrace/StackTraceRegularExpressionParserTests.java
index 91428db..1ea73cc 100644
--- a/src/test/java/com/android/tools/r8/retrace/StackTraceRegularExpressionParserTests.java
+++ b/src/test/java/com/android/tools/r8/retrace/StackTraceRegularExpressionParserTests.java
@@ -1140,7 +1140,11 @@
     TestDiagnosticMessagesImpl diagnosticsHandler = new TestDiagnosticMessagesImpl();
     RetraceCommand retraceCommand =
         RetraceCommand.builder(diagnosticsHandler)
-            .setProguardMapProducer(ProguardMapProducer.fromString(stackTraceForTest.mapping()))
+            .setMappingSupplier(
+                ProguardMappingSupplier.builder()
+                    .setProguardMapProducer(
+                        ProguardMapProducer.fromString(stackTraceForTest.mapping()))
+                    .build())
             .setStackTrace(stackTraceForTest.obfuscatedStackTrace())
             .setRetracedStackTraceConsumer(
                 retraced -> {
diff --git a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiInlineInOutlineTest.java b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiInlineInOutlineTest.java
index 9ca6e87..845e1de 100644
--- a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiInlineInOutlineTest.java
+++ b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiInlineInOutlineTest.java
@@ -9,9 +9,8 @@
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.references.ClassReference;
 import com.android.tools.r8.references.Reference;
-import com.android.tools.r8.retrace.MappingProvider;
 import com.android.tools.r8.retrace.ProguardMapProducer;
-import com.android.tools.r8.retrace.ProguardMappingProvider;
+import com.android.tools.r8.retrace.ProguardMappingSupplier;
 import com.android.tools.r8.retrace.RetraceFrameElement;
 import com.android.tools.r8.retrace.RetraceStackTraceContext;
 import com.android.tools.r8.retrace.RetracedMethodReference;
@@ -63,12 +62,12 @@
 
     @Test
     public void test() {
-      MappingProvider mappingProvider =
-          ProguardMappingProvider.builder()
+      ProguardMappingSupplier mappingProvider =
+          ProguardMappingSupplier.builder()
               .setProguardMapProducer(ProguardMapProducer.fromString(mapping))
-              .allowLookupAllClasses()
-              .build();
-      Retracer retracer = Retracer.builder().setMappingProvider(mappingProvider).build();
+              .build()
+              .allowLookupAllClasses();
+      Retracer retracer = Retracer.builder().setMappingSupplier(mappingProvider).build();
       List<RetraceFrameElement> outlineRetraced =
           retracer
               .retraceFrame(
diff --git a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiOutlineInOutlineStackTrace.java b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiOutlineInOutlineStackTrace.java
index 650953c..0039599 100644
--- a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiOutlineInOutlineStackTrace.java
+++ b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiOutlineInOutlineStackTrace.java
@@ -10,9 +10,8 @@
 import com.android.tools.r8.references.ClassReference;
 import com.android.tools.r8.references.MethodReference;
 import com.android.tools.r8.references.Reference;
-import com.android.tools.r8.retrace.MappingProvider;
 import com.android.tools.r8.retrace.ProguardMapProducer;
-import com.android.tools.r8.retrace.ProguardMappingProvider;
+import com.android.tools.r8.retrace.ProguardMappingSupplier;
 import com.android.tools.r8.retrace.RetraceFrameElement;
 import com.android.tools.r8.retrace.RetraceStackTraceContext;
 import com.android.tools.r8.retrace.RetracedMethodReference;
@@ -71,12 +70,12 @@
 
     @Test
     public void test() {
-      MappingProvider mappingProvider =
-          ProguardMappingProvider.builder()
+      ProguardMappingSupplier mappingProvider =
+          ProguardMappingSupplier.builder()
               .setProguardMapProducer(ProguardMapProducer.fromString(mapping))
-              .allowLookupAllClasses()
-              .build();
-      Retracer retracer = Retracer.builder().setMappingProvider(mappingProvider).build();
+              .build()
+              .allowLookupAllClasses();
+      Retracer retracer = Retracer.builder().setMappingSupplier(mappingProvider).build();
       // Retrace the first outline.
       RetraceStackTraceContext outlineContext =
           retraceOutline(
diff --git a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiOutlineInlineTest.java b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiOutlineInlineTest.java
index 1c67ac5..0367fff 100644
--- a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiOutlineInlineTest.java
+++ b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiOutlineInlineTest.java
@@ -9,9 +9,8 @@
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.references.ClassReference;
 import com.android.tools.r8.references.Reference;
-import com.android.tools.r8.retrace.MappingProvider;
 import com.android.tools.r8.retrace.ProguardMapProducer;
-import com.android.tools.r8.retrace.ProguardMappingProvider;
+import com.android.tools.r8.retrace.ProguardMappingSupplier;
 import com.android.tools.r8.retrace.RetraceFrameElement;
 import com.android.tools.r8.retrace.RetraceStackTraceContext;
 import com.android.tools.r8.retrace.RetracedMethodReference;
@@ -62,12 +61,12 @@
 
     @Test
     public void test() {
-      MappingProvider mappingProvider =
-          ProguardMappingProvider.builder()
+      ProguardMappingSupplier mappingSupplier =
+          ProguardMappingSupplier.builder()
               .setProguardMapProducer(ProguardMapProducer.fromString(mapping))
-              .allowLookupAllClasses()
-              .build();
-      Retracer retracer = Retracer.builder().setMappingProvider(mappingProvider).build();
+              .build()
+              .allowLookupAllClasses();
+      Retracer retracer = Retracer.builder().setMappingSupplier(mappingSupplier).build();
       List<RetraceFrameElement> outlineRetraced =
           retracer
               .retraceFrame(
diff --git a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiOutlineNoInlineTest.java b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiOutlineNoInlineTest.java
index d77819d..998b60b 100644
--- a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiOutlineNoInlineTest.java
+++ b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiOutlineNoInlineTest.java
@@ -10,9 +10,8 @@
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.references.ClassReference;
 import com.android.tools.r8.references.Reference;
-import com.android.tools.r8.retrace.MappingProvider;
 import com.android.tools.r8.retrace.ProguardMapProducer;
-import com.android.tools.r8.retrace.ProguardMappingProvider;
+import com.android.tools.r8.retrace.ProguardMappingSupplier;
 import com.android.tools.r8.retrace.RetraceFrameElement;
 import com.android.tools.r8.retrace.RetraceStackTraceContext;
 import com.android.tools.r8.retrace.RetracedMethodReference;
@@ -62,12 +61,12 @@
 
     @Test
     public void test() {
-      MappingProvider mappingProvider =
-          ProguardMappingProvider.builder()
+      ProguardMappingSupplier mappingProvider =
+          ProguardMappingSupplier.builder()
               .setProguardMapProducer(ProguardMapProducer.fromString(mapping))
-              .allowLookupAllClasses()
-              .build();
-      Retracer retracer = Retracer.builder().setMappingProvider(mappingProvider).build();
+              .build()
+              .allowLookupAllClasses();
+      Retracer retracer = Retracer.builder().setMappingSupplier(mappingProvider).build();
       List<RetraceFrameElement> outlineRetraced =
           retracer
               .retraceFrame(
diff --git a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiRewriteFrameInlineNpeResidualTest.java b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiRewriteFrameInlineNpeResidualTest.java
index 6251b54..8e97bf4 100644
--- a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiRewriteFrameInlineNpeResidualTest.java
+++ b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiRewriteFrameInlineNpeResidualTest.java
@@ -10,9 +10,8 @@
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.references.ClassReference;
 import com.android.tools.r8.references.Reference;
-import com.android.tools.r8.retrace.MappingProvider;
 import com.android.tools.r8.retrace.ProguardMapProducer;
-import com.android.tools.r8.retrace.ProguardMappingProvider;
+import com.android.tools.r8.retrace.ProguardMappingSupplier;
 import com.android.tools.r8.retrace.RetraceFrameElement;
 import com.android.tools.r8.retrace.RetraceStackTraceContext;
 import com.android.tools.r8.retrace.RetraceThrownExceptionElement;
@@ -80,12 +79,12 @@
 
     @Test
     public void testUsingObfuscatedName() {
-      MappingProvider mappingProvider =
-          ProguardMappingProvider.builder()
+      ProguardMappingSupplier mappingProvider =
+          ProguardMappingSupplier.builder()
               .setProguardMapProducer(ProguardMapProducer.fromString(mapping))
-              .allowLookupAllClasses()
-              .build();
-      Retracer retracer = Retracer.builder().setMappingProvider(mappingProvider).build();
+              .build()
+              .allowLookupAllClasses();
+      Retracer retracer = Retracer.builder().setMappingSupplier(mappingProvider).build();
       List<RetraceThrownExceptionElement> npeRetraced =
           retracer.retraceThrownException(renamedException).stream().collect(Collectors.toList());
       assertEquals(1, npeRetraced.size());
diff --git a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiRewriteFrameInlineNpeTest.java b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiRewriteFrameInlineNpeTest.java
index 6d3bd5b..1235285 100644
--- a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiRewriteFrameInlineNpeTest.java
+++ b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiRewriteFrameInlineNpeTest.java
@@ -11,9 +11,8 @@
 import com.android.tools.r8.DiagnosticsHandler;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.references.Reference;
-import com.android.tools.r8.retrace.MappingProvider;
 import com.android.tools.r8.retrace.ProguardMapProducer;
-import com.android.tools.r8.retrace.ProguardMappingProvider;
+import com.android.tools.r8.retrace.ProguardMappingSupplier;
 import com.android.tools.r8.retrace.RetraceFrameElement;
 import com.android.tools.r8.retrace.RetraceStackTraceContext;
 import com.android.tools.r8.retrace.RetraceThrownExceptionElement;
@@ -60,15 +59,14 @@
     @Test
     public void testFirstStackLineIsRemoved() {
       TestDiagnosticsHandler testDiagnosticsHandler = new TestDiagnosticsHandler();
-      MappingProvider mappingProvider =
-          ProguardMappingProvider.builder()
+      ProguardMappingSupplier mappingProvider =
+          ProguardMappingSupplier.builder()
               .setProguardMapProducer(ProguardMapProducer.fromString(mapping))
-              .setDiagnosticsHandler(testDiagnosticsHandler)
-              .allowLookupAllClasses()
-              .build();
+              .build()
+              .allowLookupAllClasses();
       Retracer retracer =
           Retracer.builder()
-              .setMappingProvider(mappingProvider)
+              .setMappingSupplier(mappingProvider)
               .setDiagnosticsHandler(testDiagnosticsHandler)
               .build();
 
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java b/src/test/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java
index efcf8a9..74b5de5 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java
@@ -36,7 +36,7 @@
 import com.android.tools.r8.references.MethodReference;
 import com.android.tools.r8.references.Reference;
 import com.android.tools.r8.retrace.Retracer;
-import com.android.tools.r8.retrace.internal.ProguardMappingProviderImpl;
+import com.android.tools.r8.retrace.internal.ProguardMappingSupplierImpl;
 import com.android.tools.r8.synthesis.SyntheticItemsTestUtils;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.BiMapContainer;
@@ -185,7 +185,7 @@
     if (lazyRetracer == null) {
       lazyRetracer =
           Retracer.builder()
-              .setMappingProvider(new ProguardMappingProviderImpl(mapping))
+              .setMappingSupplier(new ProguardMappingSupplierImpl(mapping))
               .setDiagnosticsHandler(new TestDiagnosticMessagesImpl())
               .build();
     }
@@ -549,8 +549,8 @@
 
   public Retracer retrace() {
     return Retracer.builder()
-        .setMappingProvider(
-            new ProguardMappingProviderImpl(
+        .setMappingSupplier(
+            new ProguardMappingSupplierImpl(
                 mapping == null ? ClassNameMapper.builder().build() : mapping))
         .setDiagnosticsHandler(new TestDiagnosticMessagesImpl())
         .build();
diff --git a/third_party/retrace/binary_compatibility.tar.gz.sha1 b/third_party/retrace/binary_compatibility.tar.gz.sha1
index 30ac55d..f8426e3 100644
--- a/third_party/retrace/binary_compatibility.tar.gz.sha1
+++ b/third_party/retrace/binary_compatibility.tar.gz.sha1
@@ -1 +1 @@
-c7b9bd1e5be6caa0e8a8cb6634b7fb73fd48ae8e
\ No newline at end of file
+ab687955f37a07c412cdd689ddea840d9835cad0
\ No newline at end of file