<!doctype html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<meta http-equiv="content-style-type" content="text/css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>ProGuard GUI</title>
</head>
<body>

<h2>Graphical User Interface</h2>

You can find the ProGuard GUI jar in the <code>lib</code> directory of the
ProGuard distribution. To run the ProGuard graphical user interface, just type:
<p class="code">
<code><b>java -jar proguardgui.jar</b> [-nosplash] </code>[<i>configuration_file</i>]
</p>
The GUI will pop up in a window. With the <code>-nosplash</code> 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:
<p>

<table cellspacing="5" cellpadding="5">
<tr><td class="button"><a href="#proguard">ProGuard</a></td>
    <td>Optionally load an existing configuration file.</td></tr>
<tr><td class="button"><a href="#inputoutput">Input/Output</a></td>
    <td>Specify the program jars and library jars.</td></tr>
<tr><td class="button"><a href="#shrinking">Shrinking</a></td>
    <td>Specify the shrinking options.</td></tr>
<tr><td class="button"><a href="#obfuscation">Obfuscation</a></td>
    <td>Specify the obfuscation options.</td></tr>
<tr><td class="button"><a href="#optimization">Optimization</a></td>
    <td>Specify the optimization options.</td></tr>
<tr><td class="button"><a href="#information">Information</a></td>
    <td>Specify some options to get information.</td></tr>
<tr><td class="button"><a href="#process">Process</a></td>
    <td>View and save the resulting configuration, and run ProGuard.</td></tr>
</table>
<p>

In addition, there is a tab to execute ReTrace interactively:
<p>

<table cellspacing="5" cellpadding="5">
<tr><td class="button"><a href="#retrace">ReTrace</a></td>
    <td>Set up and run ReTrace, to de-obfuscate stack traces.</td></tr>
</table>
<p>

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 <b>Previous</b> and
<b>Next</b> 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 <a
href="introduction.html">Introduction</a> of this manual.
<p>

<a name="proguard">&nbsp;</a>
<h2>The ProGuard Tab</h2>

The <i>ProGuard</i> tab presents a welcome message and one important button at
the bottom:
<p>

<table cellspacing="5" cellpadding="5">
<tr><td class="button">Load configuration...</td>
    <td>opens a file chooser to load an existing ProGuard configuration
    file.</td></tr>
</table>
<p>

If you don't want to load an existing configuration, you can just continue
creating a new configuration from scratch.
<p>

<a name="inputoutput">&nbsp;</a>
<h2>The Input/Output Tab</h2>

The <i>Input/Output</i> tab contains two lists, respectively to specify the
program jars (or wars, ears, zips, or directories), and the library jars (or
wars, ears, zips, or directories).

<ul>
<li>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.

<li>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.
</ul>
<p>

Each of these lists can be edited by means of a couple of buttons on the
right-hand side:
<p>

<table cellspacing="5" cellpadding="5">
<tr><td class="button">Add input...</td> <td>opens a file chooser to add an
    input entry to the list of program jars.</td></tr>
<tr><td class="button">Add output...</td> <td>opens a file chooser to add an
    output entry to the list of program jars.</td></tr>
<tr><td class="button">Add...</td>
    <td>opens a file chooser to add an entry to the list of library
    jars.</td></tr>
<tr><td class="button">Edit...</td>
    <td>opens a file chooser to edit the selected entry in the list.</td></tr>
<tr><td class="button">Filter...</td>
    <td>opens a text entry field to add or edit the filters of the selected
    entries in the list.</td></tr>
<tr><td class="button">Remove</td>
    <td>removes the selected entries from the list.</td></tr>
<tr><td class="button">Move up</td>
    <td>moves the selected entries one position up the list.</td></tr>
<tr><td class="button">Move down</td>
    <td>moves the selected entries one position down the list.</td></tr>
<tr><td class="button">Move to libraries</td>
    <td>moves the selected entries in the list of program jars to the list of
    library jars.</td></tr>
<tr><td class="button">Move to program</td>
    <td>moves the selected entries in the list of library jars to the list of
    program jars.</td></tr>
</table>
<p>

Filters allow to filter files based on their names. One can specify filters
for class file names and resource file names, for jar file names, for war file
names, for ear file names, and for zip 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.
<p>

Input entries that are currently not readable are colored red.
<p>

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.
<p>

Corresponding configuration options:
<ul type="none">
<li>-<a href="usage.html#injars">injars</a>
<li>-<a href="usage.html#outjars">outjars</a>
<li>-<a href="usage.html#libraryjars">libraryjars</a>
<li><a href="usage.html#classpath"><i>class_path</i></a>
<li><a href="usage.html#filters"><i>filters</i></a>
</ul>
<p>

<a name="shrinking">&nbsp;</a>
<h2>The Shrinking Tab</h2>

The <i>Shrinking</i> 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).
<p>

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.
<p>

For example, checking the <b>Applications</b> 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.
<p>

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:
<p>

<table cellspacing="5" cellpadding="5">
<tr><td class="button">Add...</td>
    <td>opens a window to add a new entry to the list.</td></tr>
<tr><td class="button">Edit...</td>
    <td>opens a window to edit the selected entry in the list.</td></tr>
<tr><td class="button">Remove</td>
    <td>removes the selected entries from the list.</td></tr>
<tr><td class="button">Move up</td>
    <td>moves the selected entries one position up the list.</td></tr>
<tr><td class="button">Move down</td>
    <td>moves the selected entries one position down the list.</td></tr>
</table>
<p>

The interface windows allow to specify classes, fields, and methods. They
contain text fields and check boxes to constrain these items. They have
<b>Ok</b> and <b>Cancel</b> buttons to apply or to cancel the operation.
<p>

For example, your application may be creating some classes dynamically using
<code>Class.forName</code>. You should then specify them here, so they are kept
by their original names. Press the <b>Add...</b> button to open the class
window. Fill out the fully-qualified class name in the <b>Code</b> text field,
and press the <b>Ok</b> 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 <b>Extends/implements class</b> instead.
<p>

For more advanced settings, it is advisable to become familiar with ProGuard's
configuration options through the <a href="usage.html">Usage section</a> and
the <a href="examples.html">Examples section</a>.  We'll suffice with a brief
overview of the three dialogs provided by the GUI.
<p>

The <i>keep class</i> 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 <b>Advanced options</b> / <b>Basic
options</b> button at the bottom of the dialog allows to toggle showing the
advanced options.

<ul>
<li>The <b>Comments</b> 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.

<li>The <b>Keep</b> 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.

<li>The <b>Allow</b> 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.

<li>The <b>Access</b> selections allows to specify constraints on the class or
    classes, based on their access modifiers.

<li>The <b>Annotation</b> 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 <i>keep</i>
    annotations.

<li>The <b>Class</b> text field takes the fully-qualified name of the class or
    classes. The class name can contain wildcards.

<li>The <b>Annotation</b> 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 <i>keep</i> annotations.

<li>The <b>Extends/implements class</b> text field takes the fully-qualified
    name of the class or interface that the above classes must extend.

<li>The <b>Class members</b> 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.
</ul>
<p>

The <i>keep field</i> 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 <b>Advanced options</b> / <b>Basic
options</b> button at the bottom of the dialog allows to toggle showing the
advanced options.

<ul>
<li>The <b>Access</b> selections allows to specify constraints on the field or
    fields, based on their access modifiers.

<li>The <b>Annotation</b> 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 <i>keep</i>
    annotations.

<li>The <b>Return type</b> text field takes the fully-qualified type of the
    field or fields. The type can contain wildcards.

<li>The <b>Name</b> text field takes the name of the field or fields. The field
    name can contain wildcards.
</ul>
<p>

Similarly, the <i>keep method</i> 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 <b>Advanced
options</b> / <b>Basic options</b> button at the bottom of the dialog allows
to toggle showing the advanced options.

<ul>
<li>The <b>Access</b> selections allows to specify constraints on the method or
    methods, based on their access modifiers.

<li>The <b>Annotation</b> 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 <i>keep</i>
    annotations.

<li>The <b>Return type</b> text field takes the fully-qualified type of the         method or methods. The type can contain wildcards.

<li>The <b>Name</b> text field takes the name of the method or methods. The
    method name can contain wildcards.

<li>The <b>Arguments</b> text field takes the comma-separated list of
    fully-qualified method arguments. Each of these arguments can contain
    wildcards.
</ul>
<p>

Corresponding configuration options:
<ul type="none">
<li>-<a href="usage.html#dontshrink">dontshrink</a>
<li>-<a href="usage.html#printusage">printusage</a>
<li>-<a href="usage.html#keep">keep</a>
<li>-<a href="usage.html#keepclassmembers">keepclassmembers</a>
<li>-<a href="usage.html#keepclasseswithmembers">keepclasseswithmembers</a>
</ul>
<p>

<a name="obfuscation">&nbsp;</a>
<h2>The Obfuscation Tab</h2>

The <i>Obfuscation</i> 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).
<p>

The lists are manipulated in the same way as in the <a
href="#shrinking">Shrinking Tab</a>.
<p>

Corresponding configuration options:
<ul type="none">
<li>-<a href="usage.html#dontobfuscate">dontobfuscate</a>
<li>-<a href="usage.html#printmapping">printmapping</a>
<li>-<a href="usage.html#applymapping">applymapping</a>
<li>-<a href="usage.html#obfuscationdictionary">obfuscationdictionary</a>
<li>-<a href="usage.html#classobfuscationdictionary">classobfuscationdictionary</a>
<li>-<a href="usage.html#packageobfuscationdictionary">packageobfuscationdictionary</a>
<li>-<a href="usage.html#overloadaggressively">overloadaggressively</a>
<li>-<a href="usage.html#useuniqueclassmembernames">useuniqueclassmembernames</a>
<li>-<a href="usage.html#dontusemixedcaseclassnames">dontusemixedcaseclassnames</a>
<li>-<a href="usage.html#keeppackagenames">keeppackagenames</a>
<li>-<a href="usage.html#flattenpackagehierarchy">flattenpackagehierarchy</a>
<li>-<a href="usage.html#repackageclasses">repackageclasses</a>
<li>-<a href="usage.html#keepattributes">keepattributes</a>
<li>-<a href="usage.html#renamesourcefileattribute">renamesourcefileattribute</a>
<li>-<a href="usage.html#adaptclassstrings">adaptclassstrings</a>
<li>-<a href="usage.html#adaptresourcefilenames">adaptresourcefilenames</a>
<li>-<a href="usage.html#adaptresourcefilecontents">adaptresourcefilecontents</a>
<li>-<a href="usage.html#keepnames">keepnames</a>
<li>-<a href="usage.html#keepclassmembernames">keepclassmembernames</a>
<li>-<a href="usage.html#keepclasseswithmembernames">keepclasseswithmembernames</a>
<li><a href="usage.html#classspecification"><i>class_specification</i></a>
</ul>
<p>

<a name="optimization">&nbsp;</a>
<h2>The Optimization Tab</h2>

The <i>Optimization</i> 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.
<p>

The lists are manipulated in much the same way as in the <a
href="#shrinking">Shrinking Tab</a>.
<p>

Corresponding configuration options:
<ul type="none">
<li>-<a href="usage.html#dontoptimize">dontoptimize</a>
<li>-<a href="usage.html#optimizations">optimizations</a>
<li>-<a href="usage.html#optimizationpasses">optimizationpasses</a>
<li>-<a href="usage.html#allowaccessmodification">allowaccessmodification</a>
<li>-<a href="usage.html#mergeinterfacesaggressively">mergeinterfacesaggressively</a>
<li>-<a href="usage.html#assumenosideeffects">assumenosideeffects</a>
<li><a href="usage.html#classspecification"><i>class_specification</i></a>
</ul>
<p>

<a name="information">&nbsp;</a>
<h2>The Information Tab</h2>

The <i>Information</i> 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.
<p>

Corresponding configuration options:
<ul type="none">
<li>-<a href="usage.html#dontpreverify">dontpreverify</a>
<li>-<a href="usage.html#microedition">microedition</a>
<li>-<a href="usage.html#target">target</a>
<li>-<a href="usage.html#verbose">verbose</a>
<li>-<a href="usage.html#dontnote">dontnote</a>
<li>-<a href="usage.html#dontwarn">dontwarn</a>
<li>-<a href="usage.html#ignorewarnings">ignorewarnings</a>
<li>-<a href="usage.html#dontskipnonpubliclibraryclasses">dontskipnonpubliclibraryclasses</a>
<li>-<a href="usage.html#dontskipnonpubliclibraryclassmembers">dontskipnonpubliclibraryclassmembers</a>
<li>-<a href="usage.html#keepdirectories">keepdirectories</a>
<li>-<a href="usage.html#forceprocessing">forceprocessing</a>
<li>-<a href="usage.html#printseeds">printseeds</a>
<li>-<a href="usage.html#printconfiguration">printconfiguration</a>
<li>-<a href="usage.html#dump">dump</a>
<li>-<a href="usage.html#whyareyoukeeping">whyareyoukeeping</a>
</ul>
<p>

<a name="process">&nbsp;</a>
<h2>The Process Tab</h2>

The <i>Process</i> tab has an output console for displaying the configuration
and the messages while processing. There are three important buttons at the
bottom:
<p>

<table cellspacing="5" cellpadding="5">
<tr><td class="button">View configuration</td>
    <td>displays the current ProGuard configuration in the console.</td></tr>
<tr><td class="button">Save configuration...</td>
    <td>opens a file chooser to save the current ProGuard
    configuration.</td></tr>
<tr><td class="button">Process!</td>
    <td>executes ProGuard with the current configuration.</td></tr>
</table>
<p>

<a name="retrace">&nbsp;</a>
<h2>The ReTrace Tab</h2>

The <i>ReTrace</i> 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:

<ul>
<li>The <b>Verbose</b> check box in the settings panel allows to toggle between
    normal mode and verbose mode.

<li>The <b>Mapping file</b> 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 <b>Browse...</b> button that
    opens a file chooser.

<li>The <b>Obfuscated stack trace</b> 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.
</ul>

There are two buttons at the bottom:
<p>

<table cellspacing="5" cellpadding="5">
<tr><td class="button">Load stack trace...</td>
    <td>opens a file chooser to load an obfuscated stack trace.</td></tr>
<tr><td class="button">ReTrace!</td>
    <td>executes ReTrace with the current settings.</td></tr>
</table>
<p>

<hr>
<address>
Copyright &copy; 2002-2009
<a href="http://www.graphics.cornell.edu/~eric/">Eric Lafortune</a>.
</address>
</body>
</html>