blob: 0ffbae5ac609ebebcbc3d402c9c0deb73a303779 [file] [log] [blame]
// Copyright (c) 2017, 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.shaking;
import static com.android.tools.r8.shaking.ProguardKeepAttributes.RUNTIME_VISIBLE_ANNOTATIONS;
import com.android.tools.r8.errors.dontwarn.DontWarnConfiguration;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.naming.DictionaryReader;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.position.Position;
import com.android.tools.r8.position.TextPosition;
import com.android.tools.r8.shaking.ProguardConfigurationParser.IncludeWorkItem;
import com.android.tools.r8.shaking.ProguardConfigurationParser.ProguardConfigurationSourceParser;
import com.android.tools.r8.utils.InternalOptions.PackageObfuscationMode;
import com.android.tools.r8.utils.Reporter;
import com.android.tools.r8.utils.StringUtils;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import com.google.common.collect.Sets;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.function.Consumer;
public class ProguardConfiguration {
public enum ProcessKotlinNullChecks {
DEFAULT,
KEEP,
REMOVE_MESSAGE,
REMOVE;
public boolean isRemoveMessage() {
return this == DEFAULT || this == REMOVE_MESSAGE;
}
public boolean isRemove() {
return this == REMOVE;
}
public ProcessKotlinNullChecks meet(ProcessKotlinNullChecks other) {
assert other != DEFAULT;
return other.ordinal() > ordinal() ? other : this;
}
}
public static class Builder implements ProguardConfigurationParserConsumer {
private final StringBuilder parsedConfiguration = new StringBuilder();
private final List<FilteredClassPath> injars = new ArrayList<>();
private final List<FilteredClassPath> libraryJars = new ArrayList<>();
private final Reporter reporter;
private boolean allowAccessModification;
private boolean ignoreWarnings;
private boolean optimizing = true;
private boolean obfuscating = true;
private boolean shrinking = true;
private boolean printBlastRadius;
private boolean printConfiguration;
private Path printConfigurationFile;
private boolean printUsage;
private Path printUsageFile;
private boolean printMapping;
private Path printMappingFile;
private Path applyMappingFile;
private String renameSourceFileAttribute;
private final List<String> keepAttributePatterns = new ArrayList<>();
private final ProguardClassFilter.Builder keepPackageNamesPatterns =
ProguardClassFilter.builder();
private final ProguardClassFilter.Builder dontWarnPatterns = ProguardClassFilter.builder();
private final ProguardClassFilter.Builder dontNotePatterns = ProguardClassFilter.builder();
protected final Set<ProguardConfigurationRule> rules = Sets.newLinkedHashSet();
private final DexItemFactory dexItemFactory;
private boolean printSeeds;
private Path printSeedsFile;
private Path obfuscationDictionary;
private Path classObfuscationDictionary;
private Path packageObfuscationDictionary;
private boolean keepParameterNames;
private final ProguardClassFilter.Builder adaptClassStrings = ProguardClassFilter.builder();
private final ProguardPathFilter.Builder adaptResourceFilenames =
ProguardPathFilter.builder()
.addPattern(ProguardPathList.builder().addFileName("META-INF/services/*").build());
private final ProguardPathFilter.Builder adaptResourceFileContents =
ProguardPathFilter.builder()
.addPattern(ProguardPathList.builder().addFileName("META-INF/services/*").build());
private final ProguardPathFilter.Builder keepDirectories =
ProguardPathFilter.builder().disable();
private boolean forceProguardCompatibility = false;
private boolean protoShrinking = false;
private int maxRemovedAndroidLogLevel = MaximumRemovedAndroidLogLevelRule.NOT_SET;
private ProcessKotlinNullChecks processKotlinNullChecks = ProcessKotlinNullChecks.DEFAULT;
PackageObfuscationMode packageObfuscationMode = PackageObfuscationMode.DEFAULT;
String packagePrefix = "";
private Builder(DexItemFactory dexItemFactory, Reporter reporter) {
this.dexItemFactory = dexItemFactory;
this.reporter = reporter;
}
public List<FilteredClassPath> getInjars() {
return injars;
}
@Override
public void addBaseDirectory(
Path baseDirectory, ProguardConfigurationSourceParser parser, TextPosition positionStart) {
// Intentionally empty.
}
@Override
public void addIgnoredOption(
String option, ProguardConfigurationSourceParser parser, TextPosition positionStart) {
// Intentionally empty.
}
@Override
public void addInclude(
Path includePath, ProguardConfigurationSourceParser parser, TextPosition positionStart) {
IncludeWorkItem include = new IncludeWorkItem(includePath, positionStart, parser.getOffset());
parser.getPendingIncludes().add(include);
}
@Override
public void addLeadingBOM() {
// Intentionally empty.
}
@Override
public void addParsedConfiguration(ProguardConfigurationSourceParser parser) {
parsedConfiguration.append(
"# The proguard configuration file for the following section is " + parser.getOrigin());
parsedConfiguration.append(System.lineSeparator());
int lastIncludePositionEnd = 0;
for (IncludeWorkItem pendingInclude : parser.getPendingIncludes()) {
int includePositionStart = pendingInclude.includePositionStart.getOffsetAsInt();
parsedConfiguration.append(
parser.getContentInRange(lastIncludePositionEnd, includePositionStart));
lastIncludePositionEnd = pendingInclude.includePositionEnd;
}
parsedConfiguration.append(parser.getContentAfter(lastIncludePositionEnd));
parsedConfiguration.append(System.lineSeparator());
parsedConfiguration.append("# End of content from ");
parsedConfiguration.append(parser.getOrigin());
parsedConfiguration.append(System.lineSeparator());
}
@Override
public void addInjars(
List<FilteredClassPath> injars,
ProguardConfigurationSourceParser parser,
Position position,
TextPosition positionStart) {
this.injars.addAll(injars);
}
@Override
public void addLibraryJars(
List<FilteredClassPath> libraryJars,
ProguardConfigurationSourceParser parser,
Position position,
TextPosition positionStart) {
this.libraryJars.addAll(libraryJars);
}
@Override
public void enableAllowAccessModification(
ProguardConfigurationSourceParser parser, Position position, TextPosition positionStart) {
this.allowAccessModification = true;
}
@Override
public void setIgnoreWarnings(
ProguardConfigurationSourceParser parser, TextPosition positionStart) {
this.ignoreWarnings = true;
}
@Override
public void disableOptimization(ProguardConfigurationSourceParser parser, Position position) {
this.optimizing = false;
}
@Override
public void disableObfuscation(ProguardConfigurationSourceParser parser, Position position) {
this.obfuscating = false;
}
@Override
public void disableRepackaging(ProguardConfigurationSourceParser parser, Position position) {
packageObfuscationMode = PackageObfuscationMode.NONE;
}
@Override
public void disableShrinking(ProguardConfigurationSourceParser parser, Position position) {
this.shrinking = false;
}
public Builder disableOptimization() {
this.optimizing = false;
return this;
}
public Builder disableObfuscation() {
this.obfuscating = false;
return this;
}
boolean isObfuscating() {
return obfuscating;
}
public boolean isOptimizing() {
return optimizing;
}
public boolean isShrinking() {
return shrinking;
}
public Builder disableShrinking() {
shrinking = false;
return this;
}
@Override
public void enablePrintBlastRadius(
ProguardConfigurationSourceParser parser, Position position, TextPosition positionStart) {
this.printBlastRadius = true;
}
@Override
public void enablePrintConfiguration(
Path printConfigurationFile,
ProguardConfigurationSourceParser parser,
Position position,
TextPosition positionStart) {
this.printConfiguration = true;
this.printConfigurationFile = printConfigurationFile;
}
@Override
public void enablePrintUsage(
Path printUsageFile,
ProguardConfigurationSourceParser parser,
Position position,
TextPosition positionStart) {
this.printUsage = true;
this.printUsageFile = printUsageFile;
}
@Override
public void enablePrintMapping(
Path printMappingFile,
ProguardConfigurationSourceParser parser,
Position position,
TextPosition positionStart) {
this.printMapping = true;
this.printMappingFile = printMappingFile;
}
@Override
public void setApplyMappingFile(
Path applyMappingFile,
ProguardConfigurationSourceParser parser,
Position position,
TextPosition positionStart) {
this.applyMappingFile = applyMappingFile;
}
@Override
public void setRenameSourceFileAttribute(
String renameSourceFileAttribute,
ProguardConfigurationSourceParser parser,
Position position,
TextPosition positionStart) {
this.renameSourceFileAttribute = renameSourceFileAttribute;
}
@Override
public void addKeepAttributePatterns(
List<String> keepAttributePatterns,
ProguardConfigurationSourceParser parser,
Position position,
TextPosition positionStart) {
this.keepAttributePatterns.addAll(keepAttributePatterns);
}
@Override
public void addKeepKotlinMetadata(
ProguardConfigurationSourceParser parser, Position position, TextPosition positionStart) {
Origin origin = parser.getOrigin();
String source = "-keepkotlinmetadata";
ProguardKeepRule keepKotlinMetadata =
ProguardKeepRuleUtils.keepClassAndMembersRule(
origin, positionStart, dexItemFactory.kotlinMetadataType, source);
// Mark the rules as used to ensure we do not report any information messages if the class
// is not present.
keepKotlinMetadata.markAsUsed();
addRule(keepKotlinMetadata, parser, positionStart);
addKeepAttributePatterns(
Collections.singletonList(RUNTIME_VISIBLE_ANNOTATIONS), parser, position, positionStart);
}
@Override
public void addProcessKotlinNullChecks(
ProcessKotlinNullChecks value,
ProguardConfigurationSourceParser parser,
Position position,
TextPosition positionStart) {
processKotlinNullChecks = processKotlinNullChecks.meet(value);
}
public Builder addKeepAttributePatterns(List<String> keepAttributePatterns) {
this.keepAttributePatterns.addAll(keepAttributePatterns);
return this;
}
@Override
public void addRule(
ProguardConfigurationRule rule,
ProguardConfigurationSourceParser parser,
TextPosition positionStart) {
this.rules.add(rule);
}
@Override
public void addKeepPackageNamesPattern(
ProguardClassNameList pattern,
ProguardConfigurationSourceParser parser,
TextPosition positionStart) {
keepPackageNamesPatterns.addPattern(pattern);
}
@Override
public void joinMaxRemovedAndroidLogLevel(
int maxRemovedAndroidLogLevel,
ProguardConfigurationSourceParser parser,
TextPosition positionStart) {
assert maxRemovedAndroidLogLevel >= MaximumRemovedAndroidLogLevelRule.NONE;
if (this.maxRemovedAndroidLogLevel == MaximumRemovedAndroidLogLevelRule.NOT_SET) {
this.maxRemovedAndroidLogLevel = maxRemovedAndroidLogLevel;
} else {
// If there are multiple -maximumremovedandroidloglevel rules we only allow removing logging
// calls that are removable according to all rules.
this.maxRemovedAndroidLogLevel =
Math.min(this.maxRemovedAndroidLogLevel, maxRemovedAndroidLogLevel);
}
}
public int getMaxRemovedAndroidLogLevel() {
return maxRemovedAndroidLogLevel;
}
@Override
public PackageObfuscationMode getPackageObfuscationMode() {
return packageObfuscationMode;
}
@Override
public void enableFlattenPackageHierarchy(
String packagePrefix,
ProguardConfigurationSourceParser parser,
Position position,
TextPosition positionStart) {
packageObfuscationMode = PackageObfuscationMode.FLATTEN;
this.packagePrefix = packagePrefix;
}
@Override
public void enableRepackageClasses(
String packagePrefix,
ProguardConfigurationSourceParser parser,
Position position,
TextPosition positionStart) {
packageObfuscationMode = PackageObfuscationMode.REPACKAGE;
this.packagePrefix = packagePrefix;
}
@Override
public void addDontWarnPattern(
ProguardClassNameList pattern,
ProguardConfigurationSourceParser parser,
TextPosition positionStart) {
dontWarnPatterns.addPattern(pattern);
}
@Override
public void addDontNotePattern(
ProguardClassNameList pattern,
ProguardConfigurationSourceParser parser,
TextPosition positionStart) {
dontNotePatterns.addPattern(pattern);
}
@Override
public void enablePrintSeeds(
Path printSeedsFile,
ProguardConfigurationSourceParser parser,
Position position,
TextPosition positionStart) {
this.printSeeds = true;
this.printSeedsFile = printSeedsFile;
}
@Override
public void setObfuscationDictionary(
Path obfuscationDictionary,
ProguardConfigurationSourceParser parser,
Position position,
TextPosition positionStart) {
this.obfuscationDictionary = obfuscationDictionary;
}
@Override
public void setClassObfuscationDictionary(
Path classObfuscationDictionary,
ProguardConfigurationSourceParser parser,
Position position,
TextPosition positionStart) {
this.classObfuscationDictionary = classObfuscationDictionary;
}
@Override
public void setPackageObfuscationDictionary(
Path packageObfuscationDictionary,
ProguardConfigurationSourceParser parser,
Position position,
TextPosition positionStart) {
this.packageObfuscationDictionary = packageObfuscationDictionary;
}
@Override
public void setKeepParameterNames(
ProguardConfigurationSourceParser optionOrigin,
Position optionPosition,
TextPosition positionStart) {
assert optionOrigin != null || !keepParameterNames;
this.keepParameterNames = true;
}
@Override
public void addAdaptClassStringsPattern(
ProguardClassNameList pattern,
ProguardConfigurationSourceParser parser,
TextPosition positionStart) {
adaptClassStrings.addPattern(pattern);
}
@Override
public void addAdaptResourceFilenames(
ProguardPathList pattern,
ProguardConfigurationSourceParser parser,
TextPosition positionStart) {
adaptResourceFilenames.addPattern(pattern);
}
public Builder applyAdaptResourceFilenamesBuilder(
Consumer<ProguardPathFilter.Builder> consumer) {
consumer.accept(adaptResourceFilenames);
return this;
}
@Override
public void addAdaptResourceFileContents(
ProguardPathList pattern,
ProguardConfigurationSourceParser parser,
TextPosition positionStart) {
adaptResourceFileContents.addPattern(pattern);
}
@Override
public void enableKeepDirectories(
ProguardPathList keepDirectoryPatterns,
ProguardConfigurationSourceParser parser,
TextPosition positionStart) {
keepDirectories.enable().addPattern(keepDirectoryPatterns);
}
public boolean isForceProguardCompatibility() {
return forceProguardCompatibility;
}
public Builder setForceProguardCompatibility(boolean forceProguardCompatibility) {
this.forceProguardCompatibility = forceProguardCompatibility;
return this;
}
@Override
public void enableProtoShrinking(
ProguardConfigurationSourceParser parser, TextPosition positionStart) {
protoShrinking = true;
}
public ProguardConfiguration buildRaw() {
ProguardKeepAttributes proguardKeepAttributes =
ProguardKeepAttributes.fromPatterns(keepAttributePatterns);
// For Proguard -keepattributes are only applicable when obfuscating.
if (forceProguardCompatibility && !isObfuscating()) {
proguardKeepAttributes.keepAllAttributesExceptRuntimeInvisibleAnnotations();
}
ProguardConfiguration configuration =
new ProguardConfiguration(
parsedConfiguration.toString(),
dexItemFactory,
injars,
libraryJars,
packageObfuscationMode,
packagePrefix,
allowAccessModification,
ignoreWarnings,
optimizing,
obfuscating,
shrinking,
printBlastRadius,
printConfiguration,
printConfigurationFile,
printUsage,
printUsageFile,
printMapping,
printMappingFile,
applyMappingFile,
renameSourceFileAttribute,
proguardKeepAttributes,
keepPackageNamesPatterns.build(),
dontWarnPatterns.build(),
dontNotePatterns.build(),
rules,
printSeeds,
printSeedsFile,
DictionaryReader.readAllNames(obfuscationDictionary, reporter),
DictionaryReader.readAllNames(classObfuscationDictionary, reporter),
DictionaryReader.readAllNames(packageObfuscationDictionary, reporter),
keepParameterNames,
adaptClassStrings.build(),
adaptResourceFilenames.build(),
adaptResourceFileContents.build(),
keepDirectories.build(),
protoShrinking,
getMaxRemovedAndroidLogLevel(),
processKotlinNullChecks);
reporter.failIfPendingErrors();
return configuration;
}
public ProguardConfiguration build() {
return buildRaw();
}
}
private final String parsedConfiguration;
private final DexItemFactory dexItemFactory;
private final ImmutableList<FilteredClassPath> injars;
private final ImmutableList<FilteredClassPath> libraryJars;
private final PackageObfuscationMode packageObfuscationMode;
private final String packagePrefix;
private final boolean allowAccessModification;
private final boolean ignoreWarnings;
private final boolean optimizing;
private final boolean obfuscating;
private final boolean shrinking;
private final boolean printBlastRadius;
private final boolean printConfiguration;
private final Path printConfigurationFile;
private final boolean printUsage;
private final Path printUsageFile;
private final boolean printMapping;
private final Path printMappingFile;
private final Path applyMappingFile;
private final String renameSourceFileAttribute;
private final ProguardKeepAttributes keepAttributes;
private ProguardClassFilter keepPackageNamesPatterns;
private final ProguardClassFilter dontWarnPatterns;
private final ProguardClassFilter dontNotePatterns;
protected final ImmutableList<ProguardConfigurationRule> rules;
private final boolean printSeeds;
private final Path seedFile;
private final ImmutableList<String> obfuscationDictionary;
private final ImmutableList<String> classObfuscationDictionary;
private final ImmutableList<String> packageObfuscationDictionary;
private final boolean keepParameterNames;
private final ProguardClassFilter adaptClassStrings;
private final ProguardPathFilter adaptResourceFilenames;
private final ProguardPathFilter adaptResourceFileContents;
private final ProguardPathFilter keepDirectories;
private final boolean protoShrinking;
private final int maxRemovedAndroidLogLevel;
private final boolean hasWhyAreYouNotInliningRule;
private final boolean hasWhyAreYouNotObfuscatingRule;
private final ProcessKotlinNullChecks processKotlinNullChecks;
private ProguardConfiguration(
String parsedConfiguration,
DexItemFactory factory,
List<FilteredClassPath> injars,
List<FilteredClassPath> libraryJars,
PackageObfuscationMode packageObfuscationMode,
String packagePrefix,
boolean allowAccessModification,
boolean ignoreWarnings,
boolean optimizing,
boolean obfuscating,
boolean shrinking,
boolean printBlastRadius,
boolean printConfiguration,
Path printConfigurationFile,
boolean printUsage,
Path printUsageFile,
boolean printMapping,
Path printMappingFile,
Path applyMappingFile,
String renameSourceFileAttribute,
ProguardKeepAttributes keepAttributes,
ProguardClassFilter keepPackageNamesPatterns,
ProguardClassFilter dontWarnPatterns,
ProguardClassFilter dontNotePatterns,
Set<ProguardConfigurationRule> rules,
boolean printSeeds,
Path seedFile,
ImmutableList<String> obfuscationDictionary,
ImmutableList<String> classObfuscationDictionary,
ImmutableList<String> packageObfuscationDictionary,
boolean keepParameterNames,
ProguardClassFilter adaptClassStrings,
ProguardPathFilter adaptResourceFilenames,
ProguardPathFilter adaptResourceFileContents,
ProguardPathFilter keepDirectories,
boolean protoShrinking,
int maxRemovedAndroidLogLevel,
ProcessKotlinNullChecks processKotlinNullChecks) {
this.parsedConfiguration = parsedConfiguration;
this.dexItemFactory = factory;
this.injars = ImmutableList.copyOf(injars);
this.libraryJars = ImmutableList.copyOf(libraryJars);
this.packageObfuscationMode = packageObfuscationMode;
this.packagePrefix = packagePrefix;
this.allowAccessModification = allowAccessModification;
this.ignoreWarnings = ignoreWarnings;
this.optimizing = optimizing;
this.obfuscating = obfuscating;
this.shrinking = shrinking;
this.printBlastRadius = printBlastRadius;
this.printConfiguration = printConfiguration;
this.printConfigurationFile = printConfigurationFile;
this.printUsage = printUsage;
this.printUsageFile = printUsageFile;
this.printMapping = printMapping;
this.printMappingFile = printMappingFile;
this.applyMappingFile = applyMappingFile;
this.renameSourceFileAttribute = renameSourceFileAttribute;
this.keepAttributes = keepAttributes;
this.keepPackageNamesPatterns = keepPackageNamesPatterns;
this.dontWarnPatterns = dontWarnPatterns;
this.dontNotePatterns = dontNotePatterns;
this.rules = ImmutableList.copyOf(rules);
this.printSeeds = printSeeds;
this.seedFile = seedFile;
this.obfuscationDictionary = obfuscationDictionary;
this.classObfuscationDictionary = classObfuscationDictionary;
this.packageObfuscationDictionary = packageObfuscationDictionary;
this.keepParameterNames = keepParameterNames;
this.adaptClassStrings = adaptClassStrings;
this.adaptResourceFilenames = adaptResourceFilenames;
this.adaptResourceFileContents = adaptResourceFileContents;
this.keepDirectories = keepDirectories;
this.protoShrinking = protoShrinking;
this.maxRemovedAndroidLogLevel = maxRemovedAndroidLogLevel;
this.hasWhyAreYouNotInliningRule =
Iterables.any(rules, rule -> rule instanceof WhyAreYouNotInliningRule);
this.hasWhyAreYouNotObfuscatingRule =
Iterables.any(rules, rule -> rule instanceof WhyAreYouNotObfuscatingRule);
this.processKotlinNullChecks = processKotlinNullChecks;
}
/**
* Create a new empty builder.
*/
public static Builder builder(DexItemFactory dexItemFactory,
Reporter reporter) {
return new Builder(dexItemFactory, reporter);
}
public String getParsedConfiguration() {
return parsedConfiguration;
}
public DexItemFactory getDexItemFactory() {
return dexItemFactory;
}
public List<FilteredClassPath> getInjars() {
return injars;
}
public List<FilteredClassPath> getLibraryjars() {
return libraryJars;
}
public PackageObfuscationMode getPackageObfuscationMode() {
return packageObfuscationMode;
}
public String getPackagePrefix() {
return packagePrefix;
}
public boolean isAccessModificationAllowed() {
return allowAccessModification;
}
public boolean isPrintMapping() {
return printMapping;
}
public Path getPrintMappingFile() {
return printMappingFile;
}
public boolean hasApplyMappingFile() {
return applyMappingFile != null;
}
public Path getApplyMappingFile() {
return applyMappingFile;
}
public boolean isIgnoreWarnings() {
return ignoreWarnings;
}
public boolean isOptimizing() {
return optimizing;
}
public boolean isObfuscating() {
return obfuscating;
}
public boolean isShrinking() {
return shrinking;
}
public boolean isPrintBlastRadius() {
return printBlastRadius;
}
public boolean isPrintConfiguration() {
return printConfiguration;
}
public Path getPrintConfigurationFile() {
return printConfigurationFile;
}
public boolean isPrintUsage() {
return printUsage;
}
public Path getPrintUsageFile() {
return printUsageFile;
}
public String getRenameSourceFileAttribute() {
return renameSourceFileAttribute;
}
public ProguardKeepAttributes getKeepAttributes() {
return keepAttributes;
}
public ProguardClassFilter getKeepPackageNamesPatterns() {
return keepPackageNamesPatterns;
}
public void setKeepPackageNamesPatterns(ProguardClassFilter keepPackageNamesPatterns) {
this.keepPackageNamesPatterns = keepPackageNamesPatterns;
}
public boolean hasDontWarnPatterns() {
return !dontWarnPatterns.isEmpty();
}
public ProguardClassFilter getDontWarnPatterns(DontWarnConfiguration.Witness witness) {
assert witness != null;
return dontWarnPatterns;
}
public ProguardClassFilter getDontNotePatterns() {
return dontNotePatterns;
}
public List<ProguardConfigurationRule> getRules() {
return rules;
}
public List<String> getObfuscationDictionary() {
return obfuscationDictionary;
}
public List<String> getClassObfuscationDictionary() {
return classObfuscationDictionary;
}
public List<String> getPackageObfuscationDictionary() {
return packageObfuscationDictionary;
}
public boolean isKeepParameterNames() {
return keepParameterNames;
}
public ProguardClassFilter getAdaptClassStrings() {
return adaptClassStrings;
}
public ProguardPathFilter getAdaptResourceFilenames() {
return adaptResourceFilenames;
}
public ProguardPathFilter getAdaptResourceFileContents() {
return adaptResourceFileContents;
}
public ProguardPathFilter getKeepDirectories() {
return keepDirectories;
}
public boolean isPrintSeeds() {
return printSeeds;
}
public Path getSeedFile() {
return seedFile;
}
public boolean isProtoShrinkingEnabled() {
return protoShrinking;
}
public int getMaxRemovedAndroidLogLevel() {
return maxRemovedAndroidLogLevel;
}
public boolean hasMaximumRemovedAndroidLogLevelRules() {
return Iterables.any(rules, ProguardConfigurationRule::isMaximumRemovedAndroidLogLevelRule);
}
public boolean hasWhyAreYouNotInliningRule() {
return hasWhyAreYouNotInliningRule;
}
public boolean hasWhyAreYouNotObfuscatingRule() {
return hasWhyAreYouNotObfuscatingRule;
}
public ProcessKotlinNullChecks getProcessKotlinNullChecks() {
return processKotlinNullChecks;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
if (!keepAttributes.isEmpty()) {
keepAttributes.append(builder);
builder.append(StringUtils.LINE_SEPARATOR);
}
for (ProguardConfigurationRule rule : rules) {
rule.append(builder);
builder.append(StringUtils.LINE_SEPARATOR);
}
return builder.toString();
}
}