| You can find the ProGuard GUI jar in the `lib` directory of the ProGuard |
| distribution. To run the ProGuard graphical user interface, just type: |
| |
| `proguardgui [-nosplash]` \[*configuration\_file*\] |
| |
| Alternatively, the `bin` directory contains some short Linux and Windows |
| scripts containing this command. The GUI will pop up in a window. With the |
| `-nosplash` option, you can switch off the short opening animation. If you |
| have specified a ProGuard configuration file, it will be loaded. The GUI works |
| like a wizard. You can edit the configuration and execute ProGuard through a |
| few tabs: |
| |
| | | |
| |-------------------------------|-------------------------------------------------------------- |
| | [ProGuard](#proguard) | Optionally load an existing configuration file. |
| | [Input/Output](#inputoutput) | Specify the program jars and library jars. |
| | [Shrinking](#shrinking) | Specify the shrinking options. |
| | [Obfuscation](#obfuscation) | Specify the obfuscation options. |
| | [Optimization](#optimization) | Specify the optimization options. |
| | [Information](#information) | Specify some options to get information. |
| | [Process](#process) | View and save the resulting configuration, and run ProGuard. |
| |
| In addition, there is a tab to execute ReTrace interactively: |
| |
| | | |
| |---------------------|------------------------------------------------------- |
| | [ReTrace](#retrace) | Set up and run ReTrace, to de-obfuscate stack traces. |
| |
| You can freely toggle between the tabs by means of the buttons on the |
| left-hand side of the window, or by means of the **Previous** and **Next** |
| buttons at the bottom of the tabs. Tool tips briefly explain the purpose of |
| the numerous options and text fields, although a basic understanding of the |
| shrinking/optimization/obfuscation/preverification process is assumed. Please |
| refer to the [Introduction](index.md) of this manual. |
| |
| ## The ProGuard tab {: #proguard} |
| |
| The *ProGuard* tab presents a welcome message and one important button |
| at the bottom: |
| |
| | | |
| |-----------------------|----------------------------------------------------------------------- |
| | Load configuration... | opens a file chooser to load an existing ProGuard configuration file. |
| |
| If you don't want to load an existing configuration, you can just continue |
| creating a new configuration from scratch. |
| |
| ## The Input/Output tab {: #inputoutput} |
| |
| The *Input/Output* tab contains two lists, respectively to specify the program |
| jars (or aars, wars, ears, zips, apks, or directories), and the library jars |
| (or aars, wars, ears, zips, apks, or directories). |
| |
| - The list of program jars contains input entries and output entries. Input |
| entries contain the class files and resource files to be processed. Output |
| entries specify the destinations to which the processed results will be |
| written. They are preceded by arrows, to distinguish them from input |
| entries. The results of each consecutive list of input entries will be |
| written to the subsequent consecutive list of output entries. |
| - The library jars are not copied to the output jars; they contain class files |
| that are used by class files in the program jars and that are necessary for |
| correct processing. This list typically at least contains the targeted Java |
| runtime jar. |
| |
| Each of these lists can be edited by means of a couple of buttons on the |
| right-hand side: |
| |
| | | |
| |-------------------|------------------------------------------------------------------------------------------ |
| | Add input... | opens a file chooser to add an input entry to the list of program jars. |
| | Add output... | opens a file chooser to add an output entry to the list of program jars. |
| | Add... | opens a file chooser to add an entry to the list of library jars. |
| | Edit... | opens a file chooser to edit the selected entry in the list. |
| | Filter... | opens a text entry field to add or edit the filters of the selected entries in the list. |
| | Remove | removes the selected entries from the list. |
| | Move up | moves the selected entries one position up the list. |
| | Move down | moves the selected entries one position down the list. |
| | Move to libraries | moves the selected entries in the list of program jars to the list of library jars. |
| | Move to program | moves the selected entries in the list of library jars to the list of program jars. |
| |
| Filters allow to filter files based on their names. You can specify filters |
| for class file names and resource file names, for jar file names, for aar file |
| names, for war file names, for ear file names, for zip file names, and for apk |
| file names. Multiple entries in the program list only make sense when combined |
| with filters; each output file is written to the first entry with a matching |
| filter. |
| |
| Input entries that are currently not readable are colored red. |
| |
| The order of the entries in each list may matter, as the first occurrence of |
| any duplicate entries gets precedence, just as in conventional class paths. |
| |
| Corresponding configuration options: |
| |
| - [-injars](usage.md#injars) |
| - [-outjars](usage.md#outjars) |
| - [-libraryjars](usage.md#libraryjars) |
| - [*class\_path*](usage.md#classpath) |
| - [*filters*](usage.md#filters) |
| |
| ## The Shrinking tab {: #shrinking} |
| |
| The *Shrinking* tab presents a number of options that affect the shrinking |
| step. The basic options are followed by a few lists of classes and class |
| members (fields and methods) that must be protected from shrinking (and |
| implicitly from obfuscation as well). |
| |
| The fixed lists contain predefined entries that are typically useful for many |
| applications. Each of these entries can be toggled by means of a check box. |
| The text field following each entry allows to constrain the applicable classes |
| by means of a comma-separated list of wildcarded, fully-qualified class names. |
| The default is "\*", which means that all input classes of the corresponding |
| type are considered. |
| |
| For example, checking the **Applications** entry and filling in |
| "myapplications.\*\*" after it would mean: keep all classes that have main |
| methods in the "myapplications" package and all of its subpackages. |
| |
| The variable list at the bottom allows to define additional entries yourself. |
| The list can be edited by means of a couple of buttons on the right-hand side: |
| |
| | | |
| |-----------|-------------------------------------------------------- |
| | Add... | opens a window to add a new entry to the list. |
| | Edit... | opens a window to edit the selected entry in the list. |
| | Remove | removes the selected entries from the list. |
| | Move up | moves the selected entries one position up the list. |
| | Move down | moves the selected entries one position down the list. |
| |
| The interface windows allow to specify classes, fields, and methods. |
| They contain text fields and check boxes to constrain these items. They |
| have **Ok** and **Cancel** buttons to apply or to cancel the operation. |
| |
| For example, your application may be creating some classes dynamically using |
| `Class.forName`. You should then specify them here, so they are kept by their |
| original names. Press the **Add...** button to open the class window. Fill out |
| the fully-qualified class name in the **Code** text field, and press the |
| **Ok** button. Repeat this for all required classes. Wildcards can be helpful |
| to specify a large number of related classes in one go. If you want to specify |
| all implementations of a certain interface, fill out the fully qualified |
| interface name in the **Extends/implements class** instead. |
| |
| For more advanced settings, it is advisable to become familiar with ProGuard's |
| configuration options through the [Usage section](usage.md) and the [Examples |
| section](examples.md). We'll suffice with a brief overview of the three |
| dialogs provided by the GUI. |
| |
| The *keep class* dialog appears when adding or editing new special keep |
| entries. It has text fields and selections for specifying and constraining |
| classes and class members to keep. The **Advanced options** / **Basic |
| options** button at the bottom of the dialog allows to toggle showing the |
| advanced options. |
| |
| - The **Comments** text field allows to add optional comments to this entry. |
| The comments will identify the entry in the list and they will appear as |
| comments in the configuration file. |
| - The **Keep** selection allows to specify whether you want to protect the |
| specified classes and their specified class members, or just the specified |
| class members from the specified classes, or the specified classes and the |
| specified class members, if the class members are present. Note that class |
| members will only be protected if they are explicitly specified, even if |
| only by means of a wildcard. |
| - The **Allow** selection allows to specify whether you want to allow the the |
| specified classes and their specified class members to be shrunk, optimized |
| and/or obfuscated. |
| - The **Access** selections allows to specify constraints on the class or |
| classes, based on their access modifiers. |
| - The **Annotation** text field takes the fully-qualified name of an |
| annotation that is required for matching classes. The annotation name can |
| contain wildcards. This is an advanced option for defining *keep* |
| annotations. |
| - The **Class** text field takes the fully-qualified name of the class or |
| classes. The class name can contain wildcards. |
| - The **Annotation** text field takes the fully-qualified name of an |
| annotation that is required for the class or interface that the above class |
| must extend. The annotation name can contain wildcards. This is an advanced |
| option for defining *keep* annotations. |
| - The **Extends/implements class** text field takes the fully-qualified name |
| of the class or interface that the above classes must extend. |
| - The **Class members** list allows to specify a list of fields and methods to |
| keep. It can be edited by means of a list of buttons on the right-hand side. |
| |
| The *keep field* dialog appears when adding or editing fields within the above |
| dialog. It has text fields and selections for specifying and constraining |
| fields to keep. Again, the **Advanced options** / **Basic options** button at |
| the bottom of the dialog allows to toggle showing the advanced options. |
| |
| - The **Access** selections allows to specify constraints on the field or |
| fields, based on their access modifiers. |
| - The **Annotation** text field takes the fully-qualified name of an |
| annotation that is required for matching fields. The annotation name can |
| contain wildcards. This is an advanced option for defining *keep* |
| annotations. |
| - The **Return type** text field takes the fully-qualified type of the field |
| or fields. The type can contain wildcards. |
| - The **Name** text field takes the name of the field or fields. The field |
| name can contain wildcards. |
| |
| Similarly, the *keep method* dialog appears when adding or editing methods |
| within the keep class dialog. It has text fields and selections for specifying |
| and constraining methods to keep. Again, the **Advanced options** / **Basic |
| options** button at the bottom of the dialog allows to toggle showing the |
| advanced options. |
| |
| - The **Access** selections allows to specify constraints on the method or |
| methods, based on their access modifiers. |
| - The **Annotation** text field takes the fully-qualified name of an |
| annotation that is required for matching methods. The annotation name can |
| contain wildcards. This is an advanced option for defining *keep* |
| annotations. |
| - The **Return type** text field takes the fully-qualified type of the method |
| or methods. The type can contain wildcards. |
| - The **Name** text field takes the name of the method or methods. The method |
| name can contain wildcards. |
| - The **Arguments** text field takes the comma-separated list of |
| fully-qualified method arguments. Each of these arguments can contain |
| wildcards. |
| |
| Corresponding configuration options: |
| |
| - [-dontshrink](usage.md#dontshrink) |
| - [-printusage](usage.md#printusage) |
| - [-keep](usage.md#keep) |
| - [-keepclassmembers](usage.md#keepclassmembers) |
| - [-keepclasseswithmembers](usage.md#keepclasseswithmembers) |
| |
| ## The Obfuscation tab {: #obfuscation} |
| |
| The *Obfuscation* tab presents a number of options that affect the obfuscation |
| step. The basic options are followed by a few lists of classes and class |
| members (fields and methods) that must be protected from obfuscation (but not |
| necessarily from shrinking). |
| |
| The lists are manipulated in the same way as in the [Shrinking |
| tab](#shrinking). |
| |
| Corresponding configuration options: |
| |
| - [-dontobfuscate](usage.md#dontobfuscate) |
| - [-printmapping](usage.md#printmapping) |
| - [-applymapping](usage.md#applymapping) |
| - [-obfuscationdictionary](usage.md#obfuscationdictionary) |
| - [-classobfuscationdictionary](usage.md#classobfuscationdictionary) |
| - [-packageobfuscationdictionary](usage.md#packageobfuscationdictionary) |
| - [-overloadaggressively](usage.md#overloadaggressively) |
| - [-useuniqueclassmembernames](usage.md#useuniqueclassmembernames) |
| - [-dontusemixedcaseclassnames](usage.md#dontusemixedcaseclassnames) |
| - [-keeppackagenames](usage.md#keeppackagenames) |
| - [-flattenpackagehierarchy](usage.md#flattenpackagehierarchy) |
| - [-repackageclasses](usage.md#repackageclasses) |
| - [-keepattributes](usage.md#keepattributes) |
| - [-keepparameternames](usage.md#keepparameternames) |
| - [-renamesourcefileattribute](usage.md#renamesourcefileattribute) |
| - [-adaptclassstrings](usage.md#adaptclassstrings) |
| - [-adaptresourcefilenames](usage.md#adaptresourcefilenames) |
| - [-adaptresourcefilecontents](usage.md#adaptresourcefilecontents) |
| - [-keepnames](usage.md#keepnames) |
| - [-keepclassmembernames](usage.md#keepclassmembernames) |
| - [-keepclasseswithmembernames](usage.md#keepclasseswithmembernames) |
| - [*class\_specification*](usage.md#classspecification) |
| |
| ## The Optimization tab {: #optimization} |
| |
| The *Optimization* tab presents a number of options that affect the |
| optimization step. The basic options are followed by a few lists of class |
| method calls that can be removed if ProGuard can determine that their results |
| are not being used. |
| |
| The lists are manipulated in much the same way as in the [Shrinking |
| tab](#shrinking). |
| |
| Corresponding configuration options: |
| |
| - [-dontoptimize](usage.md#dontoptimize) |
| - [-optimizations](usage.md#optimizations) |
| - [-optimizationpasses](usage.md#optimizationpasses) |
| - [-allowaccessmodification](usage.md#allowaccessmodification) |
| - [-mergeinterfacesaggressively](usage.md#mergeinterfacesaggressively) |
| - [-assumenosideeffects](usage.md#assumenosideeffects) |
| - [*class\_specification*](usage.md#classspecification) |
| |
| ## The Information tab {: #information} |
| |
| The *Information* tab presents a number of options for preverification and |
| targeting, and for the information that ProGuard returns when processing your |
| code. The bottom list allows you to query ProGuard about why given classes and |
| class members are being kept in the shrinking step. |
| |
| Corresponding configuration options: |
| |
| - [-dontpreverify](usage.md#dontpreverify) |
| - [-microedition](usage.md#microedition) |
| - [-target](usage.md#target) |
| - [-verbose](usage.md#verbose) |
| - [-dontnote](usage.md#dontnote) |
| - [-dontwarn](usage.md#dontwarn) |
| - [-ignorewarnings](usage.md#ignorewarnings) |
| - [-skipnonpubliclibraryclasses](usage.md#skipnonpubliclibraryclasses) |
| - [-dontskipnonpubliclibraryclasses](usage.md#dontskipnonpubliclibraryclasses) |
| - [-dontskipnonpubliclibraryclassmembers](usage.md#dontskipnonpubliclibraryclassmembers) |
| - [-keepdirectories](usage.md#keepdirectories) |
| - [-forceprocessing](usage.md#forceprocessing) |
| - [-printseeds](usage.md#printseeds) |
| - [-printconfiguration](usage.md#printconfiguration) |
| - [-dump](usage.md#dump) |
| - [-whyareyoukeeping](usage.md#whyareyoukeeping) |
| |
| ## The Process tab {: #process} |
| |
| The *Process* tab has an output console for displaying the configuration and |
| the messages while processing. There are three important buttons at the |
| bottom: |
| |
| | | |
| |-----------------------|------------------------------------------------------------------ |
| | View configuration | displays the current ProGuard configuration in the console. |
| | Save configuration... | opens a file chooser to save the current ProGuard configuration. |
| | Process! | executes ProGuard with the current configuration. |
| |
| ## The ReTrace tab {: #retrace} |
| |
| The *ReTrace* tab has a panel with a few settings, an input text area for the |
| obfuscated stack trace, and an output console to view the de-obfuscated stack |
| trace: |
| |
| - The **Verbose** check box in the settings panel allows to toggle between |
| normal mode and verbose mode. |
| - The **Mapping file** text field takes the name of the required mapping file |
| that ProGuard wrote while processing the original code. The file name can be |
| entered manually or by means of the **Browse...** button that opens a file |
| chooser. |
| - The **Obfuscated stack trace** text area allows to enter the stack trace, |
| typically by copying and pasting it from elsewhere. Alternatively, it can be |
| loaded from a file by means of the load button below. |
| |
| There are two buttons at the bottom: |
| |
| | | |
| |---------------------|--------------------------------------------------------- |
| | Load stack trace... | opens a file chooser to load an obfuscated stack trace. |
| | ReTrace! | executes ReTrace with the current settings. |