Home | History | Annotate | Download | only in manual
      1 <!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
      2 <html>
      3 <head>
      4 <meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
      5 <meta http-equiv="content-style-type" content="text/css">
      6 <link rel="stylesheet" type="text/css" href="style.css">
      7 <title>Attributes</title>
      8 </head>
      9 <body>
     10 
     11 <script type="text/javascript" language="JavaScript">
     12 <!--
     13 if (window.self==window.top)
     14   document.write('<a class="largebutton" target="_top" href="../index.html#manual/attributes.html">ProGuard index</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/dexguard">DexGuard</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/">Saikoa</a> <a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>')
     15 //-->
     16 </script>
     17 <noscript>
     18 <a class="largebutton" target="_top"  href="../index.html#manual/attributes.html">ProGuard index</a>
     19 <a class="largebutton" target="_top"  href="http://www.saikoa.com/dexguard">DexGuard</a>
     20 <a class="largebutton" target="_top"  href="http://www.saikoa.com/">Saikoa</a>
     21 <a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>
     22 </noscript>
     23 
     24 <h2>Attributes</h2>
     25 
     26 Class files essentially define classes, their fields, and their methods. A lot
     27 of essential and non-essential data are attached to these classes, fields, and
     28 methods as <i>attributes</i>. For instance, attributes can contain bytecode,
     29 source file names, line number tables, etc.
     30 <p>
     31 
     32 ProGuard's obfuscation step removes attributes that are generally not
     33 necessary for executing the code. With
     34 the <a href="usage.html#keepattributes"><code>-keepattributes</code></a>
     35 option, you can specify a filter for attributes that you do want to keep, for
     36 instance, if your code accesses them through reflection or if you want to
     37 preserve some compilation or debugging information. The filter works like
     38 any <a href="usage.html#filters">filter</a> in ProGuard.
     39 <p>
     40 
     41 The following wildcards are supported:
     42 
     43 <table cellspacing="10">
     44 <tr><td valign="top"><code><b>?</b></code></td>
     45     <td>matches any single character in an attribute name.</td></tr>
     46 <tr><td valign="top"><code><b>*</b></code></td>
     47     <td>matches any part of an attribute name.</td></tr>
     48 </table>
     49 
     50 An attribute name that is preceded by an exclamation mark '<b>!</b>' is
     51 <i>excluded</i> from further attempts to match with <i>subsequent</i>
     52 attribute names in the filter. Make sure to specify filters correctly, since
     53 they are not checked for potential typos.
     54 <p>
     55 
     56 For example, the following setting preserves the optional attributes that are
     57 typically necessary when processing code that is intended to be used as a
     58 library:
     59 <pre>
     60 -keepattributes Exceptions,InnerClasses,Signature,Deprecated,
     61                 SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
     62 </pre>
     63 <p>
     64 
     65 The Java bytecode specifications currently specify the following list of
     66 attributes.
     67 
     68 <h3>Optional attributes</h3>
     69 
     70 ProGuard's obfuscation step by default discards the following optional
     71 attributes. You can keep them with
     72 the <a href="usage.html#keepattributes"><code>-keepattributes</code></a>
     73 option.
     74 
     75 <dl>
     76 <dt><code><b>SourceFile</b></code></dt>
     77 <dd>Specifies the name of the source file from which the class file was
     78     compiled. If present, this name is reported in stack traces.</dd>
     79 
     80 <dt><div>(J++ extension)</div>
     81     <code><b>SourceDir</b></code></dt>
     82 <dd>Specifies the name of the source directory from which the class file was
     83     compiled.</dd>
     84 
     85 <dt><code><b>InnerClasses</b></code></dt>
     86 <dd>Specifies the relationship between a class and its inner classes and outer
     87     classes. Other than this and the naming convention with a '$' separator
     88     between the names of inner classes and outer classes, inner classes are
     89     just like ordinary classes. Compilers may need this information to find
     90     classes referenced in a compiled library. Code may access this information
     91     by reflection, for instance to derive the simple name of the class.</dd>
     92 
     93 <dt><div>(Java 5 or higher)</div>
     94     <code><b>EnclosingMethod</b></code></dt>
     95 <dd>Specifies the method in which the class was defined. Compilers may need
     96     this information to find classes referenced in a compiled library. Code
     97     may access this information by reflection, for instance to derive the
     98     simple name of the class.</dd>
     99 
    100 <dt><code><b>Deprecated</b></code></dt>
    101 <dd>Indicates that the class, field, or method is deprecated.</dd>
    102 
    103 <dt><code><b>Synthetic</b></code></dt>
    104 <dd>Indicates that the class, field, or method was generated by the
    105     compiler.</dd>
    106 
    107 <dt><div>(Java 5 or higher)</div>
    108     <code><b>Signature</b></code></dt>
    109 <dd>Specifies the generic signature of the class, field, or method. Compilers
    110     may need this information to properly compile classes that use generic
    111     types from compiled libraries. Code may access this signature by
    112     reflection.</dd>
    113 
    114 <dt><div>(Java 8 or higher)</div>
    115     <code><b>MethodParameters</b></code></dt>
    116 <dd>Specifies the names and access flags of the parameters of the method. Code
    117     may access this information by reflection.</dd>
    118 
    119 <dt><code><b>Exceptions</b></code></dt>
    120 <dd>Specifies the exceptions that a method may throw. Compilers may use this
    121     information to enforce catching them.</dd>
    122 
    123 <dt><code><b>LineNumberTable</b></code></dt>
    124 <dd>Specifies the line numbers of the method. If present, these line numbers
    125     are reported in stack traces.</dd>
    126 
    127 <dt><code><b>LocalVariableTable</b></code></dt>
    128 <dd>Specifies the names and types of local variables of the method. If present,
    129     some IDEs may use this information for helping with auto-completion.</dd>
    130 
    131 <dt><div>(Java 5 or higher)</div>
    132     <code><b>LocalVariableTypeTable</b></code></dt>
    133 <dd>Specifies the names and generic types of local variables of the method. If
    134     present, some IDEs may use this information for helping with
    135     auto-completion.</dd>
    136 
    137 <dt><div>(Java 5 or higher)</div>
    138     <code><b>RuntimeVisibleAnnotations</b></code></dt>
    139 <dd>Specifies the annotations that are visible at run-time, for classes,
    140     fields, and methods. Compilers and annotation processors may use these
    141     annotations. Code may access them by reflection.</dd>
    142 
    143 <dt><div>(Java 5 or higher)</div>
    144     <code><b>RuntimeInvisibleAnnotations</b></code></dt>
    145 <dd>Specifies the annotations that are visible at compile-time, for classes,
    146     fields, and methods. Compilers and annotation processors may use these
    147     annotations.</dd>
    148 
    149 <dt><div>(Java 5 or higher)</div>
    150     <code><b>RuntimeVisibleParameterAnnotations</b></code></dt>
    151 <dd>Specifies the annotations that are visible at run-time, for method
    152     parameters. Compilers and annotation processors may use these
    153     annotations. Code may access them by reflection.</dd>
    154 
    155 <dt><div>(Java 5 or higher)</div>
    156     <code><b>RuntimeInvisibleParameterAnnotations</b></code></dt>
    157 <dd>Specifies the annotations that are visible at compile-time, for method
    158     parameters. Compilers and annotation processors may use these
    159     annotations.</dd>
    160 
    161 <dt><div>(Java 8 or higher)</div>
    162     <code><b>RuntimeVisibleTypeAnnotations</b></code></dt>
    163 <dd>Specifies the annotations that are visible at run-time, for generic types,
    164     instructions, etc. Compilers and annotation processors may use these
    165     annotations. Code may access them by reflection.</dd>
    166 
    167 <dt><div>(Java 8 or higher)</div>
    168     <code><b>RuntimeInvisibleTypeAnnotations</b></code></dt>
    169 <dd>Specifies the annotations that are visible at compile-time, for generic
    170     types, instructions, etc. Compilers and annotation processors may use
    171     these annotations.</dd>
    172 
    173 <dt><div>(Java 5 or higher)</div>
    174     <code><b>AnnotationDefault</b></code></dt>
    175 <dd>Specifies a default value for an annotation.</dd>
    176 
    177 </dl>
    178 <p>
    179 
    180 <h3>Essential attributes</h3>
    181 
    182 ProGuard automatically keeps the following essential attributes, processing
    183 them as necessary. We're listing them for the sake of completeness.
    184 
    185 <dl>
    186 <dt><code><b>ConstantValue</b></code></dt>
    187 <dd>Specifies a constant integer, float, class, string, etc.</dd>
    188 
    189 <dt><code><b>Code</b></code></dt>
    190 <dd>Specifies the actual bytecode of a method.</dd>
    191 
    192 <dt><div>(Java Micro Edition)</div>
    193     <code><b>StackMap</b></code></dt>
    194 <dd>Provides preverification information. The Java Virtual Machine can use
    195     this information to speed up the verification step when loading a
    196     class.</dd>
    197 
    198 <dt><div>(Java 6 or higher)</div>
    199     <code><b>StackMapTable</b></code></dt>
    200 <dd>Provides preverification information. The Java Virtual Machine can use
    201     this information to speed up the verification step when loading a
    202     class.</dd>
    203 
    204 <dt><div>(Java 7 or higher)</div>
    205     <code><b>BootstrapMethods</b></code></dt>
    206 <dd>Specifies the methods to bootstrap dynamic method invocations.</dd>
    207 
    208 </dl>
    209 <p>
    210 
    211 <hr />
    212 <address>
    213 Copyright &copy; 2002-2014
    214 <a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a> @ <a target="top" href="http://www.saikoa.com/">Saikoa</a>.
    215 </address>
    216 </body>
    217 </html>
    218