blob: bc4aea2eca563eb0c65af74ce6407a1b0c746e3e [file] [log] [blame]
/*
* ProGuard -- shrinking, optimization, obfuscation, and preverification
* of Java bytecode.
*
* Copyright (c) 2002-2019 Guardsquare NV
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package proguard;
import java.io.File;
import java.net.URL;
import java.util.*;
/**
* The ProGuard configuration.
*
* @see ProGuard
*
* @author Eric Lafortune
*/
public class Configuration
{
public static final File STD_OUT = new File("");
///////////////////////////////////////////////////////////////////////////
// Input and output options.
///////////////////////////////////////////////////////////////////////////
/**
* A list of input and output entries (jars, wars, ears, jmods, zips, and directories).
*/
public ClassPath programJars;
/**
* A list of library entries (jars, wars, ears, jmods, zips, and directories).
*/
public ClassPath libraryJars;
/**
* Specifies whether to skip non-public library classes while reading
* library jars.
*/
public boolean skipNonPublicLibraryClasses = false;
/**
* Specifies whether to skip non-public library class members while reading
* library classes.
*/
public boolean skipNonPublicLibraryClassMembers = true;
/**
* A list of <code>String</code>s specifying directories to be kept in
* the output directories or the output jars. A <code>null</code> list
* means no directories. An empty list means all directories. The directory
* names may contain "**", "*", or "?" wildcards, and they may be preceded
* by the "!" negator.
*/
public List keepDirectories;
/**
* Specifies the version number of the output classes, or 0 if the version
* number can be left unchanged.
*/
public int targetClassVersion;
/**
* Specifies the last modification time of this configuration. This time
* is necessary to check whether the input has to be processed. Setting it
* to Long.MAX_VALUE forces processing, even if the modification times
* of the output appear more recent than the modification times of the
* input.
*/
public long lastModified = 0L;
///////////////////////////////////////////////////////////////////////////
// Keep options.
///////////////////////////////////////////////////////////////////////////
/**
* A list of {@link KeepClassSpecification} instances, whose class names and
* class member names are to be kept from shrinking, optimization, and/or
* obfuscation.
*/
public List keep;
/**
* An optional output file for listing the kept seeds.
* An empty file name means the standard output.
*/
public File printSeeds;
///////////////////////////////////////////////////////////////////////////
// Shrinking options.
///////////////////////////////////////////////////////////////////////////
/**
* Specifies whether the code should be shrunk.
*/
public boolean shrink = true;
/**
* An optional output file for listing the unused classes and class
* members. An empty file name means the standard output.
*/
public File printUsage;
/**
* A list of {@link ClassSpecification} instances, for which an explanation
* is to be printed, why they are kept in the shrinking step.
*/
public List whyAreYouKeeping;
///////////////////////////////////////////////////////////////////////////
// Optimization options.
///////////////////////////////////////////////////////////////////////////
/**
* Specifies whether the code should be optimized.
*/
public boolean optimize = true;
/**
* A list of <code>String</code>s specifying the optimizations to be
* performed. A <code>null</code> list means all optimizations. The
* optimization names may contain "*" or "?" wildcards, and they may
* be preceded by the "!" negator.
*/
public List optimizations;
/**
* Specifies the number of optimization passes.
*/
public int optimizationPasses = 1;
/**
* A list of {@link ClassSpecification} instances, whose methods are
* assumed to have no side effects.
*/
public List assumeNoSideEffects;
/**
* A list of {@link ClassSpecification} instances, whose methods are
* assumed to have no side external effects (that is, outside of 'this').
*/
public List assumeNoExternalSideEffects;
/**
* A list of {@link ClassSpecification} instances, whose methods are
* assumed not to let any reference parameters escape (including 'this').
*/
public List assumeNoEscapingParameters;
/**
* A list of {@link ClassSpecification} instances, whose methods are
* assumed not to return any external references (only parameters and new
* instances).
*/
public List assumeNoExternalReturnValues;
/**
* A list of {@link ClassSpecification} instances, with fields and methods
* that have specified fixed primitive values.
*/
public List assumeValues;
/**
* Specifies whether the access of class members can be modified.
*/
public boolean allowAccessModification = false;
/**
* Specifies whether interfaces may be merged aggressively.
*/
public boolean mergeInterfacesAggressively = false;
///////////////////////////////////////////////////////////////////////////
// Obfuscation options.
///////////////////////////////////////////////////////////////////////////
/**
* Specifies whether the code should be obfuscated.
*/
public boolean obfuscate = true;
/**
* An optional output file for listing the obfuscation mapping.
* An empty file name means the standard output.
*/
public File printMapping;
/**
* An optional input file for reading an obfuscation mapping.
*/
public File applyMapping;
/**
* An optional name of a file containing obfuscated class member names.
*/
public URL obfuscationDictionary;
/**
* An optional name of a file containing obfuscated class names.
*/
public URL classObfuscationDictionary;
/**
* An optional name of a file containing obfuscated package names.
*/
public URL packageObfuscationDictionary;
/**
* Specifies whether to apply aggressive name overloading on class members.
*/
public boolean overloadAggressively = false;
/**
* Specifies whether to generate globally unique class member names.
*/
public boolean useUniqueClassMemberNames = false;
/**
* Specifies whether obfuscated packages and classes can get mixed-case names.
*/
public boolean useMixedCaseClassNames = true;
/**
* A list of <code>String</code>s specifying package names to be kept.
* A <code>null</code> list means no names. An empty list means all
* names. The package names may contain "**", "*", or "?" wildcards, and
* they may be preceded by the "!" negator.
*/
public List keepPackageNames;
/**
* An optional base package if the obfuscated package hierarchy is to be
* flattened, <code>null</code> otherwise.
*/
public String flattenPackageHierarchy;
/**
* An optional base package if the obfuscated classes are to be repackaged
* into a single package, <code>null</code> otherwise.
*/
public String repackageClasses;
/**
* A list of <code>String</code>s specifying optional attributes to be kept.
* A <code>null</code> list means no attributes. An empty list means all
* attributes. The attribute names may contain "*" or "?" wildcards, and
* they may be preceded by the "!" negator.
*/
public List keepAttributes;
/**
* Specifies whether method parameter names and types should be kept for
* methods that are not obfuscated. This is achieved by keeping partial
* "LocalVariableTable" and "LocalVariableTypeTable" attributes.
*/
public boolean keepParameterNames = false;
/**
* An optional replacement for all SourceFile attributes.
*/
public String newSourceFileAttribute;
/**
* A list of <code>String</code>s specifying a filter for classes whose
* string constants are to be adapted, based on corresponding obfuscated
* class names.
*/
public List adaptClassStrings;
/**
* A list of <code>String</code>s specifying a filter for files whose
* names are to be adapted, based on corresponding obfuscated class names.
*/
public List adaptResourceFileNames;
/**
* A list of <code>String</code>s specifying a filter for files whose
* contents are to be adapted, based on obfuscated class names.
*/
public List adaptResourceFileContents;
///////////////////////////////////////////////////////////////////////////
// Preverification options.
///////////////////////////////////////////////////////////////////////////
/**
* Specifies whether the code should be preverified.
*/
public boolean preverify = true;
/**
* Specifies whether the code should be preverified for Java Micro Edition
* (creating StackMap attributes) instead of for Java Standard Edition
* (creating StackMapTable attributes).
*/
public boolean microEdition = false;
/**
* Specifies whether the code should be targeted at the Android platform.
*/
public boolean android = false;
///////////////////////////////////////////////////////////////////////////
// General options.
///////////////////////////////////////////////////////////////////////////
/**
* Specifies whether to print verbose messages.
*/
public boolean verbose = false;
/**
* A list of <code>String</code>s specifying a filter for the classes for
* which not to print notes, if there are noteworthy potential problems.
* A <code>null</code> list means all classes. The class names may contain
* "**", "*", or "?" wildcards, and they may be preceded by the "!" negator.
*/
public List note = null;
/**
* A list of <code>String</code>s specifying a filter for the classes for
* which not to print warnings, if there are any problems.
* A <code>null</code> list means all classes. The class names may contain
* "**", "*", or "?" wildcards, and they may be preceded by the "!" negator.
*/
public List warn = null;
/**
* Specifies whether to ignore any warnings.
*/
public boolean ignoreWarnings = false;
/**
* An optional output file for printing out the configuration that ProGuard
* is using (with included files and replaced variables).
* An empty file name means the standard output.
*/
public File printConfiguration;
/**
* An optional output file for printing out the processed code in a more
* or less readable form. An empty file name means the standard output.
*/
public File dump;
/**
* Specifies whether to add logging to reflection code, providing suggestions
* on the ProGuard configuration.
*/
public boolean addConfigurationDebugging;
/**
* Specifies whether to backporting of class files to another
* targetClassVersion shall be enabled.
*/
public boolean backport = false;
}