1<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
2<html>
3<head>
4<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
5<meta http-equiv="content-style-type" content="text/css">
6<link rel="stylesheet" type="text/css" href="style.css">
7<title>ProGuard GUI</title>
8</head>
9<body>
10
11<script type="text/javascript" language="JavaScript">
12<!--
13if (window.self==window.top)
14  document.write('<a class="largebutton" target="_top" href="../index.html#manual/gui.html">ProGuard index</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/dexguard">DexGuard</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/">Saikoa</a> <a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>')
15//-->
16</script>
17<noscript>
18<a class="largebutton" target="_top"  href="../index.html#manual/gui.html">ProGuard index</a>
19<a class="largebutton" target="_top"  href="http://www.saikoa.com/dexguard">DexGuard</a>
20<a class="largebutton" target="_top"  href="http://www.saikoa.com/">Saikoa</a>
21<a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>
22</noscript>
23
24<h2>Graphical User Interface</h2>
25
26You can find the ProGuard GUI jar in the <code>lib</code> directory of the
27ProGuard distribution. To run the ProGuard graphical user interface, just type:
28<p class="code">
29<code><b>java -jar proguardgui.jar</b> [-nosplash] </code>[<i>configuration_file</i>]
30</p>
31Alternatively, the <code>bin</code> directory contains some short Linux and
32Windows scripts containing this command. The GUI will pop up in a window. With
33the <code>-nosplash</code> option, you can switch off the short opening
34animation. If you have specified a ProGuard configuration file, it will be
35loaded. The GUI works like a wizard. You can edit the configuration and
36execute ProGuard through a few tabs:
37<p>
38
39<table cellspacing="5" cellpadding="5">
40<tr><td class="button"><a href="#proguard">ProGuard</a></td>
41    <td>Optionally load an existing configuration file.</td></tr>
42<tr><td class="button"><a href="#inputoutput">Input/Output</a></td>
43    <td>Specify the program jars and library jars.</td></tr>
44<tr><td class="button"><a href="#shrinking">Shrinking</a></td>
45    <td>Specify the shrinking options.</td></tr>
46<tr><td class="button"><a href="#obfuscation">Obfuscation</a></td>
47    <td>Specify the obfuscation options.</td></tr>
48<tr><td class="button"><a href="#optimization">Optimization</a></td>
49    <td>Specify the optimization options.</td></tr>
50<tr><td class="button"><a href="#information">Information</a></td>
51    <td>Specify some options to get information.</td></tr>
52<tr><td class="button"><a href="#process">Process</a></td>
53    <td>View and save the resulting configuration, and run ProGuard.</td></tr>
54</table>
55<p>
56
57In addition, there is a tab to execute ReTrace interactively:
58<p>
59
60<table cellspacing="5" cellpadding="5">
61<tr><td class="button"><a href="#retrace">ReTrace</a></td>
62    <td>Set up and run ReTrace, to de-obfuscate stack traces.</td></tr>
63</table>
64<p>
65
66You can freely toggle between the tabs by means of the buttons on the
67left-hand side of the window, or by means of the <b>Previous</b> and
68<b>Next</b> buttons at the bottom of the tabs. Tool tips briefly explain the
69purpose of the numerous options and text fields, although a basic
70understanding of the shrinking/optimization/obfuscation/preverification
71process is assumed. Please refer to the <a
72href="introduction.html">Introduction</a> of this manual.
73<p>
74
75<h2><a name="proguard">The ProGuard Tab</a></h2>
76
77The <i>ProGuard</i> tab presents a welcome message and one important button at
78the bottom:
79<p>
80
81<table cellspacing="5" cellpadding="5">
82<tr><td class="button">Load configuration...</td>
83    <td>opens a file chooser to load an existing ProGuard configuration
84    file.</td></tr>
85</table>
86<p>
87
88If you don't want to load an existing configuration, you can just continue
89creating a new configuration from scratch.
90<p>
91
92<h2><a name="inputoutput">The Input/Output Tab</a></h2>
93
94The <i>Input/Output</i> tab contains two lists, respectively to specify the
95program jars (or aars, wars, ears, zips, apks, or directories), and the
96library jars (or aars, wars, ears, zips, apks, or directories).
97
98<ul>
99<li>The list of program jars contains input entries and output entries. Input
100    entries contain the class files and resource files to be processed. Output
101    entries specify the destinations to which the processed results will be
102    written. They are preceded by arrows, to distinguish them from input
103    entries. The results of each consecutive list of input entries will be
104    written to the subsequent consecutive list of output entries.</li>
105
106<li>The library jars are not copied to the output jars; they contain class
107    files that are used by class files in the program jars and that are
108    necessary for correct processing. This list typically at least contains the
109    targeted Java runtime jar.</li>
110</ul>
111<p>
112
113Each of these lists can be edited by means of a couple of buttons on the
114right-hand side:
115<p>
116
117<table cellspacing="5" cellpadding="5">
118<tr><td class="button">Add input...</td> <td>opens a file chooser to add an
119    input entry to the list of program jars.</td></tr>
120<tr><td class="button">Add output...</td> <td>opens a file chooser to add an
121    output entry to the list of program jars.</td></tr>
122<tr><td class="button">Add...</td>
123    <td>opens a file chooser to add an entry to the list of library
124    jars.</td></tr>
125<tr><td class="button">Edit...</td>
126    <td>opens a file chooser to edit the selected entry in the list.</td></tr>
127<tr><td class="button">Filter...</td>
128    <td>opens a text entry field to add or edit the filters of the selected
129    entries in the list.</td></tr>
130<tr><td class="button">Remove</td>
131    <td>removes the selected entries from the list.</td></tr>
132<tr><td class="button">Move up</td>
133    <td>moves the selected entries one position up the list.</td></tr>
134<tr><td class="button">Move down</td>
135    <td>moves the selected entries one position down the list.</td></tr>
136<tr><td class="button">Move to libraries</td>
137    <td>moves the selected entries in the list of program jars to the list of
138    library jars.</td></tr>
139<tr><td class="button">Move to program</td>
140    <td>moves the selected entries in the list of library jars to the list of
141    program jars.</td></tr>
142</table>
143<p>
144
145Filters allow to filter files based on their names. You can specify filters
146for class file names and resource file names, for jar file names, for aar file
147names, for war file names, for ear file names, for zip file names, and for
148apk file names. Multiple entries in the program list only make sense when
149combined with filters; each output file is written to the first entry with a
150matching filter.
151<p>
152
153Input entries that are currently not readable are colored red.
154<p>
155
156The order of the entries in each list may matter, as the first occurrence of
157any duplicate entries gets precedence, just as in conventional class paths.
158<p>
159
160Corresponding configuration options:
161<ul type="none">
162<li>-<a href="usage.html#injars">injars</a></li>
163<li>-<a href="usage.html#outjars">outjars</a></li>
164<li>-<a href="usage.html#libraryjars">libraryjars</a></li>
165<li><a href="usage.html#classpath"><i>class_path</i></a></li>
166<li><a href="usage.html#filters"><i>filters</i></a></li>
167</ul>
168<p>
169
170<h2><a name="shrinking">The Shrinking Tab</a></h2>
171
172The <i>Shrinking</i> tab presents a number of options that affect the
173shrinking step. The basic options are followed by a few lists of classes and
174class members (fields and methods) that must be protected from shrinking (and
175implicitly from obfuscation as well).
176<p>
177
178The fixed lists contain predefined entries that are typically useful for many
179applications. Each of these entries can be toggled by means of a check box.
180The text field following each entry allows to constrain the applicable classes
181by means of a comma-separated list of wildcarded, fully-qualified class
182names. The default is "*", which means that all input classes of the
183corresponding type are considered.
184<p>
185
186For example, checking the <b>Applications</b> entry and filling in
187"myapplications.**" after it would mean: keep all classes that have main
188methods in the "myapplications" package and all of its subpackages.
189<p>
190
191The variable list at the bottom allows to define additional entries
192yourself. The list can be edited by means of a couple of buttons on the
193right-hand side:
194<p>
195
196<table cellspacing="5" cellpadding="5">
197<tr><td class="button">Add...</td>
198    <td>opens a window to add a new entry to the list.</td></tr>
199<tr><td class="button">Edit...</td>
200    <td>opens a window to edit the selected entry in the list.</td></tr>
201<tr><td class="button">Remove</td>
202    <td>removes the selected entries from the list.</td></tr>
203<tr><td class="button">Move up</td>
204    <td>moves the selected entries one position up the list.</td></tr>
205<tr><td class="button">Move down</td>
206    <td>moves the selected entries one position down the list.</td></tr>
207</table>
208<p>
209
210The interface windows allow to specify classes, fields, and methods. They
211contain text fields and check boxes to constrain these items. They have
212<b>Ok</b> and <b>Cancel</b> buttons to apply or to cancel the operation.
213<p>
214
215For example, your application may be creating some classes dynamically using
216<code>Class.forName</code>. You should then specify them here, so they are kept
217by their original names. Press the <b>Add...</b> button to open the class
218window. Fill out the fully-qualified class name in the <b>Code</b> text field,
219and press the <b>Ok</b> button. Repeat this for all required classes. Wildcards
220can be helpful to specify a large number of related classes in one go. If you
221want to specify all implementations of a certain interface, fill out the
222fully qualified interface name in the <b>Extends/implements class</b> instead.
223<p>
224
225For more advanced settings, it is advisable to become familiar with ProGuard's
226configuration options through the <a href="usage.html">Usage section</a> and
227the <a href="examples.html">Examples section</a>.  We'll suffice with a brief
228overview of the three dialogs provided by the GUI.
229<p>
230
231The <i>keep class</i> dialog appears when adding or editing new special keep
232entries. It has text fields and selections for specifying and constraining
233classes and class members to keep. The <b>Advanced options</b> / <b>Basic
234options</b> button at the bottom of the dialog allows to toggle showing the
235advanced options.
236
237<ul>
238<li>The <b>Comments</b> text field allows to add optional comments to this
239    entry. The comments will identify the entry in the list and they will
240    appear as comments in the configuration file.</li>
241
242<li>The <b>Keep</b> selection allows to specify whether you want to protect
243    the specified classes and their specified class members, or just the
244    specified class members from the specified classes, or the specified
245    classes and the specified class members, if the class members are present.
246    Note that class members will only be protected if they are explicitly
247    specified, even if only by means of a wildcard.</li>
248
249<li>The <b>Allow</b> selection allows to specify whether you want to allow the
250    the specified classes and their specified class members to be shrunk,
251    optimized and/or obfuscated.</li>
252
253<li>The <b>Access</b> selections allows to specify constraints on the class or
254    classes, based on their access modifiers.</li>
255
256<li>The <b>Annotation</b> text field takes the fully-qualified name of an
257    annotation that is required for matching classes. The annotation name can
258    contain wildcards. This is an advanced option for defining <i>keep</i>
259    annotations.</li>
260
261<li>The <b>Class</b> text field takes the fully-qualified name of the class or
262    classes. The class name can contain wildcards.</li>
263
264<li>The <b>Annotation</b> text field takes the fully-qualified name of an
265    annotation that is required for the class or interface that the above
266    class must extend. The annotation name can contain wildcards. This is an
267    advanced option for defining <i>keep</i> annotations.</li>
268
269<li>The <b>Extends/implements class</b> text field takes the fully-qualified
270    name of the class or interface that the above classes must extend.</li>
271
272<li>The <b>Class members</b> list allows to specify a list of fields and
273    methods to keep. It can be edited by means of a list of buttons on the
274    right-hand side.</li>
275</ul>
276<p>
277
278The <i>keep field</i> dialog appears when adding or editing fields within the
279above dialog. It has text fields and selections for specifying and
280constraining fields to keep. Again, the <b>Advanced options</b> / <b>Basic
281options</b> button at the bottom of the dialog allows to toggle showing the
282advanced options.
283
284<ul>
285<li>The <b>Access</b> selections allows to specify constraints on the field or
286    fields, based on their access modifiers.</li>
287
288<li>The <b>Annotation</b> text field takes the fully-qualified name of an
289    annotation that is required for matching fields. The annotation name can
290    contain wildcards. This is an advanced option for defining <i>keep</i>
291    annotations.</li>
292
293<li>The <b>Return type</b> text field takes the fully-qualified type of the
294    field or fields. The type can contain wildcards.</li>
295
296<li>The <b>Name</b> text field takes the name of the field or fields. The field
297    name can contain wildcards.</li>
298</ul>
299<p>
300
301Similarly, the <i>keep method</i> dialog appears when adding or editing
302methods within the keep class dialog. It has text fields and selections for
303specifying and constraining methods to keep. Again, the <b>Advanced
304options</b> / <b>Basic options</b> button at the bottom of the dialog allows
305to toggle showing the advanced options.
306
307<ul>
308<li>The <b>Access</b> selections allows to specify constraints on the method or
309    methods, based on their access modifiers.</li>
310
311<li>The <b>Annotation</b> text field takes the fully-qualified name of an
312    annotation that is required for matching methods. The annotation name can
313    contain wildcards. This is an advanced option for defining <i>keep</i>
314    annotations.</li>
315
316<li>The <b>Return type</b> text field takes the fully-qualified type of the         method or methods. The type can contain wildcards.</li>
317
318<li>The <b>Name</b> text field takes the name of the method or methods. The
319    method name can contain wildcards.</li>
320
321<li>The <b>Arguments</b> text field takes the comma-separated list of
322    fully-qualified method arguments. Each of these arguments can contain
323    wildcards.</li>
324</ul>
325<p>
326
327Corresponding configuration options:
328<ul type="none">
329<li>-<a href="usage.html#dontshrink">dontshrink</a></li>
330<li>-<a href="usage.html#printusage">printusage</a></li>
331<li>-<a href="usage.html#keep">keep</a></li>
332<li>-<a href="usage.html#keepclassmembers">keepclassmembers</a></li>
333<li>-<a href="usage.html#keepclasseswithmembers">keepclasseswithmembers</a></li>
334</ul>
335<p>
336
337<h2><a name="obfuscation">The Obfuscation Tab</a></h2>
338
339The <i>Obfuscation</i> tab presents a number of options that affect the
340obfuscation step. The basic options are followed by a few lists of classes and
341class members (fields and methods) that must be protected from obfuscation
342(but not necessarily from shrinking).
343<p>
344
345The lists are manipulated in the same way as in the <a
346href="#shrinking">Shrinking Tab</a>.
347<p>
348
349Corresponding configuration options:
350<ul type="none">
351<li>-<a href="usage.html#dontobfuscate">dontobfuscate</a></li>
352<li>-<a href="usage.html#printmapping">printmapping</a></li>
353<li>-<a href="usage.html#applymapping">applymapping</a></li>
354<li>-<a href="usage.html#obfuscationdictionary">obfuscationdictionary</a></li>
355<li>-<a href="usage.html#classobfuscationdictionary">classobfuscationdictionary</a></li>
356<li>-<a href="usage.html#packageobfuscationdictionary">packageobfuscationdictionary</a></li>
357<li>-<a href="usage.html#overloadaggressively">overloadaggressively</a></li>
358<li>-<a href="usage.html#useuniqueclassmembernames">useuniqueclassmembernames</a></li>
359<li>-<a href="usage.html#dontusemixedcaseclassnames">dontusemixedcaseclassnames</a></li>
360<li>-<a href="usage.html#keeppackagenames">keeppackagenames</a></li>
361<li>-<a href="usage.html#flattenpackagehierarchy">flattenpackagehierarchy</a></li>
362<li>-<a href="usage.html#repackageclasses">repackageclasses</a></li>
363<li>-<a href="usage.html#keepattributes">keepattributes</a></li>
364<li>-<a href="usage.html#keepparameternames">keepparameternames</a></li>
365<li>-<a href="usage.html#renamesourcefileattribute">renamesourcefileattribute</a></li>
366<li>-<a href="usage.html#adaptclassstrings">adaptclassstrings</a></li>
367<li>-<a href="usage.html#adaptresourcefilenames">adaptresourcefilenames</a></li>
368<li>-<a href="usage.html#adaptresourcefilecontents">adaptresourcefilecontents</a></li>
369<li>-<a href="usage.html#keepnames">keepnames</a></li>
370<li>-<a href="usage.html#keepclassmembernames">keepclassmembernames</a></li>
371<li>-<a href="usage.html#keepclasseswithmembernames">keepclasseswithmembernames</a></li>
372<li><a href="usage.html#classspecification"><i>class_specification</i></a></li>
373</ul>
374<p>
375
376<h2><a name="optimization">The Optimization Tab</a></h2>
377
378The <i>Optimization</i> tab presents a number of options that affect the
379optimization step. The basic options are followed by a few lists of class
380method calls that can be removed if ProGuard can determine that their results
381are not being used.
382<p>
383
384The lists are manipulated in much the same way as in the <a
385href="#shrinking">Shrinking Tab</a>.
386<p>
387
388Corresponding configuration options:
389<ul type="none">
390<li>-<a href="usage.html#dontoptimize">dontoptimize</a></li>
391<li>-<a href="usage.html#optimizations">optimizations</a></li>
392<li>-<a href="usage.html#optimizationpasses">optimizationpasses</a></li>
393<li>-<a href="usage.html#allowaccessmodification">allowaccessmodification</a></li>
394<li>-<a href="usage.html#mergeinterfacesaggressively">mergeinterfacesaggressively</a></li>
395<li>-<a href="usage.html#assumenosideeffects">assumenosideeffects</a></li>
396<li><a href="usage.html#classspecification"><i>class_specification</i></a></li>
397</ul>
398<p>
399
400<h2><a name="information">The Information Tab</a></h2>
401
402The <i>Information</i> tab presents a number of options for preverification
403and targeting, and for the information that ProGuard returns when processing
404your code. The bottom list allows you to query ProGuard about why given
405classes and class members are being kept in the shrinking step.
406<p>
407
408Corresponding configuration options:
409<ul type="none">
410<li>-<a href="usage.html#dontpreverify">dontpreverify</a></li>
411<li>-<a href="usage.html#microedition">microedition</a></li>
412<li>-<a href="usage.html#target">target</a></li>
413<li>-<a href="usage.html#verbose">verbose</a></li>
414<li>-<a href="usage.html#dontnote">dontnote</a></li>
415<li>-<a href="usage.html#dontwarn">dontwarn</a></li>
416<li>-<a href="usage.html#ignorewarnings">ignorewarnings</a></li>
417<li>-<a href="usage.html#skipnonpubliclibraryclasses">skipnonpubliclibraryclasses</a></li>
418<li>-<a href="usage.html#dontskipnonpubliclibraryclasses">dontskipnonpubliclibraryclasses</a></li>
419<li>-<a href="usage.html#dontskipnonpubliclibraryclassmembers">dontskipnonpubliclibraryclassmembers</a></li>
420<li>-<a href="usage.html#keepdirectories">keepdirectories</a></li>
421<li>-<a href="usage.html#forceprocessing">forceprocessing</a></li>
422<li>-<a href="usage.html#printseeds">printseeds</a></li>
423<li>-<a href="usage.html#printconfiguration">printconfiguration</a></li>
424<li>-<a href="usage.html#dump">dump</a></li>
425<li>-<a href="usage.html#whyareyoukeeping">whyareyoukeeping</a></li>
426</ul>
427<p>
428
429<h2><a name="process">The Process Tab</a></h2>
430
431The <i>Process</i> tab has an output console for displaying the configuration
432and the messages while processing. There are three important buttons at the
433bottom:
434<p>
435
436<table cellspacing="5" cellpadding="5">
437<tr><td class="button">View configuration</td>
438    <td>displays the current ProGuard configuration in the console.</td></tr>
439<tr><td class="button">Save configuration...</td>
440    <td>opens a file chooser to save the current ProGuard
441    configuration.</td></tr>
442<tr><td class="button">Process!</td>
443    <td>executes ProGuard with the current configuration.</td></tr>
444</table>
445<p>
446
447<h2><a name="retrace">The ReTrace Tab</a></h2>
448
449The <i>ReTrace</i> tab has a panel with a few settings, an input text area for
450the obfuscated stack trace, and an output console to view the de-obfuscated
451stack trace:
452
453<ul>
454<li>The <b>Verbose</b> check box in the settings panel allows to toggle between
455    normal mode and verbose mode.</li>
456
457<li>The <b>Mapping file</b> text field takes the name of the required mapping
458    file that ProGuard wrote while processing the original code. The file name
459    can be entered manually or by means of the <b>Browse...</b> button that
460    opens a file chooser.</li>
461
462<li>The <b>Obfuscated stack trace</b> text area allows to enter the stack
463    trace, typically by copying and pasting it from elsewhere. Alternatively,
464    it can be loaded from a file by means of the load button below.</li>
465</ul>
466
467There are two buttons at the bottom:
468<p>
469
470<table cellspacing="5" cellpadding="5">
471<tr><td class="button">Load stack trace...</td>
472    <td>opens a file chooser to load an obfuscated stack trace.</td></tr>
473<tr><td class="button">ReTrace!</td>
474    <td>executes ReTrace with the current settings.</td></tr>
475</table>
476
477<hr />
478<address>
479Copyright &copy; 2002-2014
480<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a> @ <a target="top" href="http://www.saikoa.com/">Saikoa</a>.
481</address>
482</body>
483</html>
484