blob: 03f99fa24a5ec67f253dfd0c6e9e2dfefe1d57b4 [file] [log] [blame]
// 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 com.android.tools.r8.keepanno.annotations.KeepForApi;
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>
*/
@KeepForApi
public class FeatureSplit {
public static final FeatureSplit BASE =
new FeatureSplit(null, null, null, null) {
@Override
public boolean isBase() {
return true;
}
};
private ProgramConsumer programConsumer;
private final List<ProgramResourceProvider> programResourceProviders;
private final AndroidResourceProvider androidResourceProvider;
private final AndroidResourceConsumer androidResourceConsumer;
private FeatureSplit(
ProgramConsumer programConsumer,
List<ProgramResourceProvider> programResourceProviders,
AndroidResourceProvider androidResourceProvider,
AndroidResourceConsumer androidResourceConsumer) {
this.programConsumer = programConsumer;
this.programResourceProviders = programResourceProviders;
this.androidResourceProvider = androidResourceProvider;
this.androidResourceConsumer = androidResourceConsumer;
}
public boolean isBase() {
return false;
}
void internalSetProgramConsumer(ProgramConsumer consumer) {
this.programConsumer = consumer;
}
public List<ProgramResourceProvider> getProgramResourceProviders() {
return programResourceProviders;
}
public ProgramConsumer getProgramConsumer() {
return programConsumer;
}
static Builder builder(DiagnosticsHandler handler) {
return new Builder(handler);
}
public AndroidResourceProvider getAndroidResourceProvider() {
return androidResourceProvider;
}
public AndroidResourceConsumer getAndroidResourceConsumer() {
return androidResourceConsumer;
}
/**
* Builder for constructing a FeatureSplit.
*
* <p>A builder is obtained by calling addFeatureSplit on a {@link R8Command.Builder}.
*/
@KeepForApi
public static class Builder {
private ProgramConsumer programConsumer;
private final List<ProgramResourceProvider> programResourceProviders = new ArrayList<>();
private AndroidResourceProvider androidResourceProvider;
private AndroidResourceConsumer androidResourceConsumer;
@SuppressWarnings("UnusedVariable")
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;
}
public Builder setAndroidResourceProvider(AndroidResourceProvider androidResourceProvider) {
this.androidResourceProvider = androidResourceProvider;
return this;
}
public Builder setAndroidResourceConsumer(AndroidResourceConsumer androidResourceConsumer) {
this.androidResourceConsumer = androidResourceConsumer;
return this;
}
/** Build and return the {@link FeatureSplit} */
public FeatureSplit build() {
return new FeatureSplit(
programConsumer,
programResourceProviders,
androidResourceProvider,
androidResourceConsumer);
}
}
}