/*
|
* ProGuard -- shrinking, optimization, obfuscation, and preverification
|
* of Java bytecode.
|
*
|
* Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
|
*
|
* 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.util.List;
|
|
/**
|
* The ProGuard configuration.
|
*
|
* @see ProGuard
|
*
|
* @author Eric Lafortune
|
*/
|
public class Configuration
|
{
|
public static final File STD_OUT = new File("");
|
|
|
///////////////////////////////////////////////////////////////////////////
|
// Input and output options.
|
///////////////////////////////////////////////////////////////////////////
|
|
// Android-added: Add -systemjars option.
|
/**
|
* A list of system entries (jars, wars, ears, zips, and directories).
|
*
|
* <p>A system jar is one that appears on the runtime classpath before the program jars. Unless
|
* there are duplicate classes between it and a program jar then it behaves no different to a
|
* library jar. If there are duplicate classes between it and a program jar then the class in
|
* the system jar will be used and the duplicate class in the program jar will be ignored.
|
* Conversely, if a library jar contains duplicates of classes in a program jar then the class
|
* in the program jar will be used and the one in the library jar will be ignored.
|
*
|
* <p>e.g. the android.jar from the Android SDK should usually be treated as a system jar
|
* because at runtime if the APK contains duplicates of classes in android.jar then the ones in
|
* the APK will be ignored; unless the APK does some ClassLoader manipulation to change that
|
* behavior.
|
*/
|
public ClassPath systemJars;
|
|
/**
|
* A list of input and output entries (jars, wars, ears, zips, and directories).
|
*/
|
public ClassPath programJars;
|
|
/**
|
* A list of library entries (jars, wars, ears, 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;
|
|
/**
|
* 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 File obfuscationDictionary;
|
|
/**
|
* An optional name of a file containing obfuscated class names.
|
*/
|
public File classObfuscationDictionary;
|
|
/**
|
* An optional name of a file containing obfuscated package names.
|
*/
|
public File 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;
|
|
///////////////////////////////////////////////////////////////////////////
|
// 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;
|
}
|