Change startup profile in InternalOptions to a StringResource

Change-Id: I7b3de52609582e974ee59e71bc7a9d5b23eedee5
diff --git a/src/main/java/com/android/tools/r8/R8Command.java b/src/main/java/com/android/tools/r8/R8Command.java
index 7498045..9818440 100644
--- a/src/main/java/com/android/tools/r8/R8Command.java
+++ b/src/main/java/com/android/tools/r8/R8Command.java
@@ -10,7 +10,6 @@
 import com.android.tools.r8.dump.DumpOptions;
 import com.android.tools.r8.errors.DexFileOverflowDiagnostic;
 import com.android.tools.r8.experimental.graphinfo.GraphConsumer;
-import com.android.tools.r8.experimental.startup.StartupConfiguration;
 import com.android.tools.r8.features.FeatureSplitConfiguration;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.inspector.Inspector;
@@ -975,11 +974,6 @@
 
     internal.featureSplitConfiguration = featureSplitConfiguration;
 
-    internal
-        .getStartupOptions()
-        .setStartupConfiguration(
-            StartupConfiguration.createStartupConfiguration(getDexItemFactory(), getReporter()));
-
     internal.syntheticProguardRulesConsumer = syntheticProguardRulesConsumer;
 
     internal.outputInspections = InspectorImpl.wrapInspections(getOutputInspections());
diff --git a/src/main/java/com/android/tools/r8/dex/VirtualFile.java b/src/main/java/com/android/tools/r8/dex/VirtualFile.java
index 785bfd2..e9330aa 100644
--- a/src/main/java/com/android/tools/r8/dex/VirtualFile.java
+++ b/src/main/java/com/android/tools/r8/dex/VirtualFile.java
@@ -1396,7 +1396,7 @@
         return;
       }
 
-      assert options.getStartupOptions().hasStartupConfiguration();
+      assert options.getStartupOptions().hasStartupProfile();
 
       // In practice, all startup classes should fit in a single dex file, so optimistically try to
       // commit the startup classes using a single transaction.
diff --git a/src/main/java/com/android/tools/r8/experimental/startup/StartupClass.java b/src/main/java/com/android/tools/r8/experimental/startup/StartupClass.java
index 7ae4d30..b6c6311 100644
--- a/src/main/java/com/android/tools/r8/experimental/startup/StartupClass.java
+++ b/src/main/java/com/android/tools/r8/experimental/startup/StartupClass.java
@@ -56,6 +56,17 @@
     return this;
   }
 
+  @Override
+  public void serializeToString(
+      StringBuilder builder,
+      Function<C, String> classSerializer,
+      Function<M, String> methodSerializer) {
+    if (isSynthetic()) {
+      builder.append('S');
+    }
+    builder.append(classSerializer.apply(getReference()));
+  }
+
   public static class Builder<C, M> extends StartupItem.Builder<C, M, Builder<C, M>> {
 
     @Override
diff --git a/src/main/java/com/android/tools/r8/experimental/startup/StartupConfiguration.java b/src/main/java/com/android/tools/r8/experimental/startup/StartupConfiguration.java
deleted file mode 100644
index 2f1a23d..0000000
--- a/src/main/java/com/android/tools/r8/experimental/startup/StartupConfiguration.java
+++ /dev/null
@@ -1,125 +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.experimental.startup;
-
-import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexMethod;
-import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.utils.ExceptionDiagnostic;
-import com.android.tools.r8.utils.FileUtils;
-import com.android.tools.r8.utils.Reporter;
-import com.android.tools.r8.utils.StringDiagnostic;
-import com.google.common.collect.ImmutableList;
-import java.io.IOException;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.function.Consumer;
-
-public class StartupConfiguration {
-
-  private final List<StartupItem<DexType, DexMethod, ?>> startupItems;
-
-  public StartupConfiguration(List<StartupItem<DexType, DexMethod, ?>> startupItems) {
-    this.startupItems = startupItems;
-  }
-
-  public static Builder builder() {
-    return new Builder();
-  }
-
-  /**
-   * Parses the supplied startup configuration, if any. The startup configuration is a list of class
-   * and method descriptors.
-   *
-   * <p>Example:
-   *
-   * <pre>
-   * Landroidx/compose/runtime/ComposerImpl;->updateValue(Ljava/lang/Object;)V
-   * Landroidx/compose/runtime/ComposerImpl;->updatedNodeCount(I)I
-   * Landroidx/compose/runtime/ComposerImpl;->validateNodeExpected()V
-   * Landroidx/compose/runtime/CompositionImpl;->applyChanges()V
-   * Landroidx/compose/runtime/ComposerKt;->findLocation(Ljava/util/List;I)I
-   * Landroidx/compose/runtime/ComposerImpl;
-   * </pre>
-   */
-  public static StartupConfiguration createStartupConfiguration(
-      DexItemFactory dexItemFactory, Reporter reporter) {
-    String propertyValue = System.getProperty("com.android.tools.r8.startup.config");
-    return propertyValue != null
-        ? createStartupConfigurationFromFile(dexItemFactory, reporter, Paths.get(propertyValue))
-        : null;
-  }
-
-  public static StartupConfiguration createStartupConfigurationFromFile(
-      DexItemFactory dexItemFactory, Reporter reporter, Path path) {
-    reporter.warning("Use of startupconfig is experimental");
-
-    List<String> startupDescriptors;
-    try {
-      startupDescriptors = FileUtils.readAllLines(path);
-    } catch (IOException e) {
-      throw reporter.fatalError(new ExceptionDiagnostic(e));
-    }
-
-    if (startupDescriptors.isEmpty()) {
-      return null;
-    }
-
-    return createStartupConfigurationFromLines(dexItemFactory, reporter, startupDescriptors);
-  }
-
-  public static StartupConfiguration createStartupConfigurationFromLines(
-      DexItemFactory dexItemFactory, Reporter reporter, List<String> startupDescriptors) {
-    List<StartupItem<DexType, DexMethod, ?>> startupItems = new ArrayList<>();
-    StartupConfigurationParser.createDexParser(dexItemFactory)
-        .parseLines(
-            startupDescriptors,
-            startupItems::add,
-            startupItems::add,
-            error ->
-                reporter.warning(
-                    new StringDiagnostic(
-                        "Invalid descriptor for startup class or method: " + error)));
-    return new StartupConfiguration(startupItems);
-  }
-
-  public boolean hasStartupItems() {
-    return !startupItems.isEmpty();
-  }
-
-  public List<StartupItem<DexType, DexMethod, ?>> getStartupItems() {
-    return startupItems;
-  }
-
-  public static class Builder {
-
-    private final ImmutableList.Builder<StartupItem<DexType, DexMethod, ?>> startupItemsBuilder =
-        ImmutableList.builder();
-
-    public Builder addStartupItem(StartupItem<DexType, DexMethod, ?> startupItem) {
-      this.startupItemsBuilder.add(startupItem);
-      return this;
-    }
-
-    public Builder addStartupClass(StartupClass<DexType, DexMethod> startupClass) {
-      return addStartupItem(startupClass);
-    }
-
-    public Builder addStartupMethod(StartupMethod<DexType, DexMethod> startupMethod) {
-      return addStartupItem(startupMethod);
-    }
-
-    public Builder apply(Consumer<Builder> consumer) {
-      consumer.accept(this);
-      return this;
-    }
-
-    public StartupConfiguration build() {
-      return new StartupConfiguration(startupItemsBuilder.build());
-    }
-  }
-}
diff --git a/src/main/java/com/android/tools/r8/experimental/startup/StartupItem.java b/src/main/java/com/android/tools/r8/experimental/startup/StartupItem.java
index 74e69e2..e2ea09b 100644
--- a/src/main/java/com/android/tools/r8/experimental/startup/StartupItem.java
+++ b/src/main/java/com/android/tools/r8/experimental/startup/StartupItem.java
@@ -64,6 +64,11 @@
     return (flags & FLAG_SYNTHETIC) != 0;
   }
 
+  public abstract void serializeToString(
+      StringBuilder builder,
+      Function<C, String> classSerializer,
+      Function<M, String> methodSerializer);
+
   @Override
   public boolean equals(Object obj) {
     if (this == obj) {
diff --git a/src/main/java/com/android/tools/r8/experimental/startup/StartupMethod.java b/src/main/java/com/android/tools/r8/experimental/startup/StartupMethod.java
index 871e179..00ddca9 100644
--- a/src/main/java/com/android/tools/r8/experimental/startup/StartupMethod.java
+++ b/src/main/java/com/android/tools/r8/experimental/startup/StartupMethod.java
@@ -43,6 +43,17 @@
     return this;
   }
 
+  @Override
+  public void serializeToString(
+      StringBuilder builder,
+      Function<C, String> classSerializer,
+      Function<M, String> methodSerializer) {
+    if (isSynthetic()) {
+      builder.append('S');
+    }
+    builder.append(methodSerializer.apply(getReference()));
+  }
+
   public static class Builder<C, M> extends StartupItem.Builder<C, M, Builder<C, M>> {
 
     @Override
diff --git a/src/main/java/com/android/tools/r8/experimental/startup/StartupOptions.java b/src/main/java/com/android/tools/r8/experimental/startup/StartupOptions.java
index 05fd544..c7f4a5c 100644
--- a/src/main/java/com/android/tools/r8/experimental/startup/StartupOptions.java
+++ b/src/main/java/com/android/tools/r8/experimental/startup/StartupOptions.java
@@ -6,6 +6,10 @@
 
 import static com.android.tools.r8.utils.SystemPropertyUtils.parseSystemPropertyForDevelopmentOrDefault;
 
+import com.android.tools.r8.StringResource;
+import com.android.tools.r8.utils.SystemPropertyUtils;
+import java.nio.file.Paths;
+
 public class StartupOptions {
 
   /**
@@ -44,7 +48,11 @@
   private boolean enableStartupLayoutOptimizations =
       parseSystemPropertyForDevelopmentOrDefault("com.android.tools.r8.startup.layout", true);
 
-  private StartupConfiguration startupConfiguration;
+  private StringResource startupProfile =
+      SystemPropertyUtils.applySystemProperty(
+          "com.android.tools.r8.startup.profile",
+          propertyValue -> StringResource.fromFile(Paths.get(propertyValue)),
+          () -> null);
 
   public boolean isMinimalStartupDexEnabled() {
     return enableMinimalStartupDex;
@@ -83,16 +91,16 @@
     return this;
   }
 
-  public boolean hasStartupConfiguration() {
-    return startupConfiguration != null;
+  public boolean hasStartupProfile() {
+    return startupProfile != null;
   }
 
-  public StartupConfiguration getStartupConfiguration() {
-    return startupConfiguration;
+  public StringResource getStartupProfile() {
+    return startupProfile;
   }
 
-  public StartupOptions setStartupConfiguration(StartupConfiguration startupConfiguration) {
-    this.startupConfiguration = startupConfiguration;
+  public StartupOptions setStartupProfile(StringResource startupProfile) {
+    this.startupProfile = startupProfile;
     return this;
   }
 }
diff --git a/src/main/java/com/android/tools/r8/experimental/startup/StartupOrder.java b/src/main/java/com/android/tools/r8/experimental/startup/StartupOrder.java
index b1803eb..9f9bf65 100644
--- a/src/main/java/com/android/tools/r8/experimental/startup/StartupOrder.java
+++ b/src/main/java/com/android/tools/r8/experimental/startup/StartupOrder.java
@@ -19,15 +19,11 @@
   StartupOrder() {}
 
   public static StartupOrder createInitialStartupOrder(InternalOptions options) {
-    if (!options.getStartupOptions().hasStartupConfiguration()) {
+    StartupProfile startupProfile = StartupProfile.parseStartupProfile(options);
+    if (startupProfile == null || startupProfile.getStartupItems().isEmpty()) {
       return empty();
     }
-    StartupConfiguration startupConfiguration =
-        options.getStartupOptions().getStartupConfiguration();
-    if (!startupConfiguration.hasStartupItems()) {
-      return empty();
-    }
-    return new NonEmptyStartupOrder(new LinkedHashSet<>(startupConfiguration.getStartupItems()));
+    return new NonEmptyStartupOrder(new LinkedHashSet<>(startupProfile.getStartupItems()));
   }
 
   public static StartupOrder empty() {
diff --git a/src/main/java/com/android/tools/r8/experimental/startup/StartupProfile.java b/src/main/java/com/android/tools/r8/experimental/startup/StartupProfile.java
new file mode 100644
index 0000000..821b86c
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/experimental/startup/StartupProfile.java
@@ -0,0 +1,114 @@
+// 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.experimental.startup;
+
+import com.android.tools.r8.ResourceException;
+import com.android.tools.r8.StringResource;
+import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.utils.InternalOptions;
+import com.android.tools.r8.utils.StringDiagnostic;
+import com.android.tools.r8.utils.StringUtils;
+import com.google.common.collect.ImmutableList;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Consumer;
+
+public class StartupProfile {
+
+  private final List<StartupItem<DexType, DexMethod, ?>> startupItems;
+
+  public StartupProfile(List<StartupItem<DexType, DexMethod, ?>> startupItems) {
+    this.startupItems = startupItems;
+  }
+
+  public static Builder builder() {
+    return new Builder();
+  }
+
+  /**
+   * Parses the supplied startup configuration, if any. The startup configuration is a list of class
+   * and method descriptors.
+   *
+   * <p>Example:
+   *
+   * <pre>
+   * Landroidx/compose/runtime/ComposerImpl;->updateValue(Ljava/lang/Object;)V
+   * Landroidx/compose/runtime/ComposerImpl;->updatedNodeCount(I)I
+   * Landroidx/compose/runtime/ComposerImpl;->validateNodeExpected()V
+   * Landroidx/compose/runtime/CompositionImpl;->applyChanges()V
+   * Landroidx/compose/runtime/ComposerKt;->findLocation(Ljava/util/List;I)I
+   * Landroidx/compose/runtime/ComposerImpl;
+   * </pre>
+   */
+  public static StartupProfile parseStartupProfile(InternalOptions options) {
+    if (!options.getStartupOptions().hasStartupProfile()) {
+      return null;
+    }
+    try {
+      StringResource resource = options.getStartupOptions().getStartupProfile();
+      List<String> startupDescriptors = StringUtils.splitLines(resource.getString());
+      return createStartupConfigurationFromLines(options, startupDescriptors);
+    } catch (ResourceException e) {
+      throw new RuntimeException(e);
+    }
+  }
+
+  public static StartupProfile createStartupConfigurationFromLines(
+      InternalOptions options, List<String> startupDescriptors) {
+    List<StartupItem<DexType, DexMethod, ?>> startupItems = new ArrayList<>();
+    StartupConfigurationParser.createDexParser(options.dexItemFactory())
+        .parseLines(
+            startupDescriptors,
+            startupItems::add,
+            startupItems::add,
+            error ->
+                options.reporter.warning(
+                    new StringDiagnostic(
+                        "Invalid descriptor for startup class or method: " + error)));
+    return new StartupProfile(startupItems);
+  }
+
+  public List<StartupItem<DexType, DexMethod, ?>> getStartupItems() {
+    return startupItems;
+  }
+
+  public String serializeToString() {
+    StringBuilder builder = new StringBuilder();
+    for (StartupItem<DexType, DexMethod, ?> startupItem : startupItems) {
+      startupItem.serializeToString(builder, DexType::toSmaliString, DexMethod::toSmaliString);
+      builder.append('\n');
+    }
+    return builder.toString();
+  }
+
+  public static class Builder {
+
+    private final ImmutableList.Builder<StartupItem<DexType, DexMethod, ?>> startupItemsBuilder =
+        ImmutableList.builder();
+
+    public Builder addStartupItem(StartupItem<DexType, DexMethod, ?> startupItem) {
+      this.startupItemsBuilder.add(startupItem);
+      return this;
+    }
+
+    public Builder addStartupClass(StartupClass<DexType, DexMethod> startupClass) {
+      return addStartupItem(startupClass);
+    }
+
+    public Builder addStartupMethod(StartupMethod<DexType, DexMethod> startupMethod) {
+      return addStartupItem(startupMethod);
+    }
+
+    public Builder apply(Consumer<Builder> consumer) {
+      consumer.accept(this);
+      return this;
+    }
+
+    public StartupProfile build() {
+      return new StartupProfile(startupItemsBuilder.build());
+    }
+  }
+}
diff --git a/src/main/java/com/android/tools/r8/utils/SystemPropertyUtils.java b/src/main/java/com/android/tools/r8/utils/SystemPropertyUtils.java
index d8d4a38..a984560 100644
--- a/src/main/java/com/android/tools/r8/utils/SystemPropertyUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/SystemPropertyUtils.java
@@ -7,10 +7,21 @@
 import static com.google.common.base.Predicates.alwaysTrue;
 
 import com.android.tools.r8.Version;
+import java.util.function.Function;
 import java.util.function.Predicate;
+import java.util.function.Supplier;
 
 public class SystemPropertyUtils {
 
+  public static <T> T applySystemProperty(
+      String propertyName, Function<String, T> propertyFoundFn, Supplier<T> propertyNotFoundFn) {
+    if (isSystemPropertySet(propertyName)) {
+      return propertyFoundFn.apply(System.getProperty(propertyName));
+    } else {
+      return propertyNotFoundFn.get();
+    }
+  }
+
   public static String getSystemPropertyForDevelopment(String propertyName) {
     return Version.isDevelopmentVersion() ? System.getProperty(propertyName) : null;
   }
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/HorizontalClassMergingWithStartupClassesTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/HorizontalClassMergingWithStartupClassesTest.java
index 30b9700..dee7541 100644
--- a/src/test/java/com/android/tools/r8/classmerging/horizontal/HorizontalClassMergingWithStartupClassesTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/HorizontalClassMergingWithStartupClassesTest.java
@@ -5,11 +5,13 @@
 package com.android.tools.r8.classmerging.horizontal;
 
 import com.android.tools.r8.NeverInline;
+import com.android.tools.r8.StringResource;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.experimental.startup.StartupClass;
-import com.android.tools.r8.experimental.startup.StartupConfiguration;
+import com.android.tools.r8.experimental.startup.StartupProfile;
 import com.android.tools.r8.graph.DexItemFactory;
+import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.BooleanUtils;
 import com.google.common.collect.ImmutableList;
 import java.util.Collections;
@@ -49,21 +51,22 @@
         .addOptionsModification(
             options -> {
               DexItemFactory dexItemFactory = options.dexItemFactory();
-              options
-                  .getStartupOptions()
-                  .setStartupConfiguration(
-                      StartupConfiguration.builder()
-                          .apply(
-                              builder ->
-                                  getStartupClasses()
-                                      .forEach(
-                                          startupClass ->
-                                              builder.addStartupClass(
-                                                  StartupClass.dexBuilder()
-                                                      .setClassReference(
-                                                          toDexType(startupClass, dexItemFactory))
-                                                      .build())))
-                          .build());
+              StartupProfile startupProfile =
+                  StartupProfile.builder()
+                      .apply(
+                          builder ->
+                              getStartupClasses()
+                                  .forEach(
+                                      startupClass ->
+                                          builder.addStartupClass(
+                                              StartupClass.dexBuilder()
+                                                  .setClassReference(
+                                                      toDexType(startupClass, dexItemFactory))
+                                                  .build())))
+                      .build();
+              StringResource startupProfileResource =
+                  StringResource.fromString(startupProfile.serializeToString(), Origin.unknown());
+              options.getStartupOptions().setStartupProfile(startupProfileResource);
             })
         .addHorizontallyMergedClassesInspector(
             inspector ->
diff --git a/src/test/java/com/android/tools/r8/internal/YouTubeV1719Test.java b/src/test/java/com/android/tools/r8/internal/YouTubeV1719Test.java
index c460799..18921a8 100644
--- a/src/test/java/com/android/tools/r8/internal/YouTubeV1719Test.java
+++ b/src/test/java/com/android/tools/r8/internal/YouTubeV1719Test.java
@@ -27,7 +27,6 @@
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.ThrowableConsumer;
-import com.android.tools.r8.experimental.startup.StartupConfiguration;
 import com.android.tools.r8.tracereferences.TraceReferences;
 import com.android.tools.r8.tracereferences.TraceReferencesCommand;
 import com.android.tools.r8.tracereferences.TraceReferencesKeepRules;
@@ -58,7 +57,7 @@
 
   // By setting this to an actual startup list, YouTube will be build with layout optimizations
   // enabled.
-  private final Path startupList = null;
+  private final StringResource startupProfile = null;
   private final boolean enableMinimalStartupDex = true;
   private final boolean enableStartupBoundaryOptimizations = false;
 
@@ -132,8 +131,8 @@
    * Running this test will dump an R8 build of YouTube in the {@link #dumpDirectory}, where the
    * desugared library keep rules are generated using trace references.
    *
-   * <p>If {@link #startupList} is set to a concrete startup list, YouTube will be build with layout
-   * optimizations enabled.
+   * <p>If {@link #startupProfile} is set to a concrete startup list, YouTube will be build with
+   * layout optimizations enabled.
    */
   @Test
   public void testR8() throws Exception {
@@ -146,12 +145,10 @@
             testBuilder ->
                 testBuilder.addOptionsModification(
                     options -> {
-                      if (startupList != null) {
+                      if (startupProfile != null) {
                         options
                             .getStartupOptions()
-                            .setStartupConfiguration(
-                                StartupConfiguration.createStartupConfigurationFromFile(
-                                    options.dexItemFactory(), options.reporter, startupList))
+                            .setStartupProfile(startupProfile)
                             .setEnableMinimalStartupDex(enableMinimalStartupDex)
                             .setEnableStartupBoundaryOptimizations(
                                 enableStartupBoundaryOptimizations);
diff --git a/src/test/java/com/android/tools/r8/internal/startup/ChromeStartupTest.java b/src/test/java/com/android/tools/r8/internal/startup/ChromeStartupTest.java
index 77f33b2..e75c5ba 100644
--- a/src/test/java/com/android/tools/r8/internal/startup/ChromeStartupTest.java
+++ b/src/test/java/com/android/tools/r8/internal/startup/ChromeStartupTest.java
@@ -13,12 +13,12 @@
 import com.android.tools.r8.ArchiveProgramResourceProvider;
 import com.android.tools.r8.DexIndexedConsumer;
 import com.android.tools.r8.R8FullTestBuilder;
+import com.android.tools.r8.StringResource;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.ThrowableConsumer;
 import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.experimental.startup.StartupConfiguration;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.ZipUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
@@ -234,7 +234,7 @@
       boolean enableStartupBoundaryOptimizations,
       Path outDirectory)
       throws Exception {
-    Path startupList = chromeDirectory.resolve("startup.txt");
+    StringResource startupProfile = StringResource.fromFile(chromeDirectory.resolve("startup.txt"));
     buildR8(
         testBuilder ->
             testBuilder.addOptionsModification(
@@ -243,9 +243,7 @@
                         .getStartupOptions()
                         .setEnableMinimalStartupDex(enableMinimalStartupDex)
                         .setEnableStartupBoundaryOptimizations(enableStartupBoundaryOptimizations)
-                        .setStartupConfiguration(
-                            StartupConfiguration.createStartupConfigurationFromFile(
-                                options.dexItemFactory(), options.reporter, startupList))),
+                        .setStartupProfile(startupProfile)),
         outDirectory);
   }
 
diff --git a/src/test/java/com/android/tools/r8/startup/utils/StartupTestingUtils.java b/src/test/java/com/android/tools/r8/startup/utils/StartupTestingUtils.java
index 04d673c..37b75c2 100644
--- a/src/test/java/com/android/tools/r8/startup/utils/StartupTestingUtils.java
+++ b/src/test/java/com/android/tools/r8/startup/utils/StartupTestingUtils.java
@@ -10,17 +10,19 @@
 import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.D8TestBuilder;
 import com.android.tools.r8.D8TestRunResult;
+import com.android.tools.r8.StringResource;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestCompilerBuilder;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.ThrowableConsumer;
-import com.android.tools.r8.experimental.startup.StartupConfiguration;
 import com.android.tools.r8.experimental.startup.StartupConfigurationParser;
 import com.android.tools.r8.experimental.startup.StartupItem;
+import com.android.tools.r8.experimental.startup.StartupProfile;
 import com.android.tools.r8.experimental.startup.instrumentation.StartupInstrumentationOptions;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.references.ClassReference;
 import com.android.tools.r8.references.MethodReference;
 import com.android.tools.r8.references.TypeReference;
@@ -147,8 +149,8 @@
     testBuilder.addOptionsModification(
         options -> {
           DexItemFactory dexItemFactory = options.dexItemFactory();
-          StartupConfiguration startupConfiguration =
-              StartupConfiguration.builder()
+          StartupProfile startupProfile =
+              StartupProfile.builder()
                   .apply(
                       builder ->
                           startupItems.forEach(
@@ -156,7 +158,9 @@
                                   builder.addStartupItem(
                                       convertStartupItemToDex(startupItem, dexItemFactory))))
                   .build();
-          options.getStartupOptions().setStartupConfiguration(startupConfiguration);
+          StringResource startupProfileResource =
+              StringResource.fromString(startupProfile.serializeToString(), Origin.unknown());
+          options.getStartupOptions().setStartupProfile(startupProfileResource);
         });
   }