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