diff options
Diffstat (limited to 'docs/manual/usage.html')
-rw-r--r-- | docs/manual/usage.html | 1231 |
1 files changed, 1231 insertions, 0 deletions
diff --git a/docs/manual/usage.html b/docs/manual/usage.html new file mode 100644 index 0000000..8be8d60 --- /dev/null +++ b/docs/manual/usage.html @@ -0,0 +1,1231 @@ +<!doctype html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> +<html> +<head> +<meta http-equiv="content-type" content="text/html; charset=iso-8859-1"> +<meta http-equiv="content-style-type" content="text/css"> +<link rel="stylesheet" type="text/css" href="style.css"> +<title>ProGuard Usage</title> +</head> +<body> + +<h2>Usage</h2> + +To run ProGuard, just type: +<p class="code"> +<code><b>java -jar proguard.jar </b></code><i>options</i> ... +</p> +You can find the ProGuard jar in the <code>lib</code> directory of the +ProGuard distribution. Options can also be put in one or more configuration +files. Typically, you'll put most options in a configuration file (say, +<code>myconfig.pro</code>), and just call: +<p class="code"> +<code><b>java -jar proguard.jar @myconfig.pro</b></code> +</p> +You can combine command line options and options from configuration files, for +instance: +<p class="code"> +<code><b>java -jar proguard.jar @myconfig.pro -verbose</b></code> +</p> +<p> +In a configuration file, a <code><b>#</b></code> sign and all remaining +characters on that line are ignored, allowing you to add comments. +<p> +Extra whitespace between words and delimiters is ignored. To specify file +names with spaces or special characters, words can be quoted with single or +double quotes. Note that the quotes may need to be escaped when used on the +command line, to avoid them being gobbled by the shell. +<p> +Options can be grouped arbitrarily in arguments on the command line and in +lines in configuration files. This means that you can quote any arbitrary +section of command line options, to avoid shell expansion of special +characters, for instance. +<p> +The order of the options is generally irrelevant. They can be abbreviated to +their first unique characters. +<p> + +The sections below provide more details: +<ul> +<li><a href="#iooptions">Input/Output Options</a> +<li><a href="#keepoptions">Keep Options</a> +<li><a href="#shrinkingoptions">Shrinking Options</a> +<li><a href="#optimizationoptions">Optimization Options</a> +<li><a href="#obfuscationoptions">Obfuscation Options</a> +<li><a href="#preverificationoptions">Preverification Options</a> +<li><a href="#generaloptions">General Options</a> +<li><a href="#classpath">Class Paths</a> +<li><a href="#filename">File Names</a> +<li><a href="#filefilters">File Filters</a> +<li><a href="#filters">Filters</a> +<li><a href="#keepoverview">Overview of <code>Keep</code> Options</a> +<li><a href="#keepoptionmodifiers">Keep Option Modifiers</a> +<li><a href="#classspecification">Class Specifications</a> +</ul> + +<a name="iooptions"> </a> +<h2>Input/Output Options</h2> + +<dl> +<dt><a name="at"><code><b>@</b></code></a><a href="#filename"><i>filename</i></a></dt> + +<dd>Short for '<a href="#include"><code>-include</code></a> + <a href="#filename"><i>filename</i></a>'.</dd> + +<dt><a name="include"><code><b>-include</b></code></a> + <a href="#filename"><i>filename</i></a></dt> + +<dd>Recursively reads configuration options from the given file + <i>filename</i>.</dd> + +<dt><a name="basedirectory"><code><b>-basedirectory</b></code></a> + <a href="#filename"><i>directoryname</i></a></dt> + +<dd>Specifies the base directory for all subsequent relative file names in + these configuration arguments or this configuration file.</dd> + +<dt><a name="injars"><code><b>-injars</b></code></a> + <a href="#classpath"><i>class_path</i></a></dt> + +<dd>Specifies the input jars (or wars, ears, zips, or directories) of the + application to be processed. The class files in these jars will be + processed and written to the output jars. By default, any non-class files + will be copied without changes. Please be aware of any temporary files + (e.g. created by IDEs), especially if you are reading your input files + straight from directories. The entries in the class path can be filtered, + as explained in the <a href="#filefilters">filters</a> section. For better + readability, class path entries can be specified using multiple + <code>-injars</code> options.</dd> + +<dt><a name="outjars"><code><b>-outjars</b></code></a> + <a href="#classpath"><i>class_path</i></a></dt> + +<dd>Specifies the names of the output jars (or wars, ears, zips, or + directories). The processed input of the preceding <code>-injars</code> + options will be written to the named jars. This allows you to collect the + contents of groups of input jars into corresponding groups of output jars. + In addition, the output entries can be filtered, as explained in + the <a href="#filefilters">filters</a> section. Each processed class file + or resource file is then written to the first output entry with a matching + filter, within the group of output jars. + <p> + You must avoid letting the output files overwrite any input files. For + better readability, class path entries can be specified using multiple + <code>-outjars</code> options. Without any <code>-outjars</code> options, + no jars will be written.</dd> + +<dt><a name="libraryjars"><code><b>-libraryjars</b></code></a> + <a href="#classpath"><i>class_path</i></a></dt> + +<dd>Specifies the library jars (or wars, ears, zips, or directories) of the + application to be processed. The files in these jars will not be included + in the output jars. The specified library jars should at least contain the + class files that are <i>extended</i> by application class files. Library + class files that are only <i>called</i> needn't be present, although their + presence can improve the results of the optimization step. The entries in + the class path can be filtered, as explained in the <a + href="#filefilters">filters</a> section. For better readability, class path + entries can be specified using multiple <code>-libraryjars</code> options. + <p> + Please note that the boot path and the class path set for running ProGuard + are not considered when looking for library classes. This means that you + explicitly have to specify the run-time jar that your code will use. + Although this may seem cumbersome, it allows you to process applications + targeted at different run-time environments. For example, you can process + <a href="examples.html#application">J2SE applications</a> as well as <a + href="examples.html#midlet">JME midlets</a>, just by specifying the + appropriate run-time jar.</dd> + +<dt><a name="dontskipnonpubliclibraryclasses"><code><b>-dontskipnonpubliclibraryclasses</b></code></a></dt> + +<dd>Specifies not to ignore non-public library classes. By default, non-public + library classes are skipped while parsing library jars. The classes are + typically not relevant during processing, since they don't affect the + actual program code in the input jars. Ignoring them reduces memory usage + and processing time. Occasionally, a badly designed library may contain a + non-public library class that is extended/implemented by a public library + class. If the latter library class in turn is extended/implemented by a + program class, ProGuard will complain that it can't find the non-public + library class, which it had ignored during parsing. This option will + overcome that problem, at the cost of greater memory usage and longer + processing time.</dd> + +<dt><a name="dontskipnonpubliclibraryclassmembers"><code><b>-dontskipnonpubliclibraryclassmembers</b></code></a></dt> + +<dd>Specifies not to ignore package visible library class members (fields and + methods). By default, these class members are skipped while parsing + library classes, as program classes will generally not refer to them. + Sometimes however, program classes reside in the same packages as library + classes, and they do refer to their package visible class members. In + those cases, it can be useful to actually read the class members, in order + to make sure the processed code remains consistent.</dd> + +<dt><a name="keepdirectories"><code><b>-keepdirectories</b></code></a> + [<i><a href="#filefilters">directory_filter</a></i>]</dt> + +<dd>Specifies the directories to be kept in the output jars (or wars, ears, or + directories). By default, directory entries are removed. This reduces the + jar size, but it may be undesirable if the program code tries to find them + with constructs like "<code>MyClass.class.getResource("")</code>". If the + option is specified without a filter, all directories are kept. With a + filter, only matching directories are kept.</dd> + +<dt><a name="target"><code><b>-target</b></code></a> <i>version</i></dt> + +<dd>Specifies the version number to be set in the processed class files. The + version number can be one of <code>1.0</code>, <code>1.1</code>, + <code>1.2</code>, <code>1.3</code>, <code>1.4</code>, <code>1.5</code> (or + just <code>5</code>), or <code>1.6</code> (or just <code>6</code>). By + default, the version numbers of the class files are left unchanged. For + example, you may want to <a href="examples.html#upgrade">upgrade class + files to Java 6</a>, by changing their version numbers and having them + preverified.</dd> + +<dt><a name="forceprocessing"><code><b>-forceprocessing</b></code></a></dt> + +<dd>Specifies to process the input, even if the output seems up to date. The + up-to-dateness test is based on a comparison of the date stamps of the + specified input, output, and configuration files or directories.</dd> + +</dl> +<p> + +<a name="keepoptions"> </a> +<h2>Keep Options</h2> + +<dl> +<dt><a name="keep"><code><b>-keep</b></code></a> + [<a href="#keepoptionmodifiers">,<i>modifier</i></a>,...] + <a href="#classspecification"><i>class_specification</i></a></dt> + +<dd>Specifies classes and class members (fields and methods) to be preserved + as entry points to your code. For example, in order to <a + href="examples.html#application">keep an application</a>, you can specify + the main class along with its main method. In order to <a + href="examples.html#library">process a library</a>, you should specify all + publicly accessible elements.</dd> + +<dt><a name="keepclassmembers"><code><b>-keepclassmembers</b></code></a> + [<a href="#keepoptionmodifiers">,<i>modifier</i></a>,...] + <a href="#classspecification"><i>class_specification</i></a></dt> + +<dd>Specifies class members to be preserved, if their classes are preserved as + well. For example, you may want to <a + href="examples.html#serializable">keep all serialization fields and + methods</a> of classes that implement the <code>Serializable</code> + interface.</dd> + +<dt><a name="keepclasseswithmembers"><code><b>-keepclasseswithmembers</b></code></a> + [<a href="#keepoptionmodifiers">,<i>modifier</i></a>,...] + <a href="#classspecification"><i>class_specification</i></a></dt> + +<dd>Specifies classes and class members to be preserved, on the condition that + all of the specified class members are present. For example, you may want + to <a href="examples.html#applications">keep all applications</a> that + have a main method, without having to list them explicitly.</dd> + +<dt><a name="keepnames"><code><b>-keepnames</b></code></a> + <a href="#classspecification"><i>class_specification</i></a></dt> + +<dd>Short for <a href="#keep"><code>-keep</code></a>,<a href="#allowshrinking"><code>allowshrinking</code></a> + <a href="#classspecification"><i>class_specification</i></a> + <p> + Specifies classes and class members whose names are to be preserved, if + they aren't removed in the shrinking phase. For example, you may want to + <a href="examples.html#serializable">keep all class names</a> of classes + that implement the <code>Serializable</code> interface, so that the + processed code remains compatible with any originally serialized classes. + Classes that aren't used at all can still be removed. Only applicable when + obfuscating.</dd> + +<dt><a name="keepclassmembernames"><code><b>-keepclassmembernames</b></code></a> + <a href="#classspecification"><i>class_specification</i></a></dt> + +<dd>Short for <a href="#keepclassmembers"><code>-keepclassmembers</code></a>,<a href="#allowshrinking"><code>allowshrinking</code></a> + <a href="#classspecification"><i>class_specification</i></a> + <p> + Specifies class members whose names are to be preserved, if they aren't + removed in the shrinking phase. For example, you may want to preserve the + name of the synthetic <code>class$</code> methods when <a + href="examples.html#library">processing a library</a>, so obfuscators can + detect it again when processing an application that uses the processed + library (although ProGuard itself doesn't need this). Only applicable when + obfuscating.</dd> + +<dt><a name="keepclasseswithmembernames"><code><b>-keepclasseswithmembernames</b></code></a> + <a href="#classspecification"><i>class_specification</i></a></dt> + +<dd>Short for <a href="#keepclasseswithmembers"><code>-keepclasseswithmembers</code></a>,<a href="#allowshrinking"><code>allowshrinking</code></a> + <a href="#classspecification"><i>class_specification</i></a> + <p> + Specifies classes and class members whose names are to be preserved, on + the condition that all of the specified class members are present after + the shrinking phase. For example, you may want to <a + href="examples.html#native">keep all native method names</a> and the names + of their classes, so that the processed code can still link with the + native library code. Native methods that aren't used at all can still be + removed. If a class file is used, but none of its native methods are, its + name will still be obfuscated. Only applicable when obfuscating.</dd> + +<dt><a name="printseeds"><code><b>-printseeds</b></code></a> + [<a href="#filename"><i>filename</i></a>]</dt> + +<dd>Specifies to exhaustively list classes and class members matched by the + various <code>-keep</code> options. The list is printed to the standard + output or to the given file. The list can be useful to verify if the + intended class members are really found, especially if you're using + wildcards. For example, you may want to list all the <a + href="examples.html#applications">applications</a> or all the <a + href="examples.html#applets">applets</a> that you are keeping.</dd> + +</dl> +<p> + +<a name="shrinkingoptions"> </a> +<h2>Shrinking Options</h2> + +<dl> +<dt><a name="dontshrink"><code><b>-dontshrink</b></code></a></dt> + +<dd>Specifies not to shrink the input class files. By default, shrinking is + applied; all classes and class members are removed, except for the ones + listed by the various <code>-keep</code> options, and the ones on which + they depend, directly or indirectly. A shrinking step is also applied + after each optimization step, since some optimizations may open the + possibility to remove more classes and class members.</dd> + +<dt><a name="printusage"><code><b>-printusage</b></code></a> + [<a href="#filename"><i>filename</i></a>]</dt> + +<dd>Specifies to list dead code of the input class files. The list is printed + to the standard output or to the given file. For example, you can <a + href="examples.html#deadcode">list the unused code of an application</a>. + Only applicable when shrinking.</dd> + +<dt><a name="whyareyoukeeping"><code><b>-whyareyoukeeping</b></code></a> + <a href="#classspecification"><i>class_specification</i></a></dt> + +<dd>Specifies to print details on why the given classes and class members are + being kept in the shrinking step. This can be useful if you are wondering + why some given element is present in the output. In general, there can be + many different reasons. This option prints the shortest chain of methods + to a specified seed or entry point, for each specified class and class + member. <i>In the current implementation, the shortest chain that is + printed out may sometimes contain circular deductions -- these do not + reflect the actual shrinking process.</i> If the <a + href="#verbose"><code>-verbose</code></a> option if specified, the traces + include full field and method signatures. Only applicable when + shrinking.</dd> + +</dl> +<p> + +<a name="optimizationoptions"> </a> +<h2>Optimization Options</h2> + +<dl> +<dt><a name="dontoptimize"><code><b>-dontoptimize</b></code></a></dt> + +<dd>Specifies not to optimize the input class files. By default, optimization + is enabled; all methods are optimized at a bytecode level.</dd> + +<dt><a name="optimizations"><code><b>-optimizations</b></code></a> + <a href="optimizations.html"><i>optimization_filter</i></a></dt> + +<dd>Specifies the optimizations to be enabled and disabled, at a more + fine-grained level. Only applicable when optimizing. <i>This is an expert + option.</i></dd> + +<dt><a name="optimizationpasses"><code><b>-optimizationpasses</b></code></a> <i>n</i></dt> + +<dd>Specifies the number of optimization passes to be performed. By default, a + single pass is performed. Multiple passes may result in further + improvements. If no improvements are found after an optimization pass, the + optimization is ended. Only applicable when optimizing.</dd> + +<dt><a name="assumenosideeffects"><code><b>-assumenosideeffects</b></code></a> + <a href="#classspecification"><i>class_specification</i></a></dt> + +<dd>Specifies methods that don't have any side effects (other than maybe + returning a value). In the optimization step, ProGuard will then remove + calls to such methods, if it can determine that the return values aren't + used. Note that ProGuard will analyze your program code to find such + methods automatically. It will not analyze library code, for which this + option can thus be useful. For example, you could specify the method + <code>System.currentTimeMillis()</code>, so that any idle calls to it will + be removed. Note that ProGuard applies the option to the entire hierarchy + of the specified methods. Only applicable when optimizing. In general, + making assumptions can be dangerous; you can easily break the processed + code. <i>Only use this option if you know what you're doing!</i></dd> + +<dt><a name="allowaccessmodification"><code><b>-allowaccessmodification</b></code></a></dt> + +<dd>Specifies that the access modifiers of classes and class members may be + broadened during processing. This can improve the results of the + optimization step. For instance, when inlining a public getter, it may be + necessary to make the accessed field public too. Although Java's binary + compatibility specifications formally do not require this (cfr. <a href= + "http://java.sun.com/docs/books/jls/second_edition/html/j.title.doc.html" + >The Java Language Specification, Second Edition</a>, <a href= + "http://java.sun.com/docs/books/jls/second_edition/html/binaryComp.doc.html#47259" + >Section 13.4.6</a>), some virtual machines would have problems with the + processed code otherwise. Only applicable when optimizing (and when + obfuscating with the <a + href="#repackageclasses"><code>-repackageclasses</code></a> option). + <p> + <i>Counter-indication:</i> you probably shouldn't use this option when + processing code that is to be used as a library, since classes and class + members that weren't designed to be public in the API may become + public.</dd> + +<dt><a name="mergeinterfacesaggressively"><code><b>-mergeinterfacesaggressively</b></code></a></dt> + +<dd>Specifies that interfaces may be merged, even if their implementing + classes don't implement all interface methods. This can reduce the size of + the output by reducing the total number of classes. Note that Java's + binary compatibility specifications allow such constructs (cfr. <a href= + "http://java.sun.com/docs/books/jls/second_edition/html/j.title.doc.html" + >The Java Language Specification, Second Edition</a>, <a href= + "http://java.sun.com/docs/books/jls/second_edition/html/binaryComp.doc.html#45347" + >Section 13.5.3</a>), even if they are not allowed in the Java language + (cfr. <a href= + "http://java.sun.com/docs/books/jls/second_edition/html/j.title.doc.html" + >The Java Language Specification, Second Edition</a>, <a href= + "http://java.sun.com/docs/books/jls/second_edition/html/classes.doc.html#34031" + >Section 8.1.4</a>). Only applicable when optimizing. + <p> + <i>Counter-indication:</i> setting this option can reduce the performance + of the processed code on some JVMs, since advanced just-in-time + compilation tends to favor more interfaces with fewer implementing + classes. Worse, some JVMs may not be able to handle the resulting code. + Notably: + <ul> + <li>Sun's JRE 1.3 may throw an <code>InternalError</code> when + encountering more than 256 <i>Miranda</i> methods (interface methods + without implementations) in a class. + </ul></dd> + +</dl> +<p> + +<a name="obfuscationoptions"> </a> +<h2>Obfuscation Options</h2> + +<dl> +<dt><a name="dontobfuscate"><code><b>-dontobfuscate</b></code></a></dt> + +<dd>Specifies not to obfuscate the input class files. By default, obfuscation + is applied; classes and class members receive new short random names, + except for the ones listed by the various <code>-keep</code> options. + Internal attributes that are useful for debugging, such as source files + names, variable names, and line numbers are removed.</dd> + +<dt><a name="printmapping"><code><b>-printmapping</b></code></a> + [<a href="#filename"><i>filename</i></a>]</dt> + +<dd>Specifies to print the mapping from old names to new names for classes and + class members that have been renamed. The mapping is printed to the + standard output or to the given file. For example, it is required for + subsequent <a href="examples.html#incremental">incremental + obfuscation</a>, or if you ever want to make sense again of <a + href="examples.html#stacktrace">obfuscated stack traces</a>. Only + applicable when obfuscating.</dd> + +<dt><a name="applymapping"><code><b>-applymapping</b></code></a> + <a href="#filename"><i>filename</i></a></dt> + +<dd>Specifies to reuse the given name mapping that was printed out in a + previous obfuscation run of ProGuard. Classes and class members that are + listed in the mapping file receive the names specified along with them. + Classes and class members that are not mentioned receive new names. The + mapping may refer to input classes as well as library classes. This option + can be useful for <a href="examples.html#incremental">incremental + obfuscation</a>, i.e. processing add-ons or small patches to an existing + piece of code. In such cases, you should consider whether you also need + the option <a + href="#useuniqueclassmembernames"><code>-useuniqueclassmembernames</code></a>. + Only applicable when obfuscating.</dd> + +<dt><a name="obfuscationdictionary"><code><b>-obfuscationdictionary</b></code></a> + <a href="#filename"><i>filename</i></a></dt> + +<dd>Specifies a text file from which all valid words are used as obfuscated + field and method names. By default, short names like 'a', 'b', etc. are + used as obfuscated names. With an obfuscation dictionary, you can specify + a list of reserved key words, or identifiers with foreign characters, for + instance. White space, punctuation characters, duplicate words, and + comments after a <code><b>#</b></code> sign are ignored. Note that an + obfuscation dictionary hardly improves the obfuscation. Decent compilers + can automatically replace them, and the effect can fairly simply be undone + by obfuscating again with simpler names. The most useful application is + specifying strings that are typically already present in class files (such + as 'Code'), thus reducing the class file sizes just a little bit more. + Only applicable when obfuscating.</dd> + +<dt><a name="classobfuscationdictionary"><code><b>-classobfuscationdictionary</b></code></a> + <a href="#filename"><i>filename</i></a></dt> + +<dd>Specifies a text file from which all valid words are used as obfuscated + class names. The obfuscation dictionary is similar to the one of the + option <a + href="#obfuscationdictionary"><code>-obfuscationdictionary</code></a>. + Only applicable when obfuscating.</dd> + +<dt><a name="packageobfuscationdictionary"><code><b>-packageobfuscationdictionary</b></code></a> + <a href="#filename"><i>filename</i></a></dt> + +<dd>Specifies a text file from which all valid words are used as obfuscated + package names. The obfuscation dictionary is similar to the one of the + option <a + href="#obfuscationdictionary"><code>-obfuscationdictionary</code></a>. + Only applicable when obfuscating.</dd> + +<dt><a name="overloadaggressively"><code><b>-overloadaggressively</b></code></a></dt> + +<dd>Specifies to apply aggressive overloading while obfuscating. Multiple + fields and methods can then get the same names, as long as their arguments + and return types are different (not just their arguments). This option can + make the processed code even smaller (and less comprehensible). Only + applicable when obfuscating. + <p> + <i>Counter-indication:</i> the resulting class files fall within the Java + bytecode specification (cfr. <a href= + "http://java.sun.com/docs/books/vmspec/2nd-edition/html/VMSpecTOC.doc.html" + >The Java Virtual Machine Specification, Second Edition</a>, first + paragraphs of <a href= + "http://java.sun.com/docs/books/vmspec/2nd-edition/html/ClassFile.doc.html#2877" + >Section 4.5</a> and <a href= + "http://java.sun.com/docs/books/vmspec/2nd-edition/html/ClassFile.doc.html#1513" + >Section 4.6</a>), even though this kind of overloading is not allowed in + the Java language (cfr. <a href= + "http://java.sun.com/docs/books/jls/second_edition/html/j.title.doc.html" + >The Java Language Specification, Second Edition</a>, <a href= + "http://java.sun.com/docs/books/jls/second_edition/html/classes.doc.html#40898" + >Section 8.3</a> and <a href= + "http://java.sun.com/docs/books/jls/second_edition/html/classes.doc.html#227768" + >Section 8.4.7</a>). Still, some tools have problems with it. Notably: + <ul> + <li>Sun's JDK 1.2.2 <code>javac</code> compiler produces an exception when + compiling with such a library (cfr. <a href= + "http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4216736">Bug + #4216736</a>). You probably shouldn't use this option for processing + libraries. + <li>Sun's JRE 1.4 and later fail to serialize objects with overloaded + primitive fields. + <li>Sun's JRE 1.5 <code>pack200</code> tool reportedly has problems with + overloaded class members. + </ul></dd> + +<dt><a name="useuniqueclassmembernames"><code><b>-useuniqueclassmembernames</b></code></a></dt> + +<dd>Specifies to assign the same obfuscated names to class members that have + the same names, and different obfuscated names to class members that have + different names (for each given class member signature). Without the + option, more class members can be mapped to the same short names like 'a', + 'b', etc. The option therefore increases the size of the resulting code + slightly, but it ensures that the saved obfuscation name mapping can + always be respected in subsequent incremental obfuscation steps. + <p> + For instance, consider two distinct interfaces containing methods with the + same name and signature. Without this option, these methods may get + different obfuscated names in a first obfuscation step. If a patch is then + added containing a class that implements both interfaces, ProGuard will + have to enforce the same method name for both methods in an incremental + obfuscation step. The original obfuscated code is changed, in order to + keep the resulting code consistent. With this option <i>in the initial + obfuscation step</i>, such renaming will never be necessary. + <p> + This option is only applicable when obfuscating. In fact, if you are + planning on performing incremental obfuscation, you probably want to avoid + shrinking and optimization altogether, since these steps could remove or + modify parts of your code that are essential for later additions.</dd> + +<dt><a name="dontusemixedcaseclassnames"><code><b>-dontusemixedcaseclassnames</b></code></a></dt> + +<dd>Specifies not to generate mixed-case class names while obfuscating. By + default, obfuscated class names can contain a mix of upper-case characters + and lower-case characters. This creates perfectly acceptable and usable + jars. Only if a jar is unpacked on a platform with a case-insensitive + filing system (say, Windows), the unpacking tool may let similarly named + class files overwrite each other. Code that self-destructs when it's + unpacked! Developers who really want to unpack their jars on Windows can + use this option to switch off this behavior. Note that the obfuscated jars + will become larger as a result. Only applicable when obfuscating.</dd> + +<dt><a name="keeppackagenames"><code><b>-keeppackagenames</b></code></a> + [<i><a href="#filters">package_filter</a></i>]</dt> + +<dd>Specifies not obfuscate the given package names. The optional filter is a + comma-separated list of package names. Package names can contain <b>?</b>, + <b>*</b>, and <b>**</b> wildcards, and they can be preceded by the + <b>!</b> negator. Only applicable when obfuscating.</dd> + +<dt><a name="flattenpackagehierarchy"><code><b>-flattenpackagehierarchy</b></code></a> + [<i>package_name</i>]</dt> + +<dd>Specifies to repackage all packages that are renamed, by moving them into + the single given parent package. Without argument or with an empty string + (''), the packages are moved into the root package. This option is one + example of further <a href="examples.html#repackaging">obfuscating package + names</a>. It can make the processed code smaller and less comprehensible. + Only applicable when obfuscating.</dd> + +<dt><a name="repackageclasses"><code><b>-repackageclasses</b></code></a> + [<i>package_name</i>]</dt> + +<dd>Specifies to repackage all class files that are renamed, by moving them + into the single given package. Without argument or with an empty string + (''), the package is removed completely. This option option overrides the + <a + href="#flattenpackagehierarchy"><code>-flattenpackagehierarchy</code></a> + option. It is another example of further <a + href="examples.html#repackaging">obfuscating package names</a>. It can + make the processed code even smaller and less comprehensible. Its + deprecated name is <code>-defaultpackage</code>. Only applicable when + obfuscating. + <p> + <i>Counter-indication:</i> classes that look for resource files in their + package directories will no longer work properly if they are moved + elsewhere. When in doubt, just leave the packaging untouched by not using + this option.</dd> + +<dt><a name="keepattributes"><code><b>-keepattributes</b></code></a> + [<i><a href="#filters">attribute_filter</a></i>]</dt> + +<dd>Specifies any optional attributes to be preserved. The attributes can be + specified with one or more <code>-keepattributes</code> directives. The + optional filter is a comma-separated list of attribute names. Attribute + names can contain <b>?</b>, <b>*</b>, and <b>**</b> wildcards, and they + can be preceded by the <b>!</b> negator. Typical optional attributes are + <code>Exceptions</code>, <code>Signature</code>, <code>Deprecated</code>, + <code>SourceFile</code>, <code>SourceDir</code>, + <code>LineNumberTable</code>, <code>LocalVariableTable</code>, + <code>LocalVariableTypeTable</code>, <code>Synthetic</code>, + <code>EnclosingMethod</code>, <code>RuntimeVisibleAnnotations</code>, + <code>RuntimeInvisibleAnnotations</code>, + <code>RuntimeVisibleParameterAnnotations</code>, + <code>RuntimeInvisibleParameterAnnotations</code>, and + <code>AnnotationDefault</code>. The <code>InnerClasses</code> attribute + name can be specified as well, referring to the source name part of this + attribute. For example, you should at least keep the + <code>Exceptions</code>, <code>InnerClasses</code>, and + <code>Signature</code> attributes when <a + href="examples.html#library">processing a library</a>. As another example, + you should keep the <code>SourceFile</code> and + <code>LineNumberTable</code> attributes for <a + href="examples.html#stacktrace">producing useful obfuscated stack + traces</a>. Only applicable when obfuscating.</dd> + +<dt><a name="renamesourcefileattribute"><code><b>-renamesourcefileattribute</b></code></a> + [<i>string</i>]</dt> + +<dd>Specifies a constant string to be put in the <code>SourceFile</code> + attributes (and <code>SourceDir</code> attributes) of the class files. + Note that the attribute has to be present to start with, so it also has to + be preserved explicitly using the <code>-keepattributes</code> directive. + For example, you may want to have your processed libraries and + applications produce <a href="examples.html#stacktrace">useful obfuscated + stack traces</a>. Only applicable when obfuscating.</dd> + +<dt><a name="adaptclassstrings"><code><b>-adaptclassstrings</b></code></a> + [<i><a href="#filters">class_filter</a></i>]</dt> + +<dd>Specifies that string constants that correspond to class names should be + obfuscated as well. Without a filter, all string constants that correspond + to class names are adapted. With a filter, only string constants in + classes that match the filter are adapted. For example, if your code + contains a large number of hard-coded strings that refer to classes, and + you prefer not to keep their names, you may want to use this option. + Primarily applicable when obfuscating, although corresponding classes are + automatically kept in the shrinking step too.</dd> + +<dt><a name="adaptresourcefilenames"><code><b>-adaptresourcefilenames</b></code></a> + [<i><a href="#filefilters">file_filter</a></i>]</dt> + +<dd>Specifies the resource files to be renamed, based on the obfuscated names + of the corresponding class files (if any). Without a filter, all resource + files that correspond to class files are renamed. With a filter, only + matching files are renamed. For example, see <a + href="examples.html#resourcefiles">processing resource files</a>. Only + applicable when obfuscating.</dd> + +<dt><a name="adaptresourcefilecontents"><code><b>-adaptresourcefilecontents</b></code></a> + [<i><a href="#filefilters">file_filter</a></i>]</dt> + +<dd>Specifies the resource files whose contents are to be updated. Any class + names mentioned in the resource files are renamed, based on the obfuscated + names of the corresponding classes (if any). Without a filter, the + contents of all resource files updated. With a filter, only matching files + are updated. The resource files are parsed and written using the + platform's default character set. You can change this default character set + by setting the environment variable <code>LANG</code> or the Java system + property <code>file.encoding</code>. For an example, + see <a href="examples.html#resourcefiles">processing resource files</a>. + Only applicable when obfuscating.</dd> + +</dl> +<p> + +<a name="preverificationoptions"> </a> +<h2>Preverification Options</h2> + +<dl> +<dt><a name="dontpreverify"><code><b>-dontpreverify</b></code></a></dt> + +<dd>Specifies not to preverify the processed class files. By default, class + files are preverified if they are targeted at Java Micro Edition or at + Java 6 or higher. For Java Micro Edition, preverification is required, so + you will need to run an external preverifier on the processed code if you + specify this option. For Java 6, preverification is not required (yet), + but it improves the efficiency of the class loading in the Java Virtual + Machine.</dd> + +<dt><a name="microedition"><code><b>-microedition</b></code></a></dt> + +<dd>Specifies that the processed class files are targeted at Java Micro + Edition. The preverifier will then add the appropriate StackMap + attributes, which are different from the default StackMapTable attributes + for Java Standard Edition. For example, you will need this option if you + are <a href="examples.html#midlets">processing midlets</a>.</dd> + +</dl> +<p> + +<a name="generaloptions"> </a> +<h2>General Options</h2> + +<dl> +<dt><a name="verbose"><code><b>-verbose</b></code></a></dt> + +<dd>Specifies to write out some more information during processing. If the + program terminates with an exception, this option will print out the entire + stack trace, instead of just the exception message.</dd> + +<dt><a name="dontnote"><code><b>-dontnote</b></code></a> + [<i><a href="#filters">class_filter</a></i>]</dt> + +<dd>Specifies not to print notes about potential mistakes or omissions in the + configuration, like typos in class names, or like missing options that + might be useful. The optional filter is a regular expression; ProGuard + doesn't print notes about classes with matching names.</dd> + +<dt><a name="dontwarn"><code><b>-dontwarn</b></code></a> + [<i><a href="#filters">class_filter</a></i>]</dt> + +<dd>Specifies not to warn about unresolved references and other important + problems at all. The optional filter is a regular expression; ProGuard + doesn't print warnings about classes with matching names. Ignoring + warnings can be dangerous. For instance, if the unresolved classes or + class members are indeed required for processing, the processed code will + not function properly. <i>Only use this option if you know what you're + doing!</i></dd> + +<dt><a name="ignorewarnings"><code><b>-ignorewarnings</b></code></a></dt> + +<dd>Specifies to print any warnings about unresolved references and other + important problems, but to continue processing in any case. Ignoring + warnings can be dangerous. For instance, if the unresolved classes or + class members are indeed required for processing, the processed code will + not function properly. <i>Only use this option if you know what you're + doing!</i></dd> + +<dt><a name="printconfiguration"><code><b>-printconfiguration</b></code></a> + [<a href="#filename"><i>filename</i></a>]</dt> + +<dd>Specifies to write out the entire configuration that has been parsed, with + included files and replaced variables. The structure is printed to the + standard output or to the given file. This can sometimes be useful for + debugging configurations, or for converting XML configurations into a more + readable format.</dd> + +<dt><a name="dump"><code><b>-dump</b></code></a> + [<a href="#filename"><i>filename</i></a>]</dt> + +<dd>Specifies to write out the internal structure of the class files, after + any processing. The structure is printed to the standard output or to the + given file. For example, you may want to <a + href="examples.html#structure">write out the contents of a given jar + file</a>, without processing it at all.</dd> + +</dl> +<p> + +<a name="classpath"> </a> +<h2>Class Paths</h2> + +ProGuard accepts a generalization of class paths to specify input files and +output files. A class path consists of entries, separated by the traditional +path separator (e.g. '<b>:</b>' on Unix, or '<b>;</b>' on Windows platforms). +The order of the entries determines their priorities, in case of duplicates. +<p> +Each input entry can be: +<ul> +<li>A class file or resource file. +<li>A jar file, containing any of the above, +<li>A war file, containing any of the above, +<li>An ear file, containing any of the above, +<li>A zip file, containing any of the above, +<li>A directory (structure), containing any of the above. +</ul> +<p> +The paths of directly specified class files and resource files is ignored, so +class files should generally be part of a jar file, a war file, an ear file, a +zip file, or a directory. In addition, the paths of class files should not have +any additional directory prefixes inside the archives or directories. + +<p> +Each output entry can be: +<ul> +<li>A jar file, in which all processed class files and resource files will be + collected. +<li>A war file, in which any and all of the above will be collected, +<li>An ear file, in which any and all of the above will be collected, +<li>A zip file, in which any and all of the above will be collected, +<li>A directory, in which any and all of the above will be collected. +</ul> +<p> +When writing output entries, ProGuard will generally package the results in a +sensible way, reconstructing the input entries as much as required. Writing +everything to an output directory is the most straightforward option: the +output directory will contain a complete reconstruction of the input entries. +The packaging can be almost arbitrarily complex though: you could process an +entire application, packaged in a zip file along with its documentation, +writing it out as a zip file again. The Examples section shows a few ways +to <a href="examples.html#restructuring">restructure output archives</a>. +<p> +Files and directories can be specified as discussed in the section on <a +href="#filename">file names</a> below. +<p> +In addition, ProGuard provides the possibility to filter the class path +entries and their contents, based on their full relative file names. Each +class path entry can be followed by up to 5 types of <a +href="#filefilters">file filters</a> between parentheses, separated by +semi-colons: +<ul> +<li>A filter for all zip names that are encountered, +<li>A filter for all ear names that are encountered, +<li>A filter for all war names that are encountered, +<li>A filter for all jar names that are encountered, +<li>A filter for all class file names and resource file names that are + encountered. +</ul> +<p> +If fewer than 5 filters are specified, they are assumed to be the latter +filters. Any empty filters are ignored. More formally, a filtered class path +entry looks like this: +<pre> +<i>classpathentry</i><b>(</b>[[[[<i>zipfilter</i><b>;</b>]<i>earfilter</i><b>;</b>]<i>warfilter</i><b>;</b>]<i>jarfilter</i><b>;</b>]<i>filefilter</i><b>)</b> +</pre> +<p> +Square brackets "[]" mean that their contents are optional. +<p> +For example, "<code>rt.jar(java/**.class,javax/**.class)</code>" matches all +class files in the <code>java</code> and <code>javax</code> directories inside +the <code>rt</code> jar. +<p> +For example, "<code>input.jar(!**.gif,images/**)</code>" matches all files in +the <code>images</code> directory inside the <code>input</code> jar, except +gif files. +<p> +Note that the different filters are applied to all corresponding file types, +irrespective of their nesting levels in the input; they are orthogonal. +<p> +For example, +"<code>input.war(lib/**.jar,support/**.jar;**.class,**.gif)</code>" only +considers jar files in the <code>lib</code> and <code>support</code> +directories in the <code>input</code> war, not any other jar files. It then +matches all class files and gif files that are encountered. +<p> +The filters allow for an almost infinite number of packaging and repackaging +possibilities. The Examples section provides a few more examples +for <a href="examples.html#filtering">filtering input and output</a>. +<p> + +<a name="filename"> </a> +<h2>File Names</h2> + +ProGuard accepts absolute paths and relative paths for the various file names +and directory names. A relative path is interpreted as follows: +<ul> +<li>relative to the base directory, if set, or otherwise +<li>relative to the configuration file in which it is specified, if any, or + otherwise +<li>relative to the working directory. +</ul> +<p> +The names can contain Java system properties delimited by '<b><</b>' and +'<b>></b>'. The system properties +are automatically replaced by their respective values. +<p> +For example, <code><java.home>/lib/rt.jar</code> will automatically be +expanded to something like <code>/usr/local/java/jdk/jre/lib/rt.jar</code>. +Similarly, <code><user.home></code> will be expanded to the user's home +directory, and <code><user.dir></code> will be expanded to the current +working directory. +<p> +Names with special characters like spaces and parentheses must be quoted with +single or double quotes. Note that each file name in a list of names has to be +quoted individually. Also note that the quotes themselves may need to be +escaped when used on the command line, to avoid them being gobbled by the +shell. +<p> +For example, on the command line, you could use an option like <code>'-injars +"my program.jar":"/your directory/your program.jar"'</code>. +<p> + +<a name="filefilters"> </a> +<h2>File Filters</h2> + +Like general <a href="#filters">filters</a>, a file filter is a +comma-separated list of file names that can contain wildcards. Only files with +matching file names are read (in the case of input jars), or written (in the +case of output jars). The following wildcards are supported: + +<table cellspacing="10"> +<tr><td valign="top"><code><b>?</b></code></td> + <td>matches any single character in a file name.</td></tr> +<tr><td valign="top"><code><b>*</b></code></td> + <td>matches any part of a filename not containing the directory + separator.</td></tr> +<tr><td valign="top"><code><b>**</b></code></td> + <td>matches any part of a filename, possibly containing any number of + directory separators.</td></tr> +</table> + +For example, "<code>java/**.class,javax/**.class</code>" matches all +class files in the <code>java</code> and <code>javax</code>. +<p> + +Furthermore, a file name can be preceded by an exclamation mark '<b>!</b>' to +<i>exclude</i> the file name from further attempts to match with +<i>subsequent</i> file names. +<p> +For example, "<code>!**.gif,images/**</code>" matches all files in the +<code>images</code> directory, except gif files. +<p> +The Examples section provides a few more examples for <a +href="examples.html#filtering">filtering input and output</a>. + +<a name="filters"> </a> +<h2>Filters</h2> + +ProGuard offers options with filters for many different aspects of the +configuration: names of files, directories, classes, packages, attributes, +optimizations, etc. +<p> +A filter is a list of comma-separated names that can contain wildcards. Only +names that match an item on the list pass the filter. The supported wildcards +depend on the type of names for which the filter is being used, but the +following wildcards are typical: + +<table cellspacing="10"> +<tr><td valign="top"><code><b>?</b></code></td> + <td>matches any single character in a name.</td></tr> +<tr><td valign="top"><code><b>*</b></code></td> + <td>matches any part of a name not containing the package separator or + directory separator.</td></tr> +<tr><td valign="top"><code><b>**</b></code></td> + <td>matches any part of a name, possibly containing any number of + package separators or directory separators.</td></tr> +</table> + +For example, "<code>foo,*bar</code>" matches the name <code>foo</code> and +all names ending with <code>bar</code>. +<p> + +Furthermore, a name can be preceded by a negating exclamation mark '<b>!</b>' +to <i>exclude</i> the name from further attempts to match +with <i>subsequent</i> names. So, if a name matches an item in the filter, it +is accepted or rejected right away, depending on whether the item has a +negator. If the name doesn't match the item, it is tested against the next +item, and so on. It if doesn't match any items, it is accepted or rejected, +depending on the whether the last item has a negator or not. +<p> +For example, "<code>!foobar,*bar</code>" matches all names ending with +<code>bar</code>, except <code>foobar</code>. +<p> + +<a name="keepoverview"> </a> +<h2>Overview of <code>Keep</code> Options</h2> + +The various <code>-keep</code> options for shrinking and obfuscation may seem +a bit confusing at first, but there's actually a pattern behind them. The +following table summarizes how they are related: +<p> + +<table cellpadding="5"> + +<tr> +<th>Keep</th> +<td>From being removed or renamed</td> +<td>From being renamed</td> +</tr> + +<tr> +<td>Classes and class members</td> +<td bgcolor="#E0E0E0"><a href="#keep"><code>-keep</code></a></td> +<td bgcolor="#E0E0E0"><a href="#keepnames"><code>-keepnames</code></a></td> +</tr> + +<tr> +<td>Class members only</td> +<td bgcolor="#E0E0E0"><a href="#keepclassmembers"><code>-keepclassmembers</code></a></td> +<td bgcolor="#E0E0E0"><a href="#keepclassmembernames"><code>-keepclassmembernames</code></a></td> +</tr> + +<tr> +<td>Classes and class members, if class members present</td> +<td bgcolor="#E0E0E0"><a href="#keepclasseswithmembers"><code>-keepclasseswithmembers</code></a></td> +<td bgcolor="#E0E0E0"><a href="#keepclasseswithmembernames"><code>-keepclasseswithmembernames</code></a></td> +</tr> + +</table> +<p> + +Each of these <code>-keep</code> options is of course followed by a +<a href="#classspecification">specification</a> of the classes and class +members (fields and methods) to which it should be applied. +<p> +If you're not sure which option you need, you should probably simply use +<code>-keep</code>. It will make sure the specified classes and class members +are not removed in the shrinking step, and not renamed in the obfuscation step. +<p> +<table> +<tr><td valign="top"> +<img src="attention.gif" width="64" height="64"alt="attention"> +</td><td> +Always remember: +<ul> +<li>Specifying a class without class members only preserves the class as an + entry point — any class members may then still be removed, optimized, + or obfuscated.</li> +<li>Specifying a class member only preserves the class member as an entry + point — any associated code may still be optimized and adapted.</li> +</ul> +</td></tr> +</table> +<p> + +<a name="keepoptionmodifiers"> </a> +<h2>Keep Option Modifiers</h2> + +<dl> +<dt><a name="allowshrinking"><code><b>allowshrinking</b></code></a></dt> + +<dd>Specifies that the entry points specified in the <a href="#keep">-keep</a> + option may be shrunk, even if they have to be preserved otherwise. That + is, the entry points may be removed in the shrinking step, but if they are + necessary after all, they may not be optimized or obfuscated.</dd> + +<dt><a name="allowoptimization"><code><b>allowoptimization</b></code></a></dt> + +<dd>Specifies that the entry points specified in the <a href="#keep">-keep</a> + option may be optimized, even if they have to be preserved otherwise. That + is, the entry points may be altered in the optimization step, but they may + not be removed or obfuscated. This modifier is only useful for achieving + unusual requirements.</dd> + +<dt><a name="allowobfuscation"><code><b>allowobfuscation</b></code></a></dt> + +<dd>Specifies that the entry points specified in the <a href="#keep">-keep</a> + option may be obfuscated, even if they have to be preserved otherwise. That + is, the entry points may be renamed in the obfuscation step, but they may + not be removed or optimized. This modifier is only useful for achieving + unusual requirements.</dd> + +</dl> +<p> + +<a name="classspecification"> </a> +<h2>Class Specifications</h2> + +A class specification is a template of classes and class members (fields and +methods). It is used in the various <code>-keep</code> options and in the +<code>-assumenosideeffects</code> option. The corresponding option is only +applied to classes and class members that match the template. +<p> +The template was designed to look very Java-like, with some extensions for +wildcards. To get a feel for the syntax, you should probably look at the <a +href="examples.html">examples</a>, but this is an attempt at a complete formal +definition: +<p> + +<pre> +[<b>@</b><i>annotationtype</i>] [[<b>!</b>]<b>public</b>|<b>final</b>|<b>abstract</b>|<b>@</b> ...] [<b>!</b>]<b>interface</b>|<b>class</b>|<b>enum</b> <i>classname</i> + [<b>extends</b>|<b>implements</b> [<b>@</b><i>annotationtype</i>] <i>classname</i>] +[<b>{</b> + [<b>@</b><i>annotationtype</i>] [[<b>!</b>]<b>public</b>|<b>private</b>|<b>protected</b>|<b>static</b>|<b>volatile</b>|<b>transient</b> ...] <b><fields></b> | + (<i>fieldtype fieldname</i>)<b>;</b> + [<b>@</b><i>annotationtype</i>] [[<b>!</b>]<b>public</b>|<b>private</b>|<b>protected</b>|<b>static</b>|<b>synchronized</b>|<b>native</b>|<b>abstract</b>|<b>strictfp</b> ...] <b><methods></b> | + <b><init>(</b><i>argumenttype,...</i><b>)</b> | + <i>classname</i><b>(</b><i>argumenttype,...</i><b>)</b> | + (<i>returntype methodname</i><b>(</b><i>argumenttype,...</i><b>)</b>)<b>;</b> + [<b>@</b><i>annotationtype</i>] [[<b>!</b>]<b>public</b>|<b>private</b>|<b>protected</b>|<b>static</b> ... ] <b>*;</b> + ... +<b>}</b>] +</pre> +<p> +Square brackets "[]" mean that their contents are optional. Ellipsis dots +"..." mean that any number of the preceding items may be specified. A vertical +bar "|" delimits two alternatives. Non-bold parentheses "()" just group parts +of the specification that belong together. The indentation tries to clarify +the intended meaning, but white-space is irrelevant in actual configuration +files. +<p> +<ul> + +<li>The <code><b>class</b></code> keyword refers to any interface or class. + The <code><b>interface</b></code> keyword restricts matches to interface + classes. The <code><b>enum</b></code> keyword restricts matches to + enumeration classes. Preceding the <code><b>interface</b></code> or + <code><b>enum</b></code> keywords by a <code><b>!</b></code> restricts + matches to classes that are not interfaces or enumerations, respectively. + <p> + +<li>Every <i>classname</i> must be fully qualified, e.g. + <code>java.lang.String</code>. Class names may be specified as regular + expressions containing the following wildcards: + +<table cellspacing="10"> + +<tr><td valign="top"><code><b>?</b></code></td> + +<td>matches any single character in a class name, but not the package + separator. For example, "<code>mypackage.Test?</code>" matches + "<code>mypackage.Test1</code>" and "<code>mypackage.Test2</code>", but not + "<code>mypackage.Test12</code>".</td></tr> + +<tr><td valign="top"><code><b>*</b></code></td> + +<td>matches any part of a class name not containing the package separator. For + example, "<code>mypackage.*Test*</code>" matches + "<code>mypackage.Test</code>" and + "<code>mypackage.YourTestApplication</code>", but not + "<code>mypackage.mysubpackage.MyTest</code>". Or, more generally, + "<code>mypackage.*</code>" matches all classes in + "<code>mypackage</code>", but not in its subpackages.</td></tr> + +<tr><td valign="top"><code><b>**</b></code></td> + +<td>matches any part of a class name, possibly containing any number of + package separators. For example, "<code>**.Test</code>" matches all + <code>Test</code> classes in all packages except the root package. Or, + "<code>mypackage.**</code>" matches all classes in + "<code>mypackage</code>" and in its subpackages.</td></tr> + +</table> + + For additional flexibility, class names can actually be comma-separated + lists of class names, with optional <code><b>!</b></code> negators, just + like file name filters. This notation doesn't look very Java-like, so it + should be used with moderation. + <p> + For convenience and for backward compatibility, the class name + <code><b>*</b></code> refers to any class, irrespective of its package. + <p> + +<li>The <code><b>extends</b></code> and <code><b>implements</b></code> + specifications are typically used to restrict classes with wildcards. They + are currently equivalent, specifying that only classes extending or + implementing the given class qualify. Note that the given class itself is + not included in this set. If required, it should be specified in a + separate option. + <p> + +<li>The <code><b>@</b></code> specifications can be used to restrict classes + and class members to the ones that are annotated with the specified + annotation types. An <i>annotationtype</i> is specified just like a + <i>classname</i>. + <p> + +<li>Fields and methods are specified much like in Java, except that method + argument lists don't contain argument names (just like in other tools + like <code>javadoc</code> and <code>javap</code>). The specifications can + also contain the following catch-all wildcards: + +<table cellspacing="10"> + +<tr><td valign="top"><code><b><init></b></code></td> +<td>matches any constructor.</td></tr> + +<tr><td valign="top"><code><b><fields></b></code></td> +<td>matches any field.</td></tr> + +<tr><td valign="top"><code><b><methods></b></code></td> +<td>matches any method.</td></tr> + +<tr><td valign="top"><code><b>*</b></code></td> +<td>matches any field or method.</td></tr> + +</table> + + Note that the above wildcards don't have return types. Only the + <code><b><init></b></code> wildcard has an argument list. + <p> + + Fields and methods may also be specified using regular expressions. Names + can contain the following wildcards: + +<table cellspacing="10"> +<tr><td valign="top"><code><b>?</b></code></td> + <td>matches any single character in a method name.</td></tr> +<tr><td valign="top"><code><b>*</b></code></td> + <td>matches any part of a method name.</td></tr> +</table> + + Types in descriptors can contain the following wildcards: + +<table cellspacing="10"> +<tr><td valign="top"><code><b>%</b></code></td> + <td>matches any primitive type ("<code>boolean</code>", "<code>int</code>", + etc, but not "<code>void</code>").</td></tr> +<tr><td valign="top"><code><b>?</b></code></td> + <td>matches any single character in a class name.</td></tr> +<tr><td valign="top"><code><b>*</b></code></td> + <td>matches any part of a class name not containing the package separator.</td></tr> +<tr><td valign="top"><code><b>**</b></code></td> + <td>matches any part of a class name, possibly containing any number of + package separators.</td></tr> +<tr><td valign="top"><code><b>***</b></code></td> + <td>matches any type (primitive or non-primitive, array or + non-array).</td></tr> +<tr><td valign="top"><code><b>...</b></code></td> + <td>matches any number of arguments of any type.</td></tr> + +</table> + + Note that the <code>?</code>, <code>*</code>, and <code>**</code> + wildcards will never match primitive types. Furthermore, only the + <code>***</code> wildcards will match array types of any dimension. For + example, "<code>** get*()</code>" matches "<code>java.lang.Object + getObject()</code>", but not "<code>float getFloat()</code>", nor + "<code>java.lang.Object[] getObjects()</code>". + <p> + +<li>Constructors can also be specified using their short class names (without + package) or using their full class names. As in the Java language, the + constructor specification has an argument list, but no return type. + <p> + +<li>The class access modifiers and class member access modifiers are typically + used to restrict wildcarded classes and class members. They specify that + the corresponding access flags have to be set for the member to match. A + preceding <code><b>!</b></code> specifies that the corresponding access + flag should be unset. + <p> + Combining multiple flags is allowed (e.g. <code>public static</code>). It + means that both access flags have to be set (e.g. <code>public</code> + <i>and</i> <code>static</code>), except when they are conflicting, in + which case at least one of them has to be set (e.g. at least + <code>public</code> + <i>or</i> <code>protected</code>). + +</ul> +<p> + +<hr> +<address> +Copyright © 2002-2009 +<a href="http://www.graphics.cornell.edu/~eric/">Eric Lafortune</a>. +</address> +</body> +</html> |