# ProGuard Reference Card

## Usage

`java -jar proguard.jar` options ...

Typically:

`java -jar proguard.jar @myconfig.pro`

## Options

`@`filename | Short for '`-include` filename'.
`-include` filename | Read configuration options from the given file.
`-basedirectory` directoryname | Specifies the base directory for subsequent relative file names.
`-injars` class_path | Specifies the program jars (or wars, ears, zips, or directories).
`-outjars` class_path | Specifies the names of the output jars (or wars, ears, zips, or directories).
`-libraryjars` class_path | Specifies the library jars (or wars, ears, zips, or directories).
`-skipnonpubliclibraryclasses` | Ignore non-public library classes.
`-dontskipnonpubliclibraryclasses` | Don't ignore non-public library classes (the default).
`-dontskipnonpubliclibraryclassmembers` | Don't ignore package visible library class members.
`-keepdirectories` [directory_filter] | Keep the specified directories in the output jars (or wars, ears, zips, or directories).
`-target` version | Set the given version number in the processed classes.
`-forceprocessing` | Process the input, even if the output seems up to date.
`-keep` [,modifier,...] class_specification | Preserve the specified classes and class members.
`-keepclassmembers` [,modifier,...] class_specification | Preserve the specified class members, if their classes are preserved as well.
`-keepclasseswithmembers` [,modifier,...] class_specification | Preserve the specified classes and class members, if all of the specified class members are present.
`-keepnames` class_specification | Preserve the names of the specified classes and class members (if they aren't removed in the shrinking step).
`-keepclassmembernames` class_specification | Preserve the names of the specified class members (if they aren't removed in the shrinking step).
`-keepclasseswithmembernames` class_specification | Preserve the names of the specified classes and class members, if all of the specified class members are present (after the shrinking step).
`-printseeds` [filename] | List classes and class members matched by the various `-keep` options, to the standard output or to the given file.
`-dontshrink` | Don't shrink the input class files.
`-printusage` [filename] | List dead code of the input class files, to the standard output or to the given file.
`-whyareyoukeeping` class_specification | Print details on why the given classes and class members are being kept in the shrinking step.
`-dontoptimize` | Don't optimize the input class files.
`-optimizations` optimization_filter | The optimizations to be enabled and disabled.
`-optimizationpasses` n | The number of optimization passes to be performed.
`-assumenosideeffects` class_specification | Assume that the specified methods don't have any side effects, while optimizing.
`-allowaccessmodification` | Allow the access modifiers of classes and class members to be modified, while optimizing.
`-mergeinterfacesaggressively` | Allow any interfaces to be merged, while optimizing.
`-dontobfuscate` | Don't obfuscate the input class files.
`-printmapping` [filename] | Print the mapping from old names to new names for classes and class members that have been renamed, to the standard output or to the given file.
`-applymapping` filename | Reuse the given mapping, for incremental obfuscation.
`-obfuscationdictionary` filename | Use the words in the given text file as obfuscated field names and method names.
`-classobfuscationdictionary` filename | Use the words in the given text file as obfuscated class names.
`-packageobfuscationdictionary` filename | Use the words in the given text file as obfuscated package names.
`-overloadaggressively` | Apply aggressive overloading while obfuscating.
`-useuniqueclassmembernames` | Ensure uniform obfuscated class member names for subsequent incremental obfuscation.
`-dontusemixedcaseclassnames` | Don't generate mixed-case class names while obfuscating.
`-keeppackagenames` [package_filter] | Keep the specified package names from being obfuscated.
`-flattenpackagehierarchy` [package_name] | Repackage all packages that are renamed into the single given parent package.
`-repackageclasses` [package_name] | Repackage all class files that are renamed into the single given package.
`-keepattributes` [attribute_filter] | Preserve the given optional attributes; typically `Exceptions`, `InnerClasses`, `Signature`, `Deprecated`, `SourceFile`, `SourceDir`, `LineNumberTable`, `LocalVariableTable`, `LocalVariableTypeTable`, `Synthetic`, `EnclosingMethod`, and `*Annotation*`.
`-keepparameternames` | Keep the parameter names and types of methods that are kept.
`-renamesourcefileattribute` [string] | Put the given constant string in the `SourceFile` attributes.
`-adaptclassstrings` [class_filter] | Adapt string constants in the specified classes, based on the obfuscated names of any corresponding classes.
`-adaptresourcefilenames` [file_filter] | Rename the specified resource files, based on the obfuscated names of the corresponding class files.
`-adaptresourcefilecontents` [file_filter] | Update the contents of the specified resource files, based on the obfuscated names of the processed classes.
`-dontpreverify` | Don't preverify the processed class files.
`-microedition` | Target the processed class files at Java Micro Edition.
`-verbose` | Write out some more information during processing.
`-dontnote` [class_filter] | Don't print notes about potential mistakes or omissions in the configuration.
`-dontwarn` [class_filter] | Don't warn about unresolved references at all.
`-ignorewarnings` | Print warnings about unresolved references, but continue processing anyhow.
`-printconfiguration` [filename] | Write out the entire configuration in traditional ProGuard style, to the standard output or to the given file.
`-dump` [filename] | Write out the internal structure of the processed class files, to the standard output or to the given file.

Notes:

- class_path is a list of jars, wars, ears, zips, and directories, with optional filters, separated by path separators.
- filename can contain Java system properties delimited by '<' and '>'.
- If filename contains special characters, the entire name should be quoted with single or double quotes.

## Overview of `Keep` Options

Keep | From being removed or renamed | From being renamed
Classes and class members | `-keep` | `-keepnames`
Class members only | `-keepclassmembers` | `-keepclassmembernames`
Classes and class members, if class members present | `-keepclasseswithmembers` | `-keepclasseswithmembernames`

## Keep Option Modifiers

`includedescriptorclasses` | Also keep any classes in the descriptors of specified fields and methods.
`allowshrinking` | Allow the specified entry points to be removed in the shrinking step.
`allowoptimization` | Allow the specified entry points to be modified in the optimization step.
`allowobfuscation` | Allow the specified entry points to be renamed in the obfuscation step.

## Class Specifications

    [@annotationtype] [[!]public|final|abstract ...] [!]interface|class classname
        [extends|implements [@annotationtype] classname]
    [{
        [@annotationtype] [[!]public|private|protected|static|volatile|transient ...] <fields> |
                                                                          (fieldtype fieldname);
        [@annotationtype] [[!]public|private|protected|static|synchronized|native|abstract|strictfp ...] <methods> |
                                                                                               <init>(argumenttype,...) |
                                                                                               classname(argumenttype,...) |
                                                                                               (returntype methodname(argumenttype,...));
        [@annotationtype] [[!]public|private|protected|static ... ] *;
        ...
    }]

Notes:

- Class names must always be fully qualified, i.e. including their package names.
- Types in classname, annotationtype, returntype, and argumenttype can contain wildcards: '`?`' for a single character, '`*`' for any number of characters (but not the package separator), '`**`' for any number of (any) characters, '`%`' for any primitive type, '`***`' for any type, and '`...`' for any number of arguments.
- fieldname and methodname can contain wildcards as well: '`?`' for a single character and '`*`' for any number of characters.