Add public API for adding ART profiles for rewriting

Bug: b/237043695
Change-Id: I9ff06771807471bf8a20f848f8c681f21d86fd27
diff --git a/src/main/java/com/android/tools/r8/BaseCompilerCommand.java b/src/main/java/com/android/tools/r8/BaseCompilerCommand.java
index 0900897..a233e49 100644
--- a/src/main/java/com/android/tools/r8/BaseCompilerCommand.java
+++ b/src/main/java/com/android/tools/r8/BaseCompilerCommand.java
@@ -12,7 +12,9 @@
 import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibrarySpecificationParser;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.humanspecification.HumanDesugaredLibrarySpecification;
 import com.android.tools.r8.origin.Origin;
-import com.android.tools.r8.profile.art.ArtProfileInput;
+import com.android.tools.r8.profile.art.ArtProfileConsumer;
+import com.android.tools.r8.profile.art.ArtProfileForRewriting;
+import com.android.tools.r8.profile.art.ArtProfileProvider;
 import com.android.tools.r8.startup.StartupProfileProvider;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.AndroidApp;
@@ -58,7 +60,7 @@
   private final MapIdProvider mapIdProvider;
   private final SourceFileProvider sourceFileProvider;
   private final boolean isAndroidPlatformBuild;
-  private final List<ArtProfileInput> artProfileInputs;
+  private final List<ArtProfileForRewriting> artProfilesForRewriting;
   private final List<StartupProfileProvider> startupProfileProviders;
   private final ClassConflictResolver classConflictResolver;
 
@@ -80,7 +82,7 @@
     mapIdProvider = null;
     sourceFileProvider = null;
     isAndroidPlatformBuild = false;
-    artProfileInputs = null;
+    artProfilesForRewriting = null;
     startupProfileProviders = null;
     classConflictResolver = null;
   }
@@ -103,7 +105,7 @@
       MapIdProvider mapIdProvider,
       SourceFileProvider sourceFileProvider,
       boolean isAndroidPlatformBuild,
-      List<ArtProfileInput> artProfileInputs,
+      List<ArtProfileForRewriting> artProfilesForRewriting,
       List<StartupProfileProvider> startupProfileProviders,
       ClassConflictResolver classConflictResolver) {
     super(app);
@@ -125,7 +127,7 @@
     this.mapIdProvider = mapIdProvider;
     this.sourceFileProvider = sourceFileProvider;
     this.isAndroidPlatformBuild = isAndroidPlatformBuild;
-    this.artProfileInputs = artProfileInputs;
+    this.artProfilesForRewriting = artProfilesForRewriting;
     this.startupProfileProviders = startupProfileProviders;
     this.classConflictResolver = classConflictResolver;
   }
@@ -224,8 +226,8 @@
     return isAndroidPlatformBuild;
   }
 
-  List<ArtProfileInput> getArtProfileInputs() {
-    return artProfileInputs;
+  List<ArtProfileForRewriting> getArtProfilesForRewriting() {
+    return artProfilesForRewriting;
   }
 
   List<StartupProfileProvider> getStartupProfileProviders() {
@@ -267,7 +269,6 @@
     protected DesugarState desugarState = DesugarState.ON;
     private List<StringResource> desugaredLibrarySpecificationResources = new ArrayList<>();
     private boolean includeClassesChecksum = false;
-    private boolean lookupLibraryBeforeProgram = true;
     private boolean optimizeMultidexForLinearAlloc = false;
     private BiPredicate<String, Long> dexClassChecksumFilter = (name, checksum) -> true;
     private List<AssertionsConfiguration> assertionsConfiguration = new ArrayList<>();
@@ -277,7 +278,7 @@
     private MapIdProvider mapIdProvider = null;
     private SourceFileProvider sourceFileProvider = null;
     private boolean isAndroidPlatformBuild = false;
-    private List<ArtProfileInput> artProfileInputs = new ArrayList<>();
+    private List<ArtProfileForRewriting> artProfilesForRewriting = new ArrayList<>();
     private List<StartupProfileProvider> startupProfileProviders = new ArrayList<>();
     private ClassConflictResolver classConflictResolver = null;
 
@@ -695,17 +696,21 @@
       return isAndroidPlatformBuild;
     }
 
-    B addArtProfileInputs(ArtProfileInput... artProfileInputs) {
-      return addArtProfileInputs(Arrays.asList(artProfileInputs));
-    }
-
-    B addArtProfileInputs(Collection<ArtProfileInput> artProfileInputs) {
-      this.artProfileInputs.addAll(artProfileInputs);
+    /**
+     * Add an ART profiles that should be rewritten to match the residual application. The ART
+     * profile is given to the compiler by the {@link ArtProfileProvider} and passed back to the
+     * {@link ArtProfileConsumer} at the end of compilation when the ART profile has been fully
+     * rewritten to match the residual application.
+     */
+    public B addArtProfileForRewriting(
+        ArtProfileProvider artProfileProvider, ArtProfileConsumer residualArtProfileProvider) {
+      artProfilesForRewriting.add(
+          new ArtProfileForRewriting(artProfileProvider, residualArtProfileProvider));
       return self();
     }
 
-    List<ArtProfileInput> getArtProfileInputs() {
-      return artProfileInputs;
+    List<ArtProfileForRewriting> getArtProfilesForRewriting() {
+      return artProfilesForRewriting;
     }
 
     B addStartupProfileProviders(StartupProfileProvider... startupProfileProviders) {
diff --git a/src/main/java/com/android/tools/r8/D8Command.java b/src/main/java/com/android/tools/r8/D8Command.java
index 687da32..43bcdee 100644
--- a/src/main/java/com/android/tools/r8/D8Command.java
+++ b/src/main/java/com/android/tools/r8/D8Command.java
@@ -13,7 +13,7 @@
 import com.android.tools.r8.inspector.internal.InspectorImpl;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibrarySpecification;
 import com.android.tools.r8.origin.Origin;
-import com.android.tools.r8.profile.art.ArtProfileInput;
+import com.android.tools.r8.profile.art.ArtProfileForRewriting;
 import com.android.tools.r8.shaking.ProguardConfigurationParser;
 import com.android.tools.r8.shaking.ProguardConfigurationRule;
 import com.android.tools.r8.shaking.ProguardConfigurationSource;
@@ -458,7 +458,7 @@
           proguardMapConsumer,
           enableMissingLibraryApiModeling,
           getAndroidPlatformBuild(),
-          getArtProfileInputs(),
+          getArtProfilesForRewriting(),
           getStartupProfileProviders(),
           getClassConflictResolver(),
           factory);
@@ -551,7 +551,7 @@
       StringConsumer proguardMapConsumer,
       boolean enableMissingLibraryApiModeling,
       boolean isAndroidPlatformBuild,
-      List<ArtProfileInput> artProfileInputs,
+      List<ArtProfileForRewriting> artProfilesForRewriting,
       List<StartupProfileProvider> startupProfileProviders,
       ClassConflictResolver classConflictResolver,
       DexItemFactory factory) {
@@ -573,7 +573,7 @@
         mapIdProvider,
         null,
         isAndroidPlatformBuild,
-        artProfileInputs,
+        artProfilesForRewriting,
         startupProfileProviders,
         classConflictResolver);
     this.intermediate = intermediate;
@@ -698,7 +698,10 @@
 
     internal.configureAndroidPlatformBuild(getAndroidPlatformBuild());
 
-    internal.getArtProfileOptions().setArtProfileInputs(getArtProfileInputs()).setPassthrough(true);
+    internal
+        .getArtProfileOptions()
+        .setArtProfilesForRewriting(getArtProfilesForRewriting())
+        .setPassthrough(true);
     internal.getStartupOptions().setStartupProfileProviders(getStartupProfileProviders());
 
     internal.programClassConflictResolver =
diff --git a/src/main/java/com/android/tools/r8/L8Command.java b/src/main/java/com/android/tools/r8/L8Command.java
index 123c7d3..783bab0 100644
--- a/src/main/java/com/android/tools/r8/L8Command.java
+++ b/src/main/java/com/android/tools/r8/L8Command.java
@@ -14,6 +14,7 @@
 import com.android.tools.r8.inspector.Inspector;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibrarySpecification;
 import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.profile.art.ArtProfileForRewriting;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.AssertionConfigurationWithDefault;
@@ -372,8 +373,12 @@
                 .setMode(getMode())
                 .setIncludeClassesChecksum(getIncludeClassesChecksum())
                 .setDexClassChecksumFilter(getDexClassChecksumFilter())
-                .setProgramConsumer(getProgramConsumer())
-                .addArtProfileInputs(getArtProfileInputs());
+                .setProgramConsumer(getProgramConsumer());
+        for (ArtProfileForRewriting artProfileForRewriting : getArtProfilesForRewriting()) {
+          r8Builder.addArtProfileForRewriting(
+              artProfileForRewriting.getArtProfileProvider(),
+              artProfileForRewriting.getResidualArtProfileConsumer());
+        }
         for (ClassFileResourceProvider libraryResourceProvider :
             inputs.getLibraryResourceProviders()) {
           r8Builder.addLibraryResourceProvider(libraryResourceProvider);
@@ -404,8 +409,12 @@
                 .setMode(getMode())
                 .setIncludeClassesChecksum(getIncludeClassesChecksum())
                 .setDexClassChecksumFilter(getDexClassChecksumFilter())
-                .setProgramConsumer(getProgramConsumer())
-                .addArtProfileInputs(getArtProfileInputs());
+                .setProgramConsumer(getProgramConsumer());
+        for (ArtProfileForRewriting artProfileForRewriting : getArtProfilesForRewriting()) {
+          d8Builder.addArtProfileForRewriting(
+              artProfileForRewriting.getArtProfileProvider(),
+              artProfileForRewriting.getResidualArtProfileConsumer());
+        }
         for (ClassFileResourceProvider libraryResourceProvider :
             inputs.getLibraryResourceProviders()) {
           d8Builder.addLibraryResourceProvider(libraryResourceProvider);
diff --git a/src/main/java/com/android/tools/r8/R8Command.java b/src/main/java/com/android/tools/r8/R8Command.java
index 55963a2..8e5a0ec 100644
--- a/src/main/java/com/android/tools/r8/R8Command.java
+++ b/src/main/java/com/android/tools/r8/R8Command.java
@@ -18,7 +18,7 @@
 import com.android.tools.r8.naming.SourceFileRewriter;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.origin.PathOrigin;
-import com.android.tools.r8.profile.art.ArtProfileInput;
+import com.android.tools.r8.profile.art.ArtProfileForRewriting;
 import com.android.tools.r8.shaking.ProguardConfiguration;
 import com.android.tools.r8.shaking.ProguardConfigurationParser;
 import com.android.tools.r8.shaking.ProguardConfigurationParserOptions;
@@ -663,7 +663,7 @@
               getSourceFileProvider(),
               enableMissingLibraryApiModeling,
               getAndroidPlatformBuild(),
-              getArtProfileInputs(),
+              getArtProfilesForRewriting(),
               getStartupProfileProviders(),
               getClassConflictResolver());
 
@@ -852,7 +852,7 @@
       SourceFileProvider sourceFileProvider,
       boolean enableMissingLibraryApiModeling,
       boolean isAndroidPlatformBuild,
-      List<ArtProfileInput> artProfileInputs,
+      List<ArtProfileForRewriting> artProfilesForRewriting,
       List<StartupProfileProvider> startupProfileProviders,
       ClassConflictResolver classConflictResolver) {
     super(
@@ -873,7 +873,7 @@
         mapIdProvider,
         sourceFileProvider,
         isAndroidPlatformBuild,
-        artProfileInputs,
+        artProfilesForRewriting,
         startupProfileProviders,
         classConflictResolver);
     assert proguardConfiguration != null;
@@ -1075,7 +1075,7 @@
 
     internal.configureAndroidPlatformBuild(getAndroidPlatformBuild());
 
-    internal.getArtProfileOptions().setArtProfileInputs(getArtProfileInputs());
+    internal.getArtProfileOptions().setArtProfilesForRewriting(getArtProfilesForRewriting());
     internal.getStartupOptions().setStartupProfileProviders(getStartupProfileProviders());
 
     internal.programClassConflictResolver =
diff --git a/src/main/java/com/android/tools/r8/profile/art/ArtProfile.java b/src/main/java/com/android/tools/r8/profile/art/ArtProfile.java
index 37b9011..f4418ba 100644
--- a/src/main/java/com/android/tools/r8/profile/art/ArtProfile.java
+++ b/src/main/java/com/android/tools/r8/profile/art/ArtProfile.java
@@ -42,7 +42,7 @@
         (methodRule, builderFactory) ->
             builderFactory
                 .apply(lens.getRenamedMethodSignature(methodRule.getMethod()))
-                .internalSetMethodRuleInfo(
+                .acceptMethodRuleInfoBuilder(
                     methodRuleInfoBuilder ->
                         methodRuleInfoBuilder.merge(methodRule.getMethodRuleInfo())));
   }
@@ -55,7 +55,7 @@
         (methodRule, builderFactory) ->
             builderFactory
                 .apply(lens.lookupMethod(methodRule.getMethod(), dexItemFactory))
-                .internalSetMethodRuleInfo(
+                .acceptMethodRuleInfoBuilder(
                     methodRuleInfoBuilder ->
                         methodRuleInfoBuilder.merge(methodRule.getMethodRuleInfo())));
   }
@@ -71,7 +71,7 @@
           if (!prunedItems.isRemoved(methodRule.getMethod())) {
             builderFactory
                 .apply(methodRule.getMethod())
-                .internalSetMethodRuleInfo(
+                .acceptMethodRuleInfoBuilder(
                     methodRuleInfoBuilder ->
                         methodRuleInfoBuilder.merge(methodRule.getMethodRuleInfo()));
           }
@@ -116,9 +116,9 @@
     return new ArtProfile(newRules.build());
   }
 
-  public void supplyConsumer(ResidualArtProfileConsumer consumer, Reporter reporter) {
+  public void supplyConsumer(ArtProfileConsumer consumer, Reporter reporter) {
     if (consumer != null) {
-      ResidualArtProfileRuleConsumer ruleConsumer = consumer.getRuleConsumer();
+      ArtProfileRuleConsumer ruleConsumer = consumer.getRuleConsumer();
       if (ruleConsumer != null) {
         for (ArtProfileRule rule : rules) {
           rule.accept(
diff --git a/src/main/java/com/android/tools/r8/profile/art/ArtProfileBuilder.java b/src/main/java/com/android/tools/r8/profile/art/ArtProfileBuilder.java
index 930aade..d5af9c8 100644
--- a/src/main/java/com/android/tools/r8/profile/art/ArtProfileBuilder.java
+++ b/src/main/java/com/android/tools/r8/profile/art/ArtProfileBuilder.java
@@ -4,10 +4,11 @@
 
 package com.android.tools.r8.profile.art;
 
+import com.android.tools.r8.Keep;
 import java.util.function.Consumer;
 
 /** API for building an ART profile. */
-// TODO(b/237043695): @Keep this when adding a public API for passing ART profiles to the compiler.
+@Keep
 public interface ArtProfileBuilder {
 
   ArtProfileBuilder addClassRule(Consumer<ArtProfileClassRuleBuilder> classRuleBuilderConsumer);
diff --git a/src/main/java/com/android/tools/r8/profile/art/ArtProfileClassRuleBuilder.java b/src/main/java/com/android/tools/r8/profile/art/ArtProfileClassRuleBuilder.java
index 6f02da7..eaeab93 100644
--- a/src/main/java/com/android/tools/r8/profile/art/ArtProfileClassRuleBuilder.java
+++ b/src/main/java/com/android/tools/r8/profile/art/ArtProfileClassRuleBuilder.java
@@ -4,10 +4,11 @@
 
 package com.android.tools.r8.profile.art;
 
+import com.android.tools.r8.Keep;
 import com.android.tools.r8.references.ClassReference;
 
 /** API for defining a class rule for an ART profile. */
-// TODO(b/237043695): @Keep this when adding a public API for passing ART profiles to the compiler.
+@Keep
 public interface ArtProfileClassRuleBuilder {
 
   ArtProfileClassRuleBuilder setClassReference(ClassReference classReference);
diff --git a/src/main/java/com/android/tools/r8/profile/art/ArtProfileCollection.java b/src/main/java/com/android/tools/r8/profile/art/ArtProfileCollection.java
index 1d7c009..16b2d44 100644
--- a/src/main/java/com/android/tools/r8/profile/art/ArtProfileCollection.java
+++ b/src/main/java/com/android/tools/r8/profile/art/ArtProfileCollection.java
@@ -18,17 +18,19 @@
 
   public static ArtProfileCollection createInitialArtProfileCollection(InternalOptions options) {
     ArtProfileOptions artProfileOptions = options.getArtProfileOptions();
-    Collection<ArtProfileInput> artProfileInputs = artProfileOptions.getArtProfileInputs();
-    if (artProfileInputs.isEmpty()) {
+    Collection<ArtProfileForRewriting> artProfilesForRewriting =
+        artProfileOptions.getArtProfilesForRewriting();
+    if (artProfilesForRewriting.isEmpty()) {
       return empty();
     }
     if (artProfileOptions.isPassthrough()) {
       return passthrough();
     }
-    List<ArtProfile> artProfiles = new ArrayList<>(artProfileInputs.size());
-    for (ArtProfileInput input : options.getArtProfileOptions().getArtProfileInputs()) {
+    List<ArtProfile> artProfiles = new ArrayList<>(artProfilesForRewriting.size());
+    for (ArtProfileForRewriting input :
+        options.getArtProfileOptions().getArtProfilesForRewriting()) {
       ArtProfile.Builder artProfileBuilder = ArtProfile.builder(options.dexItemFactory());
-      input.getArtProfile(artProfileBuilder);
+      input.getArtProfileProvider().getArtProfile(artProfileBuilder);
       artProfiles.add(artProfileBuilder.build());
     }
     return new NonEmptyArtProfileCollection(artProfiles);
diff --git a/src/main/java/com/android/tools/r8/profile/art/ResidualArtProfileConsumer.java b/src/main/java/com/android/tools/r8/profile/art/ArtProfileConsumer.java
similarity index 65%
rename from src/main/java/com/android/tools/r8/profile/art/ResidualArtProfileConsumer.java
rename to src/main/java/com/android/tools/r8/profile/art/ArtProfileConsumer.java
index fc8183e..6cc123d 100644
--- a/src/main/java/com/android/tools/r8/profile/art/ResidualArtProfileConsumer.java
+++ b/src/main/java/com/android/tools/r8/profile/art/ArtProfileConsumer.java
@@ -5,19 +5,20 @@
 package com.android.tools.r8.profile.art;
 
 import com.android.tools.r8.DiagnosticsHandler;
+import com.android.tools.r8.Keep;
 
 /**
  * API for consuming an ART profile provided by the compiler, which has been rewritten to match the
  * residual, optimized app.
  */
-// TODO(b/237043695): @Keep this when adding a public API for passing ART profiles to the compiler.
-public interface ResidualArtProfileConsumer {
+@Keep
+public interface ArtProfileConsumer {
 
   /**
-   * Returns an {@link ResidualArtProfileRuleConsumer} that will receive the rules of the residual
-   * ART profile. If this returns <code>null</code> no rules will be emitted.
+   * Returns an {@link ArtProfileRuleConsumer} that will receive the rules of the residual ART
+   * profile. If this returns <code>null</code> no rules will be emitted.
    */
-  default ResidualArtProfileRuleConsumer getRuleConsumer() {
+  default ArtProfileRuleConsumer getRuleConsumer() {
     return null;
   }
 
diff --git a/src/main/java/com/android/tools/r8/profile/art/ArtProfileForRewriting.java b/src/main/java/com/android/tools/r8/profile/art/ArtProfileForRewriting.java
new file mode 100644
index 0000000..7065f86
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/profile/art/ArtProfileForRewriting.java
@@ -0,0 +1,31 @@
+// 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.profile.art;
+
+/** Internal pair of an {@link ArtProfileProvider} and {@link ArtProfileConsumer}. */
+public class ArtProfileForRewriting {
+
+  private final ArtProfileProvider artProfileProvider;
+  private final ArtProfileConsumer residualArtProfileConsumer;
+
+  public ArtProfileForRewriting(
+      ArtProfileProvider artProfileProvider, ArtProfileConsumer residualArtProfileConsumer) {
+    this.artProfileProvider = artProfileProvider;
+    this.residualArtProfileConsumer = residualArtProfileConsumer;
+  }
+
+  /** Specifies a provider that performs callbacks to a given {@link ArtProfileBuilder}. */
+  public ArtProfileProvider getArtProfileProvider() {
+    return artProfileProvider;
+  }
+
+  /**
+   * Specifies a consumer that should receive the ART profile after it has been rewritten to match
+   * the residual, optimized application.
+   */
+  public ArtProfileConsumer getResidualArtProfileConsumer() {
+    return residualArtProfileConsumer;
+  }
+}
diff --git a/src/main/java/com/android/tools/r8/profile/art/ArtProfileInput.java b/src/main/java/com/android/tools/r8/profile/art/ArtProfileInput.java
deleted file mode 100644
index 74d0685..0000000
--- a/src/main/java/com/android/tools/r8/profile/art/ArtProfileInput.java
+++ /dev/null
@@ -1,24 +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.profile.art;
-
-/**
- * Top-level API for supplying an ART profile to the compiler and retrieving the ART profile after
- * the profile has been rewritten to match the residual, optimized application.
- */
-// TODO(b/237043695): @Keep this when adding a public API for passing ART profiles to the compiler.
-public interface ArtProfileInput {
-
-  /**
-   * Specifies a consumer that should receive the ART profile after it has been rewritten to match
-   * the residual, optimized application.
-   */
-  // TODO(b/237043695): If this ends up in the public API, maybe rename this method to
-  //  getResidualArtProfileConsumer() and ResidualArtProfileConsumer to ArtProfileConsumer.
-  ResidualArtProfileConsumer getArtProfileConsumer();
-
-  /** Provides the ART profile by performing callbacks to the given {@param profileBuilder}. */
-  void getArtProfile(ArtProfileBuilder profileBuilder);
-}
diff --git a/src/main/java/com/android/tools/r8/profile/art/ArtProfileMethodRule.java b/src/main/java/com/android/tools/r8/profile/art/ArtProfileMethodRule.java
index 2a1f840..57e0639 100644
--- a/src/main/java/com/android/tools/r8/profile/art/ArtProfileMethodRule.java
+++ b/src/main/java/com/android/tools/r8/profile/art/ArtProfileMethodRule.java
@@ -122,11 +122,11 @@
     @Override
     public Builder setMethodRuleInfo(
         Consumer<ArtProfileMethodRuleInfoBuilder> methodRuleInfoBuilderConsumer) {
-      internalSetMethodRuleInfo(methodRuleInfoBuilderConsumer);
-      return this;
+      methodRuleInfoBuilder.clear();
+      return acceptMethodRuleInfoBuilder(methodRuleInfoBuilderConsumer);
     }
 
-    public Builder internalSetMethodRuleInfo(
+    public Builder acceptMethodRuleInfoBuilder(
         Consumer<? super ArtProfileMethodRuleInfoImpl.Builder> methodRuleInfoBuilderConsumer) {
       methodRuleInfoBuilderConsumer.accept(methodRuleInfoBuilder);
       return this;
diff --git a/src/main/java/com/android/tools/r8/profile/art/ArtProfileMethodRuleBuilder.java b/src/main/java/com/android/tools/r8/profile/art/ArtProfileMethodRuleBuilder.java
index 99c7888..4bae3b3 100644
--- a/src/main/java/com/android/tools/r8/profile/art/ArtProfileMethodRuleBuilder.java
+++ b/src/main/java/com/android/tools/r8/profile/art/ArtProfileMethodRuleBuilder.java
@@ -4,11 +4,12 @@
 
 package com.android.tools.r8.profile.art;
 
+import com.android.tools.r8.Keep;
 import com.android.tools.r8.references.MethodReference;
 import java.util.function.Consumer;
 
 /** API for defining a method rule for an ART profile. */
-// TODO(b/237043695): @Keep this when adding a public API for passing ART profiles to the compiler.
+@Keep
 public interface ArtProfileMethodRuleBuilder {
 
   ArtProfileMethodRuleBuilder setMethodReference(MethodReference methodReference);
diff --git a/src/main/java/com/android/tools/r8/profile/art/ArtProfileMethodRuleInfoBuilder.java b/src/main/java/com/android/tools/r8/profile/art/ArtProfileMethodRuleInfoBuilder.java
index a3a4041..11f8b42 100644
--- a/src/main/java/com/android/tools/r8/profile/art/ArtProfileMethodRuleInfoBuilder.java
+++ b/src/main/java/com/android/tools/r8/profile/art/ArtProfileMethodRuleInfoBuilder.java
@@ -4,8 +4,10 @@
 
 package com.android.tools.r8.profile.art;
 
+import com.android.tools.r8.Keep;
+
 /** API for providing metadata related to a method rule for an ART profile. */
-// TODO(b/237043695): @Keep this when adding a public API for passing ART profiles to the compiler.
+@Keep
 public interface ArtProfileMethodRuleInfoBuilder {
 
   ArtProfileMethodRuleInfoBuilder setIsHot(boolean isHot);
diff --git a/src/main/java/com/android/tools/r8/profile/art/ArtProfileMethodRuleInfoImpl.java b/src/main/java/com/android/tools/r8/profile/art/ArtProfileMethodRuleInfoImpl.java
index 7bf5d15..046a20e 100644
--- a/src/main/java/com/android/tools/r8/profile/art/ArtProfileMethodRuleInfoImpl.java
+++ b/src/main/java/com/android/tools/r8/profile/art/ArtProfileMethodRuleInfoImpl.java
@@ -77,6 +77,11 @@
 
     private int flags;
 
+    Builder clear() {
+      flags = 0;
+      return this;
+    }
+
     public Builder merge(ArtProfileMethodRuleInfo methodRuleInfo) {
       if (methodRuleInfo.isHot()) {
         setIsHot();
diff --git a/src/main/java/com/android/tools/r8/profile/art/ArtProfileOptions.java b/src/main/java/com/android/tools/r8/profile/art/ArtProfileOptions.java
index accab43..231a2d6 100644
--- a/src/main/java/com/android/tools/r8/profile/art/ArtProfileOptions.java
+++ b/src/main/java/com/android/tools/r8/profile/art/ArtProfileOptions.java
@@ -9,17 +9,17 @@
 
 public class ArtProfileOptions {
 
-  private Collection<ArtProfileInput> inputs = Collections.emptyList();
+  private Collection<ArtProfileForRewriting> artProfilesForRewriting = Collections.emptyList();
   private boolean passthrough;
 
   public ArtProfileOptions() {}
 
-  public Collection<ArtProfileInput> getArtProfileInputs() {
-    return inputs;
+  public Collection<ArtProfileForRewriting> getArtProfilesForRewriting() {
+    return artProfilesForRewriting;
   }
 
-  public ArtProfileOptions setArtProfileInputs(Collection<ArtProfileInput> inputs) {
-    this.inputs = inputs;
+  public ArtProfileOptions setArtProfilesForRewriting(Collection<ArtProfileForRewriting> inputs) {
+    this.artProfilesForRewriting = inputs;
     return this;
   }
 
diff --git a/src/main/java/com/android/tools/r8/profile/art/ArtProfileProvider.java b/src/main/java/com/android/tools/r8/profile/art/ArtProfileProvider.java
new file mode 100644
index 0000000..87450e5
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/profile/art/ArtProfileProvider.java
@@ -0,0 +1,15 @@
+// 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.profile.art;
+
+import com.android.tools.r8.Keep;
+import com.android.tools.r8.Resource;
+
+/** API for providing an ART profile to the compiler. */
+@Keep
+public interface ArtProfileProvider extends Resource {
+
+  void getArtProfile(ArtProfileBuilder profileBuilder);
+}
diff --git a/src/main/java/com/android/tools/r8/profile/art/ResidualArtProfileRuleConsumer.java b/src/main/java/com/android/tools/r8/profile/art/ArtProfileRuleConsumer.java
similarity index 86%
rename from src/main/java/com/android/tools/r8/profile/art/ResidualArtProfileRuleConsumer.java
rename to src/main/java/com/android/tools/r8/profile/art/ArtProfileRuleConsumer.java
index ae1e950..beab144 100644
--- a/src/main/java/com/android/tools/r8/profile/art/ResidualArtProfileRuleConsumer.java
+++ b/src/main/java/com/android/tools/r8/profile/art/ArtProfileRuleConsumer.java
@@ -4,6 +4,7 @@
 
 package com.android.tools.r8.profile.art;
 
+import com.android.tools.r8.Keep;
 import com.android.tools.r8.references.ClassReference;
 import com.android.tools.r8.references.MethodReference;
 
@@ -12,8 +13,8 @@
  * #acceptClassRule} and {@link #acceptMethodRule} for each class and method rule (respectively) in
  * the profile.
  */
-// TODO(b/237043695): @Keep this when adding a public API for passing ART profiles to the compiler.
-public interface ResidualArtProfileRuleConsumer {
+@Keep
+public interface ArtProfileRuleConsumer {
 
   /** Provides information about a specific class rule to the consumer. */
   void acceptClassRule(ClassReference classReference, ArtProfileClassRuleInfo classRuleInfo);
diff --git a/src/main/java/com/android/tools/r8/profile/art/EmptyArtProfileCollection.java b/src/main/java/com/android/tools/r8/profile/art/EmptyArtProfileCollection.java
index c3b420c..f0313ef 100644
--- a/src/main/java/com/android/tools/r8/profile/art/EmptyArtProfileCollection.java
+++ b/src/main/java/com/android/tools/r8/profile/art/EmptyArtProfileCollection.java
@@ -32,7 +32,7 @@
 
   @Override
   public void supplyConsumers(AppView<?> appView) {
-    assert appView.options().getArtProfileOptions().getArtProfileInputs().isEmpty();
+    assert appView.options().getArtProfileOptions().getArtProfilesForRewriting().isEmpty();
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/profile/art/NonEmptyArtProfileCollection.java b/src/main/java/com/android/tools/r8/profile/art/NonEmptyArtProfileCollection.java
index 56c9683..e3cbaf7 100644
--- a/src/main/java/com/android/tools/r8/profile/art/NonEmptyArtProfileCollection.java
+++ b/src/main/java/com/android/tools/r8/profile/art/NonEmptyArtProfileCollection.java
@@ -42,13 +42,14 @@
             ? this
             : rewrittenWithLens(appView.getNamingLens(), appView.dexItemFactory());
     InternalOptions options = appView.options();
-    Collection<ArtProfileInput> inputs = options.getArtProfileOptions().getArtProfileInputs();
+    Collection<ArtProfileForRewriting> inputs =
+        options.getArtProfileOptions().getArtProfilesForRewriting();
     assert !inputs.isEmpty();
     assert collection.artProfiles.size() == inputs.size();
-    Iterator<ArtProfileInput> inputIterator = inputs.iterator();
+    Iterator<ArtProfileForRewriting> inputIterator = inputs.iterator();
     for (ArtProfile artProfile : collection.artProfiles) {
-      ArtProfileInput input = inputIterator.next();
-      artProfile.supplyConsumer(input.getArtProfileConsumer(), options.reporter);
+      ArtProfileForRewriting input = inputIterator.next();
+      artProfile.supplyConsumer(input.getResidualArtProfileConsumer(), options.reporter);
     }
   }
 
diff --git a/src/main/java/com/android/tools/r8/profile/art/PassthroughArtProfileCollection.java b/src/main/java/com/android/tools/r8/profile/art/PassthroughArtProfileCollection.java
index 0ca22c0..0b7e0ac 100644
--- a/src/main/java/com/android/tools/r8/profile/art/PassthroughArtProfileCollection.java
+++ b/src/main/java/com/android/tools/r8/profile/art/PassthroughArtProfileCollection.java
@@ -36,16 +36,18 @@
 
   @Override
   public void supplyConsumers(AppView<?> appView) {
-    for (ArtProfileInput artProfileInput :
-        appView.options().getArtProfileOptions().getArtProfileInputs()) {
-      ResidualArtProfileConsumer artProfileConsumer = artProfileInput.getArtProfileConsumer();
+    for (ArtProfileForRewriting artProfileForRewriting :
+        appView.options().getArtProfileOptions().getArtProfilesForRewriting()) {
+      ArtProfileConsumer artProfileConsumer =
+          artProfileForRewriting.getResidualArtProfileConsumer();
       if (artProfileConsumer == null) {
         continue;
       }
 
-      ResidualArtProfileRuleConsumer ruleConsumer = artProfileConsumer.getRuleConsumer();
+      ArtProfileRuleConsumer ruleConsumer = artProfileConsumer.getRuleConsumer();
       if (ruleConsumer != null) {
-        artProfileInput.getArtProfile(
+        ArtProfileProvider artProfileProvider = artProfileForRewriting.getArtProfileProvider();
+        artProfileProvider.getArtProfile(
             new ArtProfileBuilder() {
 
               @Override