1 /* 2 * ProGuard -- shrinking, optimization, obfuscation, and preverification 3 * of Java bytecode. 4 * 5 * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu) 6 * 7 * This program is free software; you can redistribute it and/or modify it 8 * under the terms of the GNU General Public License as published by the Free 9 * Software Foundation; either version 2 of the License, or (at your option) 10 * any later version. 11 * 12 * This program is distributed in the hope that it will be useful, but WITHOUT 13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 14 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 15 * more details. 16 * 17 * You should have received a copy of the GNU General Public License along 18 * with this program; if not, write to the Free Software Foundation, Inc., 19 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 20 */ 21 package proguard; 22 23 import java.io.File; 24 import java.util.List; 25 26 /** 27 * The ProGuard configuration. 28 * 29 * @see ProGuard 30 * 31 * @author Eric Lafortune 32 */ 33 public class Configuration 34 { 35 public static final File STD_OUT = new File(""); 36 37 38 /////////////////////////////////////////////////////////////////////////// 39 // Input and output options. 40 /////////////////////////////////////////////////////////////////////////// 41 42 /** 43 * A list of input and output entries (jars, wars, ears, zips, and directories). 44 */ 45 public ClassPath programJars; 46 47 /** 48 * A list of library entries (jars, wars, ears, zips, and directories). 49 */ 50 public ClassPath libraryJars; 51 52 /** 53 * Specifies whether to skip non-public library classes while reading 54 * library jars. 55 */ 56 public boolean skipNonPublicLibraryClasses = false; 57 58 /** 59 * Specifies whether to skip non-public library class members while reading 60 * library classes. 61 */ 62 public boolean skipNonPublicLibraryClassMembers = true; 63 64 /** 65 * A list of <code>String</code>s specifying directories to be kept in 66 * the output directories or the output jars. A <code>null</code> list 67 * means no directories. An empty list means all directories. The directory 68 * names may contain "**", "*", or "?" wildcards, and they may be preceded 69 * by the "!" negator. 70 */ 71 public List keepDirectories; 72 73 /** 74 * Specifies the version number of the output classes, or 0 if the version 75 * number can be left unchanged. 76 */ 77 public int targetClassVersion; 78 79 /** 80 * Specifies the last modification time of this configuration. This time 81 * is necessary to check whether the input has to be processed. Setting it 82 * to Long.MAX_VALUE forces processing, even if the modification times 83 * of the output appear more recent than the modification times of the 84 * input. 85 */ 86 public long lastModified = 0L; 87 88 /////////////////////////////////////////////////////////////////////////// 89 // Keep options. 90 /////////////////////////////////////////////////////////////////////////// 91 92 /** 93 * A list of {@link KeepClassSpecification} instances, whose class names and 94 * class member names are to be kept from shrinking, optimization, and/or 95 * obfuscation. 96 */ 97 public List keep; 98 99 /** 100 * An optional output file for listing the kept seeds. 101 * An empty file name means the standard output. 102 */ 103 public File printSeeds; 104 105 /////////////////////////////////////////////////////////////////////////// 106 // Shrinking options. 107 /////////////////////////////////////////////////////////////////////////// 108 109 /** 110 * Specifies whether the code should be shrunk. 111 */ 112 public boolean shrink = true; 113 114 /** 115 * An optional output file for listing the unused classes and class 116 * members. An empty file name means the standard output. 117 */ 118 public File printUsage; 119 120 /** 121 * A list of {@link ClassSpecification} instances, for which an explanation 122 * is to be printed, why they are kept in the shrinking step. 123 */ 124 public List whyAreYouKeeping; 125 126 /////////////////////////////////////////////////////////////////////////// 127 // Optimization options. 128 /////////////////////////////////////////////////////////////////////////// 129 130 /** 131 * Specifies whether the code should be optimized. 132 */ 133 public boolean optimize = true; 134 135 /** 136 * A list of <code>String</code>s specifying the optimizations to be 137 * performed. A <code>null</code> list means all optimizations. The 138 * optimization names may contain "*" or "?" wildcards, and they may 139 * be preceded by the "!" negator. 140 */ 141 public List optimizations; 142 143 /** 144 * Specifies the number of optimization passes. 145 */ 146 public int optimizationPasses = 1; 147 148 /** 149 * A list of {@link ClassSpecification} instances, whose methods are 150 * assumed to have no side effects. 151 */ 152 public List assumeNoSideEffects; 153 154 /** 155 * Specifies whether the access of class members can be modified. 156 */ 157 public boolean allowAccessModification = false; 158 159 /** 160 * Specifies whether interfaces may be merged aggressively. 161 */ 162 public boolean mergeInterfacesAggressively = false; 163 164 /////////////////////////////////////////////////////////////////////////// 165 // Obfuscation options. 166 /////////////////////////////////////////////////////////////////////////// 167 168 /** 169 * Specifies whether the code should be obfuscated. 170 */ 171 public boolean obfuscate = true; 172 173 /** 174 * An optional output file for listing the obfuscation mapping. 175 * An empty file name means the standard output. 176 */ 177 public File printMapping; 178 179 /** 180 * An optional input file for reading an obfuscation mapping. 181 */ 182 public File applyMapping; 183 184 /** 185 * An optional name of a file containing obfuscated class member names. 186 */ 187 public File obfuscationDictionary; 188 189 /** 190 * An optional name of a file containing obfuscated class names. 191 */ 192 public File classObfuscationDictionary; 193 194 /** 195 * An optional name of a file containing obfuscated package names. 196 */ 197 public File packageObfuscationDictionary; 198 199 /** 200 * Specifies whether to apply aggressive name overloading on class members. 201 */ 202 public boolean overloadAggressively = false; 203 204 /** 205 * Specifies whether to generate globally unique class member names. 206 */ 207 public boolean useUniqueClassMemberNames = false; 208 209 /** 210 * Specifies whether obfuscated packages and classes can get mixed-case names. 211 */ 212 public boolean useMixedCaseClassNames = true; 213 214 /** 215 * A list of <code>String</code>s specifying package names to be kept. 216 * A <code>null</code> list means no names. An empty list means all 217 * names. The package names may contain "**", "*", or "?" wildcards, and 218 * they may be preceded by the "!" negator. 219 */ 220 public List keepPackageNames; 221 222 /** 223 * An optional base package if the obfuscated package hierarchy is to be 224 * flattened, <code>null</code> otherwise. 225 */ 226 public String flattenPackageHierarchy; 227 228 /** 229 * An optional base package if the obfuscated classes are to be repackaged 230 * into a single package, <code>null</code> otherwise. 231 */ 232 public String repackageClasses; 233 234 /** 235 * A list of <code>String</code>s specifying optional attributes to be kept. 236 * A <code>null</code> list means no attributes. An empty list means all 237 * attributes. The attribute names may contain "*" or "?" wildcards, and 238 * they may be preceded by the "!" negator. 239 */ 240 public List keepAttributes; 241 242 /** 243 * Specifies whether method parameter names and types should be kept for 244 * methods that are not obfuscated. This is achieved by keeping partial 245 * "LocalVariableTable" and "LocalVariableTypeTable" attributes. 246 */ 247 public boolean keepParameterNames = false; 248 249 /** 250 * An optional replacement for all SourceFile attributes. 251 */ 252 public String newSourceFileAttribute; 253 254 /** 255 * A list of <code>String</code>s specifying a filter for classes whose 256 * string constants are to be adapted, based on corresponding obfuscated 257 * class names. 258 */ 259 public List adaptClassStrings; 260 261 /** 262 * A list of <code>String</code>s specifying a filter for files whose 263 * names are to be adapted, based on corresponding obfuscated class names. 264 */ 265 public List adaptResourceFileNames; 266 267 /** 268 * A list of <code>String</code>s specifying a filter for files whose 269 * contents are to be adapted, based on obfuscated class names. 270 */ 271 public List adaptResourceFileContents; 272 273 /////////////////////////////////////////////////////////////////////////// 274 // Preverification options. 275 /////////////////////////////////////////////////////////////////////////// 276 277 /** 278 * Specifies whether the code should be preverified. 279 */ 280 public boolean preverify = true; 281 282 /** 283 * Specifies whether the code should be preverified for Java Micro Edition 284 * (creating StackMap attributes) instead of for Java Standard Edition 285 * (creating StackMapTable attributes). 286 */ 287 public boolean microEdition = false; 288 289 /////////////////////////////////////////////////////////////////////////// 290 // General options. 291 /////////////////////////////////////////////////////////////////////////// 292 293 /** 294 * Specifies whether to print verbose messages. 295 */ 296 public boolean verbose = false; 297 298 /** 299 * A list of <code>String</code>s specifying a filter for the classes for 300 * which not to print notes, if there are noteworthy potential problems. 301 * A <code>null</code> list means all classes. The class names may contain 302 * "**", "*", or "?" wildcards, and they may be preceded by the "!" negator. 303 */ 304 public List note = null; 305 306 /** 307 * A list of <code>String</code>s specifying a filter for the classes for 308 * which not to print warnings, if there are any problems. 309 * A <code>null</code> list means all classes. The class names may contain 310 * "**", "*", or "?" wildcards, and they may be preceded by the "!" negator. 311 */ 312 public List warn = null; 313 314 /** 315 * Specifies whether to ignore any warnings. 316 */ 317 public boolean ignoreWarnings = false; 318 319 /** 320 * An optional output file for printing out the configuration that ProGuard 321 * is using (with included files and replaced variables). 322 * An empty file name means the standard output. 323 */ 324 public File printConfiguration; 325 326 /** 327 * An optional output file for printing out the processed code in a more 328 * or less readable form. An empty file name means the standard output. 329 */ 330 public File dump; 331 } 332