ProGuard manual

    Usage

    OS Command
    Windows: proguard options ...
    Linux/Mac: proguard.sh options ...

    Typically:

    OS Command
    Windows: proguard @myconfig.pro
    Linux/Mac: proguard.sh @myconfig.pro

    Options

    Option Meaning
    @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 apks, aabs, aars, wars, ears, jmods, zips, or directories).
    -outjars class_path Specifies the names of the output jars (or apks, aabs, aars, wars, ears, jmods, zips, or directories).
    -libraryjars class_path Specifies the library jars (or apks, aabs, aars, wars, ears, jmods, 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 deprecated 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).
    -if class_specification Specify classes and class members that must be present to activate the subsequent keep option.
    -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.
    -assumenoexternalsideeffects class_specification Assume that the specified methods don't have any external side effects, while optimizing.
    -assumenoescapingparameters class_specification Assume that the specified methods don't let any reference parameters escape to the heap, while optimizing.
    -assumenoexternalreturnvalues class_specification Assume that the specified methods don't return any external reference values, while optimizing.
    -assumevalues class_specification Assume fixed values or ranges of values for primitive fields and methods, 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.
    -keepkotlinmetadata deprecated Keep and adapt Kotlin metadata.
    -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.
    -android Target the processed class files at Android.
    -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.
    -addconfigurationdebugging Instrument the processed code with debugging statements that print out suggestions for missing ProGuard configuration.
    -optimizeaggressively Enables more aggressive assumptions during optimization

    Notes:

    • class_path is a list of jars, apks, aabs, aars, wars, ears, jmods, 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

    The ProGuard Playground is a useful tool to help you further tweak the keep rules.

    Keep Option Modifiers

    Modifier Meaning
    includedescriptorclasses Also keep any classes in the descriptors of specified fields and methods.
    includecode Also keep the code of the specified methods unchanged.
    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|enum classname
        [extends|implements [@annotationtype] classname]
    [{
        [@annotationtype]
        [[!]public|private|protected|static|volatile|transient ...]
        <fields> | (fieldtype fieldname [= values]);
    
        [@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, '...' for any number of arguments, and '<n>' for the n'th matched wildcard in the same option.
    • fieldname and methodname can contain wildcards as well: '?' for a single character and '*' for any number of characters.