1 2<!doctype html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> 3<html> 4<head> 5<meta http-equiv="content-type" content="text/html; charset=iso-8859-1"> 6<meta http-equiv="content-style-type" content="text/css"> 7<link rel="stylesheet" type="text/css" href="style.css"> 8<title>ProGuard Downloads</title> 9</head> 10<body> 11 12<h2>Downloads</h2> 13 14<b>ProGuard</b> is distributed under the terms of the GNU General Public 15License. Please consult the <a href="license.html">license page</a> for more 16details. 17<p> 18<b>ProGuard</b> is written in Java, so it requires a Java Runtime Environment 19 (JRE 1.4 or higher). 20<p> 21You can download the latest release (containing the program jar, the 22documentation you're reading now, examples, and the source code) from this 23location: 24<p> 25<center><a href="http://sourceforge.net/project/showfiles.php?group_id=54750" 26target="other">Download section</a> (at <a 27href="http://sourceforge.net/projects/proguard/" 28target="other">SourceForge</a>)</center> 29<p> 30 31If you're still working with an older version of <b>ProGuard</b>, check out 32the summary of changes below, to see if you're missing something essential. 33Better look at the up-to-date <a 34href="http://proguard.sourceforge.net/downloads.html">on-line version</a> if 35you're reading a local copy of this page. 36<p> 37The download section may also contain updates with sub-minor version numbers. 38These versions are typically released shortly after their parent versions, for 39applying emergency fixes. Please make sure to look at those if you are 40encountering any problems with recent releases. 41<p> 42Finally, there may be beta versions of upcoming releases. They may be of 43interest too, because they typically contain any less urgent bug fixes 44collected since the previous release. 45<p> 46 47<h3><div>Jul 2009</div> Version 4.4</h3> 48<ul> 49<li>Added new peephole optimizations. 50<li>Added option <code>-optimizations</code> for fine-grained configuration of 51 optimizations. 52<li>Added option <code>-adaptclassstrings</code> for adapting string constants 53 that correspond to obfuscated classes. 54<li>Added option <code>-keeppackagenames</code> for keeping specified package 55 names from being obfuscated. 56<li>Added option <code>-keepdirectories</code> for keeping specified directory 57 entries in output jars. 58<li>Extended options <code>-dontnote</code> and <code>-dontwarn</code> for 59 fine-grained configuration of notes and warnings. 60<li>Added option <code>-regex</code> in ReTrace, for specifying alternative 61 regular expressions to parse stack traces. 62<li>Extended renaming of resource files based on obfuscation. 63<li>Improved inlining of constant parameters and removal of unused parameters. 64<li>Avoiding bug in IBM's JVM for JSE, in optimization step. 65<li>Avoiding ArrayIndexOutOfBoundsException in optimization step. 66<li>Fixed configuration with annotations that are not preserved themselves. 67<li>Fixed preverification of invocations of super constructors with arguments 68 containing ternary operators. 69<li>Fixed processing of unreachable exception handlers. 70<li>Fixed merging of exception classes. 71<li>Fixed repeated method inlining. 72<li>Fixed inlining of finally blocks surrounded by large try blocks, compiled 73 with JDK 1.4 or earlier. 74<li>Fixed optimization of complex finally blocks, compiled with JDK 1.4 or 75 earlier. 76<li>Fixed obfuscation of anonymous class names, if <code>EnclosingMethod</code> 77 attributes are being kept. 78<li>Fixed obfuscation of inner class names in generic types. 79<li>Fixed decoding of UTF-8 strings containing special characters. 80<li>Fixed copying of debug information and annotations when merging classes. 81<li>Fixed writing out of unknown attributes. 82<li>Fixed updating manifest files with split lines. 83<li>Updated documentation and examples. 84</ul> 85 86<h3><div>Dec 2008</div> Version 4.3</h3> 87<ul> 88<li>Added class merging. 89<li>Added static single assignment analysis. 90<li>Added support for annotation and enumeration class types in configuration. 91<li>Refined shrinking of fields in case of unusual 92 <code>-keepclassmembers</code> options. 93<li>Added simplification of tail recursion calls. 94<li>Added new peephole optimizations. 95<li>Fixed optimization of unused variable initializations causing negative 96 stack sizes. 97<li>Fixed optimization of unusual initialization code causing 98 NullPointerExceptions. 99<li>Fixed optimization of half-used long and double parameters. 100<li>Fixed processing of complex generics signatures. 101<li>Working around suspected java compiler bug with parameter annotations on 102 constructors of non-static inner classes. 103<li>Fixed obfuscation of classes with inner classes whose names are preserved. 104<li>Fixed access of protected methods in repackaged classes. 105<li>Added options <code>-classobfuscationdictionary</code> and 106 <code>-packageobfuscationdictionary</code>. 107<li>Adapting more types of resource file names based on obfuscation. 108<li>Extended warnings about incorrect dependencies. 109<li>Added start-up scripts and build scripts. 110<li>Updated documentation and examples. 111</ul> 112 113<h3><div>Mar 2008</div> Version 4.2</h3> 114<ul> 115<li>Refined data flow analysis in optimization step. 116<li>Fixed handling of exceptions when inlining subroutines. 117<li>Fixed inlining of incompatible code constructs between different java 118 versions. 119<li>Fixed computation of local variable frame size. 120<li>Fixed optimization of infinite loops. 121<li>Fixed optimization of subroutine invocations. 122<li>Fixed optimization of floating point remainder computations. 123<li>Fixed removal of unused parameters in method descriptors containing arrays 124 of longs or doubles. 125<li>Added undocumented java system properties 126 <code>maximum.inlined.code.length</code> (default is 8) and 127 <code>maximum.resulting.code.length</code> (defaults are 8000 for JSE and 128 2000 for JME), for expert users who read release notes. 129<li>Fixed processing of generic types in Signature attributes in shrinking and 130 optimization steps. 131<li>Fixed processing of inner class names in Signature attributes in obfuscation 132 step. 133<li>Improved adapting resource file names following obfuscated class names. 134<li>Fixed interpretation of package names in GUI. 135<li>Fixed default settings for Xlets in GUI. 136<li>Updated documentation and examples. 137</ul> 138 139<h3><div>Dec 2007</div> Version 4.1</h3> 140<ul> 141<li>Fixed shrinking of default annotation element values. 142<li>Fixed optimization of invocations of methods in same class that are 143 accessed through extensions. 144<li>Fixed optimization of invocations of synchronized methods without other 145 side-effects. 146<li>Fixed optimization of some non-returning subroutines. 147<li>Fixed handling of local variable debug information when inlining methods. 148<li>Avoiding StackOverflowErrors during optimization of complex methods. 149<li>Fixed obfuscation of potentially ambiguous non-primitive constants in 150 interfaces. 151<li>Fixed preverification of some code constructs involving String, Class, and 152 exception types. 153<li>The Ant task now allows empty <code><injars></code> and 154 <code><libraryjars></code> elements. 155<li>Updated documentation and examples. 156</ul> 157 158<h3><div>Sep 2007</div> Version 4.0</h3> 159<ul> 160<li>Added preverifier for Java 6 and Java Micro Edition, with new options 161 <code>-microedition</code> and <code>-dontpreverify</code>. 162<li>Added new option <code>-target</code> to modify java version of processed 163 class files. 164<li>Made <code>-keep</code> options more orthogonal and flexible, with option 165 modifiers <code>allowshrinking</code>, <code>allowoptimization</code>, and 166 <code>allowobfuscation</code>. 167<li>Added new wildcards for class member descriptors: "<code>***</code>", 168 matching any type, and "<code>...</code>", matching any number of 169 arguments. 170<li>Added support for configuration by means of annotations. 171<li>Improved shrinking of unused annotations. 172<li>Added check on modification times of input and output, to avoid unnecessary 173 processing, with new option <code>-forceprocessing</code>. 174<li>Added new options <code>-flattenpackagehierarchy</code> and 175 <code>-repackageclasses</code> (replacing <code>-defaultpackage</code>) to 176 control obfuscation of package names. 177<li>Added new options <code>-adaptresourcefilenames</code> and 178 <code>-adaptresourcefilecontents</code>, with file filters, to update 179 resource files corresponding to obfuscated class names. 180<li>Added detection of dynamically accessed fields and methods. 181<li>Now treating <code>Exceptions</code> attributes as optional. 182<li>Now respecting naming rule for nested class names 183 (<code>EnclosingClass$InnerClass</code>) in obfuscation step, if 184 <code>InnerClasses</code> attributes or <code>EnclosingMethod</code> 185 attributes are being kept. 186<li>Added new inter-procedural optimizations: method inlining and propagation 187 of constant fields, constant arguments, and constant return values. 188<li>Added optimized local variable allocation. 189<li>Added more than 250 new peephole optimizations. 190<li>Improved making classes and class members public or protected. 191<li>Now printing notes on suspiciously unkept classes in parameters of 192 specified methods. 193<li>Now printing notes for class names that don't seem to be fully qualified. 194<li>Added support for uppercase filename extensions. 195<li>Added tool tips to the GUI. 196<li>Rewritten class file I/O code. 197<li>Updated documentation and examples. 198</ul> 199Upgrade considerations: 200<ul> 201 202<li>Since ProGuard now treats the <code>Exceptions</code> attribute as 203 optional, you may have to specify <code>-keepattributes Exceptions</code>, 204 notably when processing code that is to be used as a library. 205 206<li>ProGuard now preverifies code for Java Micro Edition, if you specify the 207 option <code>-microedition</code>. You then no longer need to process the 208 code with an external preverifier. 209 210<li>You should preferably specify <code>-repackageclasses</code> instead of the 211 old option name <code>-defaultpackage</code>. 212</ul> 213 214<h3><div>Dec 2007</div> Version 3.11</h3> 215<ul> 216<li>Fixed optimization of invocations of methods in same class that are 217 accessed through extensions. 218<li>Fixed optimization of invocations of synchronized methods without other 219 side-effects. 220<li>Updated documentation and examples. 221</ul> 222 223<h3><div>Aug 2007</div> Version 3.10</h3> 224<ul> 225<li>Now handling mixed-case input class names when 226 <code>-dontusemixedcaseclassnames</code> is specified. 227<li>Fixed optimization of synchronization on classes, as compiled by Eclipse 228 and Jikes. 229<li>Fixed optimization of switch statements with unreachable cases. 230<li>Avoiding merging subsequent identically named files. 231<li>Updated documentation and examples. 232</ul> 233 234<h3><div>Jun 2007</div> Version 3.9</h3> 235<ul> 236<li>Fixed processing of .class constructs in Java 6. 237<li>Fixed repeated processing of .class constructs. 238<li>Fixed possible division by 0 in optimization step. 239<li>Fixed handling of variable instructions with variable indices larger than 240 255. 241<li>Updated documentation and examples. 242</ul> 243 244<h3><div>Mar 2007</div> Version 3.8</h3> 245<ul> 246<li>Fixed optimization of parameters used as local variables. 247<li>Fixed obfuscation with conflicting class member names. 248<li>Fixed incremental obfuscation with incomplete mapping file for library jars. 249<li>Updated documentation and examples. 250</ul> 251 252<h3><div>Dec 2006</div> Version 3.7</h3> 253<ul> 254<li>Now accepting Java 6 class files. 255<li>Fixed shrinking of partially used annotations. 256<li>Improved incremental obfuscation, with new option 257 <code>-useuniqueclassmembernames</code>. 258<li>Printing more information in case of conflicting configuration and input. 259<li>Fixed optimization of repeated array length instruction. 260<li>Fixed optimization of subsequent try/catch/finally blocks with return 261 statements. 262<li>Fixed optimization of complex stack operations. 263<li>Fixed optimization of simple infinite loops. 264<li>Fixed optimization of expressions with constant doubles. 265<li>Tuned optimization to improve size reduction after preverification. 266<li>Fixed overflows of offsets in long code blocks. 267<li>Now allowing class names containing dashes. 268<li>Updated documentation and examples. 269</ul> 270 271<h3><div>May 2006</div> Version 3.6</h3> 272<ul> 273<li>No longer automatically keeping classes in parameters of specified methods 274 from obfuscation and optimization (introduced in version 3.4). 275<li>Fixed inlining of interfaces that are used in .class constructs. 276<li>Fixed removal of busy-waiting loops reading volatile fields. 277<li>Fixed optimization of comparisons of known integers. 278<li>Fixed optimization of known branches. 279<li>Fixed optimization of method calls on arrays of interfaces. 280<li>Fixed optimization of method calls without side-effects. 281<li>Fixed optimization of nested try/catch/finally blocks with return 282 statements. 283<li>Fixed initialization of library classes that only appear in descriptors. 284<li>Fixed matching of primitive type wildcards in configuration. 285<li>Fixed the boilerplate specification for enumerations in the GUI. 286<li>Updated documentation and examples. 287</ul> 288 289<h3><div>Jan 2006</div> Version 3.5</h3> 290<ul> 291<li>Fixed obfuscation of class members with complex visibility. 292<li>Fixed optimization bugs causing stack verification errors. 293<li>Fixed optimization bug causing overridden methods to be finalized. 294<li>Fixed optimization bug causing abstract method errors for retro-fitted 295 library methods. 296<li>Fixed optimization bug evaluating code with constant long values. 297<li>Fixed bug in updating of optional local variable table attributes and local 298 variable type table attributes after optimization. 299<li>Fixed interpretation of comma-separated class names without wildcards. 300<li>Updated documentation and examples. 301</ul> 302 303<h3><div>Oct 2005</div> Version 3.4</h3> 304<ul> 305<li>Extended optimizations: removing duplicate code within methods. 306<li>Extended regular expressions for class names to comma-separated lists. 307<li>Now automatically keeping classes in descriptors of kept class members. 308<li>Added verbose statistics for optimizations. 309<li>Added boilerplate Number optimizations in GUI. 310<li>Fixed <code>Class.forName</code> detection. 311<li>Fixed incremental obfuscation bug. 312<li>Fixed optimization bug causing stack verification errors. 313<li>Fixed optimization bugs related to removal of unused parameters. 314<li>Fixed exception when optimizing code with many local variables. 315<li>Fixed exception when saving configuration with initializers in GUI. 316<li>Updated documentation and examples. 317</ul> 318 319<h3><div>Jun 2005</div> Version 3.3</h3> 320<ul> 321<li>Extended optimizations: making methods private and static when possible, 322 making classes static when possible, removing unused parameters. 323<li>Made file names relative to the configuration files in which they are 324 specified. Added <code>-basedirectory</code> option. 325<li>Added <code>-whyareyoukeeping</code> option to get details on why given 326 classes and class members are being kept. 327<li>Added warnings for misplaced class files. 328<li>Improved printing of notes for <code>Class.forName</code> constructs. 329<li>Implemented '<code>assumenosideeffects</code>' nested element in Ant task. 330<li>Improved processing of annotations. 331<li>Fixed reading and writing of parameter annotations. 332<li>Fixed various optimization bugs. 333<li>Fixed wildcards not matching '-' character. 334<li>Fixed wildcard bug and checkbox bugs in GUI. 335<li>Setting file chooser defaults in GUI. 336<li>Leaving room for growBox in GUI on Mac OS X. 337<li>Properly closing configuration files. 338<li>Updated documentation and examples. 339</ul> 340 341<h3><div>Dec 2004</div> Version 3.2</h3> 342<ul> 343<li>Fixed JDK5.0 processing bugs. 344<li>Fixed optimization bugs. 345<li>Fixed relative paths in Ant task. 346<li>Improved speed of shrinking step. 347<li>Updated documentation and examples. 348</ul> 349 350<h3><div>Nov 2004</div> Version 3.1</h3> 351<ul> 352<li>Improved obfuscation and shrinking of private class members. 353<li>Added inlining of interfaces with single implementations. 354<li>Added option to specify obfuscation dictionary. 355<li>Added option to read package visible library class members. 356<li>Extended support for JDK5.0 attributes. 357<li>Fixed various optimization bugs. 358<li>Modified Ant task to accept paths instead of filesets. 359<li>Fixed two Ant task bugs. 360<li>Updated documentation and examples. 361</ul> 362 363<h3><div>Aug 2004</div> Version 3.0</h3> 364<ul> 365<li>Added bytecode optimization step, between shrinking step and obfuscation 366 step. 367<li>Generalized filtered recursive reading and writing of jars, wars, ears, 368 zips, and directories. 369<li>Added support for grouping input and output jars, wars, ears, zips, and 370 directories. 371<li>Added support for applying mapping files to library classes. 372<li>Removed <code>-resourcejars</code> option. Resources should now be read 373 using regular <code>-injars</code> options, using filters if necessary. 374<li>Rewrote Ant task. Input and output modification dates are not checked at 375 the moment. Minor changes in XML schema: 376 <ul> 377 <li>Filters now specified using attributes. 378 <li>'<code>outjars</code>' now nested element instead of attribute. 379 <li>'<code>type</code>' attribute of <code><method></code> element no 380 longer defaults to '<code>void</code>'. 381 <li><code><</code> and <code>></code> characters now have to be 382 encoded in embedded configurations. 383 <li><code><proguardconfiguration></code> task no longer accepts 384 attributes. 385 </ul> 386<li>Updated J2ME WTK plugin, now customizable through configuration file. 387<li>Updated GUI. 388<li>Fixed various processing bugs. 389<li>Fixed ReTrace parsing bugs. 390<li>Improved jar compression. 391<li>Updated documentation and examples. 392</ul> 393 394<h3><div>Mar 2004</div> Version 2.1</h3> 395<ul> 396<li>Added support for JDK1.5 classes. 397<li>Added additional wildcard for matching primitive types. 398<li>Added possibility to switch off notes about duplicate class definitions. 399<li>Fixed use of multiple filters on output jars. 400<li>Fixed option to keep all attributes. 401<li>Fixed various Ant task bugs. 402<li>Updated documentation and examples. 403</ul> 404 405<h3><div>Dec 2003</div> Version 2.0</h3> 406<ul> 407<li>Added a graphical user interface for ProGuard and ReTrace. 408<li>Added <code>-applymapping</code> option for incremental obfuscation. 409<li>Added support for filtering input and output files. 410<li>Added support for the J++ <code>SourceDir</code> attribute. 411<li>Improved detection of <code>.class</code> constructs. 412<li>Improved handling of misplaced manifest files. 413<li>Improved implementation of ReTrace. 414<li>Worked around String UTF-8 encoding bug affecting foreign characters. 415<li>Fixed exception when ignoring warnings. 416<li>Fixed various Ant task bugs. 417<li>Updated documentation and examples. 418</ul> 419 420<h3><div>Aug 2003</div> Version 1.7</h3> 421<ul> 422<li>Fixed various Ant task bugs. 423<li>Fixed ClassCastException due to explicitly used abstract classes with 424 implicitly used interfaces targeted at JRE1.2 (the default in JDK1.4). 425<li>Fixed <code>-defaultpackage</code> bug for protected classes and class 426 members. 427<li>Fixed ReTrace bug when retracing without line number tables. 428<li>Worked around zip package problems with duplicate out entries and rogue 429 manifest files. 430<li>Added work-around for handling malformed legacy interface class files. 431<li>Updated documentation and examples. 432</ul> 433 434<h3><div>May 2003</div> Version 1.6</h3> 435<ul> 436<li>Added support for Ant. 437<li>Added support for the J2ME Wireless Toolkit. 438<li>Added support for reading and writing directory hierarchies. 439<li>Added option for specifying resource jars and directories. 440<li>Added support for wildcards in class member specifications. 441<li>Improved handling of the <code>-defaultpackage</code> option. 442<li>Improved stack trace parsing in ReTrace tool. 443<li>Fixed processing of libraries containing public as well as non-public 444 extensions of non-public classes. 445<li>Fixed examples for processing libraries, midlets, and serializable code. 446<li>Updated documentation and examples. 447</ul> 448 449<h3><div>Jan 2003</div> Version 1.5</h3> 450<ul> 451<li>Fixed processing of retrofitted library interfaces. 452<li>Fixed processing of <code>.class</code> constructs in internal classes 453 targeted at JRE1.2 (the default in JDK1.4). 454<li>Fixed <code>-dump</code> option when <code>-outjar</code> option is not 455 present. 456<li>Updated documentation and examples. 457</ul> 458 459<h3><div>Nov 2002</div> Version 1.4</h3> 460<ul> 461<li>Now copying resource files over from the input jars to the output jar. 462<li>Added option to obfuscate using lower-case class names only. 463<li>Added better option for obfuscating native methods. 464<li>Added option not to ignore non-public library classes. 465<li>Added automatic <code>.class</code> detection for classes compiled with 466 Jikes. 467<li>Updated documentation and examples. 468</ul> 469 470<h3><div>Sep 2002</div> Version 1.3</h3> 471<ul> 472<li>Added support for wildcards in class names. 473<li>Added tool to de-obfuscate stack traces. 474<li>Added options to print processing information to files. 475<li>Added option to rename source file attributes. 476<li>Fixed processing of implicitly used interfaces targeted at JRE1.2 (the 477 default in JDK1.4) 478<li>Fixed processing of configurations with negated access modifiers. 479<li>Fixed duplicate class entry bug. 480<li>Updated documentation and examples. 481</ul> 482 483<h3><div>Aug 2002</div> Version 1.2</h3> 484<ul> 485<li>Improved speed. 486<li>Fixed processing of classes targeted at JRE1.2 (the default in JDK1.4) 487 with references to their own subclasses. 488<li>Fixed processing of static initializers in J2ME MIDP applications. 489<li>Fixed processing of retrofitted interfaces (again). 490<li>Added more flexible handling of white space in configuration. 491<li>Updated documentation. 492</ul> 493 494<h3><div>Jul 2002</div> Version 1.1</h3> 495<ul> 496<li>Added automatic detection of <code>Class.forName("MyClass")</code>, 497 <code>MyClass.class</code>, and 498 <code>(MyClass)Class.forName(variable).newInstance()</code> constructs. 499 This greatly simplifies configuration. 500<li>Added options to keep class names and class member names without affecting 501 any shrinking. They are mostly useful for native methods and serializable 502 classes. 503<li>Fixed processing of retrofitted interfaces. 504<li>Added handling of missing/invalid manifest file in input jar. 505<li>Updated documentation and examples. 506</ul> 507 508<h3><div>Jun 2002</div> Version 1.0</h3> 509<ul> 510<li>First public release, based on class parsing code from Mark Welsh's 511 <b>RetroGuard</b>. 512</ul> 513 514<hr> 515<address> 516Copyright © 2002-2009 517<a href="http://www.graphics.cornell.edu/~eric/">Eric Lafortune</a>. 518</address> 519 520</body> 521</html> 522