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