Attributes

Class files essentially define classes, their fields, and their methods. A lot of essential and non-essential data are attached to these classes, fields, and methods as attributes. For instance, attributes can contain bytecode, source file names, line number tables, etc.

ProGuard's obfuscation step removes attributes that are generally not necessary for executing the code. With the -keepattributes option, you can specify a filter for attributes that you do want to keep, for instance, if your code accesses them through reflection or if you want to preserve some compilation or debugging information. The filter works like any filter in ProGuard.

The following wildcards are supported:
? matches any single character in an attribute name.
* matches any part of an attribute name.
An attribute name that is preceded by an exclamation mark '!' is excluded from further attempts to match with subsequent attribute names in the filter. Make sure to specify filters correctly, since they are not checked for potential typos.

For example, the following setting preserves the optional attributes that are typically necessary when processing code that is intended to be used as a library:

-keepattributes Exceptions,InnerClasses,Signature,Deprecated,
                SourceFile,LineNumberTable,*Annotation*,EnclosingMethod

The Java bytecode specifications currently specify the following list of attributes.

Optional attributes

ProGuard's obfuscation step by default discards the following optional attributes. You can keep them with the -keepattributes option.
SourceFile
Specifies the name of the source file from which the class file was compiled. If present, this name is reported in stack traces.
(J++ extension)
SourceDir
Specifies the name of the source directory from which the class file was compiled.
InnerClasses
Specifies the relationship between a class and its inner classes and outer classes. Other than this and the naming convention with a '$' separator between the names of inner classes and outer classes, inner classes are just like ordinary classes. Compilers may need this information to find classes referenced in a compiled library. Code may access this information by reflection, for instance to derive the simple name of the class.
(Java 5 or higher)
EnclosingMethod
Specifies the method in which the class was defined. Compilers may need this information to find classes referenced in a compiled library. Code may access this information by reflection, for instance to derive the simple name of the class.
Deprecated
Indicates that the class, field, or method is deprecated.
Synthetic
Indicates that the class, field, or method was generated by the compiler.
(Java 5 or higher)
Signature
Specifies the generic signature of the class, field, or method. Compilers may need this information to properly compile classes that use generic types from compiled libraries. Code may access this signature by reflection.
(Java 8 or higher)
MethodParameters
Specifies the names and access flags of the parameters of the method. Code may access this information by reflection.
Exceptions
Specifies the exceptions that a method may throw. Compilers may use this information to enforce catching them.
LineNumberTable
Specifies the line numbers of the method. If present, these line numbers are reported in stack traces.
LocalVariableTable
Specifies the names and types of local variables of the method. If present, some IDEs may use this information for helping with auto-completion.
(Java 5 or higher)
LocalVariableTypeTable
Specifies the names and generic types of local variables of the method. If present, some IDEs may use this information for helping with auto-completion.
(Java 5 or higher)
RuntimeVisibleAnnotations
Specifies the annotations that are visible at run-time, for classes, fields, and methods. Compilers and annotation processors may use these annotations. Code may access them by reflection.
(Java 5 or higher)
RuntimeInvisibleAnnotations
Specifies the annotations that are visible at compile-time, for classes, fields, and methods. Compilers and annotation processors may use these annotations.
(Java 5 or higher)
RuntimeVisibleParameterAnnotations
Specifies the annotations that are visible at run-time, for method parameters. Compilers and annotation processors may use these annotations. Code may access them by reflection.
(Java 5 or higher)
RuntimeInvisibleParameterAnnotations
Specifies the annotations that are visible at compile-time, for method parameters. Compilers and annotation processors may use these annotations.
(Java 8 or higher)
RuntimeVisibleTypeAnnotations
Specifies the annotations that are visible at run-time, for generic types, instructions, etc. Compilers and annotation processors may use these annotations. Code may access them by reflection.
(Java 8 or higher)
RuntimeInvisibleTypeAnnotations
Specifies the annotations that are visible at compile-time, for generic types, instructions, etc. Compilers and annotation processors may use these annotations.
(Java 5 or higher)
AnnotationDefault
Specifies a default value for an annotation.

Essential attributes

ProGuard automatically keeps the following essential attributes, processing them as necessary. We're listing them for the sake of completeness.
ConstantValue
Specifies a constant integer, float, class, string, etc.
Code
Specifies the actual bytecode of a method.
(Java Micro Edition)
StackMap
Provides preverification information. The Java Virtual Machine can use this information to speed up the verification step when loading a class.
(Java 6 or higher)
StackMapTable
Provides preverification information. The Java Virtual Machine can use this information to speed up the verification step when loading a class.
(Java 7 or higher)
BootstrapMethods
Specifies the methods to bootstrap dynamic method invocations.


Copyright © 2002-2014 Eric Lafortune @ Saikoa.