| // 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.startup; |
| |
| import com.android.tools.r8.Keep; |
| import com.android.tools.r8.TextInputStream; |
| import com.android.tools.r8.profile.art.HumanReadableArtProfileParserBuilder; |
| import java.util.function.Consumer; |
| |
| /** Interface for providing a startup profile to the compiler. */ |
| @Keep |
| public interface StartupProfileBuilder { |
| |
| /** API for adding information about a startup class to the compiler. */ |
| StartupProfileBuilder addStartupClass(Consumer<StartupClassBuilder> startupClassBuilderConsumer); |
| |
| /** API for adding information about a startup method to the compiler. */ |
| StartupProfileBuilder addStartupMethod( |
| Consumer<StartupMethodBuilder> startupMethodBuilderConsumer); |
| |
| /** |
| * API for adding information about a synthetic startup method to the compiler. |
| * |
| * <p>When shrinking an app using R8, the names of synthetic classes may differ from the synthetic |
| * names that arise from dexing the app using D8. Therefore, synthetic classes and methods should |
| * not be added to the startup profile using {@link #addStartupClass(Consumer)} and {@link |
| * #addStartupMethod(Consumer)}. |
| * |
| * <p>Instead, synthetic items should be added to the startup profile using this method, which |
| * takes the name of the synthetic context instead of the synthetic name. The addition of the |
| * synthetic context will be interpreted as the presence of any method on any synthetic class that |
| * has been synthesized from the synthetic context. |
| * |
| * <p>Example: Instead of adding "Lcom/example/MainActivity$ExternalSynthetic0;->m()V" as a |
| * (non-synthetic) startup method, a synthetic startup method should be added with synthetic |
| * context "Lcom/example/MainActivity;". |
| * |
| * <p>NOTE: This should only be used when supplying a startup profile that is generated from an |
| * unobfuscated build of the app to R8. |
| */ |
| StartupProfileBuilder addSyntheticStartupMethod( |
| Consumer<SyntheticStartupMethodBuilder> syntheticStartupMethodBuilderConsumer); |
| |
| /** |
| * Adds the rules from the given human-readable ART profile to the startup profile and then closes |
| * the stream. |
| * |
| * @see <a href="https://developer.android.com/topic/performance/baselineprofiles">ART Baseline |
| * Profiles</a> |
| */ |
| StartupProfileBuilder addHumanReadableArtProfile( |
| TextInputStream textInputStream, |
| Consumer<HumanReadableArtProfileParserBuilder> parserBuilderConsumer); |
| } |