| // Copyright (c) 2019, 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; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| /** |
| * Immutable structure for specifying input and output of a feature split. |
| * |
| * <p>A {@link FeatureSplit} can be added to a {@link R8Command} to enable the building of dynamic |
| * apps. |
| * |
| * <p>To build a {@link FeatureSplit} use the {@link FeatureSplit.Builder} class, available through |
| * the {@link R8Command.Builder}. For example: |
| * |
| * <pre> |
| * R8Command command = R8Command.builder() |
| * .addProgramFiles(path1, path2) |
| * .setMode(CompilationMode.RELEASE) |
| * .setProgramConsumer(baseConsumer) |
| * .addFeatureSplit(builder -> builder |
| * .addProgramResourceProvider(programResourceProvider) |
| * .setProgramConsumer(featureConsumer) |
| * .build()) |
| * .build(); |
| * </pre> |
| */ |
| @Keep |
| public class FeatureSplit { |
| |
| public static final FeatureSplit BASE = |
| new FeatureSplit(null, null) { |
| @Override |
| public boolean isBase() { |
| return true; |
| } |
| }; |
| |
| private final ProgramConsumer programConsumer; |
| private final List<ProgramResourceProvider> programResourceProviders; |
| |
| private FeatureSplit( |
| ProgramConsumer programConsumer, List<ProgramResourceProvider> programResourceProviders) { |
| this.programConsumer = programConsumer; |
| this.programResourceProviders = programResourceProviders; |
| } |
| |
| public boolean isBase() { |
| return false; |
| } |
| |
| public List<ProgramResourceProvider> getProgramResourceProviders() { |
| return programResourceProviders; |
| } |
| |
| public ProgramConsumer getProgramConsumer() { |
| return programConsumer; |
| } |
| |
| static Builder builder(DiagnosticsHandler handler) { |
| return new Builder(handler); |
| } |
| |
| /** |
| * Builder for constructing a FeatureSplit. |
| * |
| * <p>A builder is obtained by calling addFeatureSplit on a {@link R8Command.Builder}. |
| */ |
| @Keep |
| public static class Builder { |
| private ProgramConsumer programConsumer; |
| private final List<ProgramResourceProvider> programResourceProviders = new ArrayList<>(); |
| private final DiagnosticsHandler handler; |
| |
| private Builder(DiagnosticsHandler handler) { |
| this.handler = handler; |
| } |
| |
| /** |
| * Set the program consumer. |
| * |
| * <p>Setting the program consumer will override any previous set consumer. This consumer is |
| * specific to the feature, i.e., it will only get output from the |
| * |
| * @param programConsumer Program consumer to set as current. |
| */ |
| public Builder setProgramConsumer(ProgramConsumer programConsumer) { |
| this.programConsumer = programConsumer; |
| return this; |
| } |
| |
| /** |
| * Add a resource provider for program resources. |
| * |
| * @param programResourceProvider A provider of program resources. |
| */ |
| public Builder addProgramResourceProvider(ProgramResourceProvider programResourceProvider) { |
| this.programResourceProviders.add(programResourceProvider); |
| return this; |
| } |
| |
| /** Build and return the {@link FeatureSplit} */ |
| public FeatureSplit build() { |
| return new FeatureSplit(programConsumer, programResourceProviders); |
| } |
| } |
| } |