Blockpostprocessing(the new DSL post-processing) is simple and convenient for configuring alternatives to proguard-android.txtand proguard-android-optimize.txt( proguard-android.txtand proguard-android-optimize.txtgenerated during assembly and stored in the assembly directory).
1. proguard-rules.pro -
buildTypes {
release {
proguardFile 'proguard-rules.pro'
}
}
2. proguard-android.txt -
buildTypes {
release {
proguardFile getDefaultProguardFile('proguard-android.txt')
}
}
3. proguard-android-optimize.txt -
buildTypes {
release {
proguardFile getDefaultProguardFile('proguard-android-optimize.txt')
}
}
4. proguard-android.txt - , proguard-rules.pro -
buildTypes {
release {
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
5. proguard-android-optimize.txt - , proguard-rules.pro -
buildTypes {
release {
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
6. removeUnusedCode, removeUnusedResources, obfuscate, optimizeCode -
buildTypes {
release {
postprocessing {
removeUnusedCode false
removeUnusedResources false
obfuscate false
optimizeCode false
}
}
}
7. removeUnusedCode, removeUnusedResources, obfuscate, optimizeCode - , proguard-rules.pro -
buildTypes {
release {
postprocessing {
removeUnusedCode false
removeUnusedResources false
obfuscate false
optimizeCode false
proguardFile 'proguard-rules.pro'
}
}
}
8. removeUnusedCode, removeUnusedResources, obfuscate, optimizeCode - , proguard-defaults.txt - ( , , DSL postProcessing)
buildTypes {
release {
postprocessing {
removeUnusedCode false
removeUnusedResources false
obfuscate false
optimizeCode false
proguardFile getDefaultProguardFile('proguard-defaults.txt')
}
}
}
9. removeUnusedCode, removeUnusedResources, obfuscate, optimizeCode - , proguard-defaults.txt - ( , , DSL postprocessing), proguard- rules.pro -
buildTypes {
release {
postprocessing {
removeUnusedCode false
removeUnusedResources false
obfuscate false
optimizeCode false
proguardFiles getDefaultProguardFile('proguard-defaults.txt'), 'proguard-rules.pro'
}
}
}
PostprocessingOptions :
//Test ProGuard rule files
testProguardFile 'test-proguard-rules.pro'
testProguardFiles 'test-proguard-rules-1.pro', 'test-proguard-rules-2.pro'
//ProGuard rule files to be included in the published AAR.
//These proguard rule files will then be used by any application project that consumes the AAR (if ProGuard is enabled).
//This is only valid for Library project. This is ignored in Application project.
consumerProguardFile 'consumer-proguard-rules.pro'
consumerProguardFiles 'consumer-proguard-rules-1.pro', 'consumer-proguard-rules-2.pro'
PostprocessingOptions.java com.android.tools.build: gradle:3.1.0-alpha08:
package com.android.build.gradle.internal.dsl;
import static com.google.common.base.Verify.verifyNotNull;
import com.android.annotations.NonNull;
import com.android.annotations.Nullable;
import com.android.annotations.VisibleForTesting;
import com.android.build.gradle.ProguardFiles;
import com.android.build.gradle.internal.scope.CodeShrinker;
import com.android.utils.HelpfulEnumConverter;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import org.gradle.api.Project;
public class PostprocessingOptions {
private static final String AUTO = "auto";
private static final HelpfulEnumConverter<CodeShrinker> SHRINKER_CONVERTER =
new HelpfulEnumConverter<>(CodeShrinker.class);
@NonNull private final Project project;
private boolean removeUnusedCode;
private boolean removeUnusedResources;
private boolean obfuscate;
private boolean optimizeCode;
private List<File> proguardFiles;
private List<File> testProguardFiles;
private List<File> consumerProguardFiles;
@Nullable private CodeShrinker codeShrinker;
@Inject
public PostprocessingOptions(@NonNull Project project) {
this(
project,
ImmutableList.of(
ProguardFiles.getDefaultProguardFile(
ProguardFiles.ProguardFile.NO_ACTIONS.fileName, project)));
}
@VisibleForTesting
PostprocessingOptions(@NonNull Project project, List<File> proguardFiles) {
this.project = project;
this.proguardFiles = Lists.newArrayList(proguardFiles);
this.testProguardFiles = new ArrayList<>();
this.consumerProguardFiles = new ArrayList<>();
}
public void initWith(PostprocessingOptions that) {
this.removeUnusedCode = that.isRemoveUnusedCode();
this.removeUnusedResources = that.isRemoveUnusedResources();
this.obfuscate = that.isObfuscate();
this.optimizeCode = that.isOptimizeCode();
this.proguardFiles = Lists.newArrayList(that.getProguardFiles());
this.testProguardFiles = Lists.newArrayList(that.getTestProguardFiles());
this.consumerProguardFiles = Lists.newArrayList(that.getConsumerProguardFiles());
this.codeShrinker = that.getCodeShrinkerEnum();
}
public boolean isRemoveUnusedCode() {
return removeUnusedCode;
}
public void setRemoveUnusedCode(boolean removeUnusedCode) {
this.removeUnusedCode = removeUnusedCode;
}
public boolean isRemoveUnusedResources() {
return removeUnusedResources;
}
public void setRemoveUnusedResources(boolean removeUnusedResources) {
this.removeUnusedResources = removeUnusedResources;
}
public boolean isObfuscate() {
return obfuscate;
}
public void setObfuscate(boolean obfuscate) {
this.obfuscate = obfuscate;
}
public boolean isOptimizeCode() {
return optimizeCode;
}
public void setOptimizeCode(boolean optimizeCode) {
this.optimizeCode = optimizeCode;
}
public List<File> getProguardFiles() {
return proguardFiles;
}
public void setProguardFiles(List<Object> proguardFiles) {
this.proguardFiles = new ArrayList<>();
for (Object file : proguardFiles) {
this.proguardFiles.add(project.file(file));
}
}
public void proguardFile(Object file) {
this.proguardFiles.add(project.file(file));
}
public void proguardFiles(Object... files) {
for (Object file : files) {
proguardFile(file);
}
}
public List<File> getTestProguardFiles() {
return testProguardFiles;
}
public void setTestProguardFiles(List<Object> testProguardFiles) {
this.testProguardFiles = new ArrayList<>();
for (Object file : testProguardFiles) {
this.testProguardFiles.add(project.file(file));
}
}
public void testProguardFile(Object file) {
this.testProguardFiles.add(project.file(file));
}
public void testProguardFiles(Object... files) {
for (Object file : files) {
testProguardFile(file);
}
}
public List<File> getConsumerProguardFiles() {
return consumerProguardFiles;
}
public void setConsumerProguardFiles(List<Object> consumerProguardFiles) {
this.consumerProguardFiles = new ArrayList<>();
for (Object file : consumerProguardFiles) {
this.consumerProguardFiles.add(project.file(file));
}
}
public void consumerProguardFile(Object file) {
this.consumerProguardFiles.add(project.file(file));
}
public void consumerProguardFiles(Object... files) {
for (Object file : files) {
consumerProguardFile(file);
}
}
@NonNull
public String getCodeShrinker() {
if (codeShrinker == null) {
return AUTO;
} else {
return verifyNotNull(SHRINKER_CONVERTER.reverse().convert(codeShrinker));
}
}
public void setCodeShrinker(@NonNull String name) {
if (name.equals(AUTO)) {
codeShrinker = null;
} else {
codeShrinker = SHRINKER_CONVERTER.convert(name);
}
}
@Nullable
public CodeShrinker getCodeShrinkerEnum() {
return codeShrinker;
}
}
ProguardFiles.java com.android.tools.build: gradle:3.1.0-alpha08:
...
public enum ProguardFile {
DONT_OPTIMIZE("proguard-android.txt"),
OPTIMIZE("proguard-android-optimize.txt"),
NO_ACTIONS("proguard-defaults.txt"),
;
@NonNull public final String fileName;
ProguardFile(@NonNull String fileName) {
this.fileName = fileName;
}
}
...