Downloads
ProGuard is distributed under the GNU General Public License.
Please consult the license page for more details.
ProGuard is written in Java. It requires a Java 2 runtime environment.
You can download the latest release (containing the program jar, the
documentation you're reading now, examples, and the source code) from this
location:
Download section (at SourceForge)
If you're still working with an older version of ProGuard, check out
the summary of changes below, to see if you're missing something essential.
Better look at the up-to-date on-line version if
you're reading a local copy of this page.
The download section may also contain updates with sub-minor version numbers.
These versions are typically released shortly after their parent versions, for
applying emergency fixes. Please make sure to look at those if you are
encountering any problems with recent releases.
Finally, there may be beta versions of upcoming releases. They may be of
interest too, because they typically contain any less urgent bug fixes
collected since the previous release.
Mar 2008
Version 4.2
- Refined data flow analysis in optimization step.
- Fixed handling of exceptions when inlining subroutines.
- Fixed inlining of incompatible code constructs between different java
versions.
- Fixed computation of local variable frame size.
- Fixed optimization of infinite loops.
- Fixed optimization of subroutine invocations.
- Fixed optimization of floating point remainder computations.
- Fixed removal of unused parameters in method descriptors containing arrays
of longs or doubles.
- Added undocumented java system properties
maximum.inlined.code.length
(default is 8) and
maximum.resulting.code.length
(defaults are 8000 for JSE and
2000 for JME), for expert users who read release notes.
- Fixed processing of generic types in Signature attributes in shrinking and
optimization steps.
- Fixed processing of inner class names in Signature attributes in obfuscation
step.
- Improved adapting resource file names following obfuscated class names.
- Fixed interpretation of package names in GUI.
- Fixed default settings for Xlets in GUI.
- Updated documentation and examples.
Dec 2007
Version 4.1
- Fixed shrinking of default annotation element values.
- Fixed optimization of invocations of methods in same class that are
accessed through extensions.
- Fixed optimization of invocations of synchronized methods without other
side-effects.
- Fixed optimization of some non-returning subroutines.
- Fixed handling of local variable debug information when inlining methods.
- Avoiding StackOverflowErrors during optimization of complex methods.
- Fixed obfuscation of potentially ambiguous non-primitive constants in
interfaces.
- Fixed preverification of some code constructs involving String, Class, and
exception types.
- The Ant task now allows empty
<injars>
and
<libraryjars>
elements.
- Updated documentation and examples.
Sep 2007
Version 4.0
- Added preverifier for Java 6 and Java Micro Edition, with new options
-microedition
and -dontpreverify
.
- Added new option
-target
to modify java version of processed
class files.
- Made
-keep
options more orthogonal and flexible, with option
modifiers allowshrinking
, allowoptimization
, and
allowobfuscation
.
- Added new wildcards for class member descriptors: "
***
",
matching any type, and "...
", matching any number of
arguments.
- Added support for configuration by means of annotations.
- Improved shrinking of unused annotations.
- Added check on modification times of input and output, to avoid unnecessary
processing, with new option
-forceprocessing
.
- Added new options
-flattenpackagehierarchy
and
-repackageclasses
(replacing -defaultpackage
) to
control obfuscation of package names.
- Added new options
-adaptresourcefilenames
and
-adaptresourcefilecontents
, with file filters, to update
resource files corresponding to obfuscated class names.
- Added detection of dynamically accessed fields and methods.
- Now treating
Exceptions
attributes as optional.
- Now respecting naming rule for nested class names
(
EnclosingClass$InnerClass
) in obfuscation step, if
InnerClasses
attributes or EnclosingMethod
attributes are being kept.
- Added new inter-procedural optimizations: method inlining and propagation
of constant fields, constant arguments, and constant return values.
- Added optimized local variable allocation.
- Added over 250 new peephole optimizations.
- Improved making classes and class members public or protected.
- Now printing notes on suspiciously unkept classes in parameters of
specified methods.
- Now printing notes for class names that don't seem to be fully qualified.
- Added support for uppercase filename extensions.
- Added tool tips to the GUI.
- Rewritten class file I/O code.
- Updated documentation and examples.
Upgrade considerations:
- Since ProGuard now treats the
Exceptions
attribute as
optional, you may have to specify -keepattributes Exceptions
,
notably when processing code that is to be used as a library.
- ProGuard now preverifies code for Java Micro Edition, if you specify the
option
-microedition
. You then no longer need to process the
code with an external preverifier.
- You should preferably specify
-repackageclasses
instead of the
old option name -defaultpackage
.
Dec 2007
Version 3.11
- Fixed optimization of invocations of methods in same class that are
accessed through extensions.
- Fixed optimization of invocations of synchronized methods without other
side-effects.
- Updated documentation and examples.
Aug 2007
Version 3.10
- Now handling mixed-case input class names when
-dontusemixedcaseclassnames
is specified.
- Fixed optimization of synchronization on classes, as compiled by Eclipse
and Jikes.
- Fixed optimization of switch statements with unreachable cases.
- Avoiding merging subsequent identically named files.
- Updated documentation and examples.
Jun 2007
Version 3.9
- Fixed processing of .class constructs in Java 6.
- Fixed repeated processing of .class constructs.
- Fixed possible division by 0 in optimization step.
- Fixed handling of variable instructions with variable indices larger than
255.
- Updated documentation and examples.
Mar 2007
Version 3.8
- Fixed optimization of parameters used as local variables.
- Fixed obfuscation with conflicting class member names.
- Fixed incremental obfuscation with incomplete mapping file for library jars.
- Updated documentation and examples.
Dec 2006
Version 3.7
- Now accepting Java 6 class files.
- Fixed shrinking of partially used annotations.
- Improved incremental obfuscation, with new option
-useuniqueclassmembernames
.
- Printing more information in case of conflicting configuration and input.
- Fixed optimization of repeated array length instruction.
- Fixed optimization of subsequent try/catch/finally blocks with return
statements.
- Fixed optimization of complex stack operations.
- Fixed optimization of simple infinite loops.
- Fixed optimization of expressions with constant doubles.
- Tuned optimization to improve size reduction after preverification.
- Fixed overflows of offsets in long code blocks.
- Now allowing class names containing dashes.
- Updated documentation and examples.
May 2006
Version 3.6
- No longer automatically keeping classes in parameters of specified methods
from obfuscation and optimization (introduced in version 3.4).
- Fixed inlining of interfaces that are used in .class constructs.
- Fixed removal of busy-waiting loops reading volatile fields.
- Fixed optimization of comparisons of known integers.
- Fixed optimization of known branches.
- Fixed optimization of method calls on arrays of interfaces.
- Fixed optimization of method calls without side-effects.
- Fixed optimization of nested try/catch/finally blocks with return
statements.
- Fixed initialization of library classes that only appear in descriptors.
- Fixed matching of primitive type wildcards in configuration.
- Fixed the boilerplate specification for enumerations in the GUI.
- Updated documentation and examples.
Jan 2006
Version 3.5
- Fixed obfuscation of class members with complex visibility.
- Fixed optimization bugs causing stack verification errors.
- Fixed optimization bug causing overridden methods to be finalized.
- Fixed optimization bug causing abstract method errors for retro-fitted
library methods.
- Fixed optimization bug evaluating code with constant long values.
- Fixed bug in updating of optional local variable table attributes and local
variable type table attributes after optimization.
- Fixed interpretation of comma-separated class names without wildcards.
- Updated documentation and examples.
Oct 2005
Version 3.4
- Extended optimizations: removing duplicate code within methods.
- Extended regular expressions for class names to comma-separated lists.
- Now automatically keeping classes in descriptors of kept class members.
- Added verbose statistics for optimizations.
- Added boilerplate Number optimizations in GUI.
- Fixed
Class.forName
detection.
- Fixed incremental obfuscation bug.
- Fixed optimization bug causing stack verification errors.
- Fixed optimization bugs related to removal of unused parameters.
- Fixed exception when optimizing code with many local variables.
- Fixed exception when saving configuration with initializers in GUI.
- Updated documentation and examples.
Jun 2005
Version 3.3
- Extended optimizations: making methods private and static when possible,
making classes static when possible, removing unused parameters.
- Made file names relative to the configuration files in which they are
specified. Added
-basedirectory
option.
- Added
-whyareyoukeeping
option to get details on why given
classes and class members are being kept.
- Added warnings for misplaced class files.
- Improved printing of notes for
Class.forName
constructs.
- Implemented '
assumenosideeffects
' nested element in Ant task.
- Improved processing of annotations.
- Fixed reading and writing of parameter annotations.
- Fixed various optimization bugs.
- Fixed wildcards not matching '-' character.
- Fixed wildcard bug and checkbox bugs in GUI.
- Setting file chooser defaults in GUI.
- Leaving room for growBox in GUI on Mac OS X.
- Properly closing configuration files.
- Updated documentation and examples.
Dec 2004
Version 3.2
- Fixed JDK5.0 processing bugs.
- Fixed optimization bugs.
- Fixed relative paths in Ant task.
- Improved speed of shrinking step.
- Updated documentation and examples.
Nov 2004
Version 3.1
- Improved obfuscation and shrinking of private class members.
- Added inlining of interfaces with single implementations.
- Added option to specify obfuscation dictionary.
- Added option to read package visible library class members.
- Extended support for JDK5.0 attributes.
- Fixed various optimization bugs.
- Modified Ant task to accept paths instead of filesets.
- Fixed two Ant task bugs.
- Updated documentation and examples.
Aug 2004
Version 3.0
- Added bytecode optimization step, between shrinking step and obfuscation
step.
- Generalized filtered recursive reading and writing of jars, wars, ears,
zips, and directories.
- Added support for grouping input and output jars, wars, ears, zips, and
directories.
- Added support for applying mapping files to library classes.
- Removed
-resourcejars
option. Resources should now be read
using regular -injars
options, using filters if necessary.
- Rewrote Ant task. Input and output modification dates are not checked at
the moment. Minor changes in XML schema:
- Filters now specified using attributes.
- '
outjars
' now nested element instead of attribute.
- '
type
' attribute of <method>
element no
longer defaults to 'void
'.
<
and >
characters now have to be
encoded in embedded configurations.
<proguardconfiguration>
task no longer accepts
attributes.
- Updated J2ME WTK plugin, now customizable through configuration file.
- Updated GUI.
- Fixed various processing bugs.
- Fixed ReTrace parsing bugs.
- Improved jar compression.
- Updated documentation and examples.
Mar 2004
Version 2.1
- Added support for JDK1.5 classes.
- Added additional wildcard for matching primitive types.
- Added possibility to switch off notes about duplicate class definitions.
- Fixed use of multiple filters on output jars.
- Fixed option to keep all attributes.
- Fixed various Ant task bugs.
- Updated documentation and examples.
Dec 2003
Version 2.0
- Added a graphical user interface for ProGuard and ReTrace.
- Added
-applymapping
option for incremental obfuscation.
- Added support for filtering input and output files.
- Added support for the J++
SourceDir
attribute.
- Improved detection of
.class
constructs.
- Improved handling of misplaced manifest files.
- Improved implementation of ReTrace.
- Worked around String UTF-8 encoding bug affecting foreign characters.
- Fixed exception when ignoring warnings.
- Fixed various Ant task bugs.
- Updated documentation and examples.
Aug 2003
Version 1.7
- Fixed various Ant task bugs.
- Fixed ClassCastException due to explicitly used abstract classes with
implicitly used interfaces targeted at JRE1.2 (the default in JDK1.4).
- Fixed
-defaultpackage
bug for protected classes and class
members.
- Fixed ReTrace bug when retracing without line number tables.
- Worked around zip package problems with duplicate out entries and rogue
manifest files.
- Added work-around for handling malformed legacy interface class files.
- Updated documentation and examples.
May 2003
Version 1.6
- Added support for Ant.
- Added support for the J2ME Wireless Toolkit.
- Added support for reading and writing directory hierarchies.
- Added option for specifying resource jars and directories.
- Added support for wildcards in class member specifications.
- Improved handling of the
-defaultpackage
option.
- Improved stack trace parsing in ReTrace tool.
- Fixed processing of libraries containing public as well as non-public
extensions of non-public classes.
- Fixed examples for processing libraries, midlets, and serializable code.
- Updated documentation and examples.
Jan 2003
Version 1.5
- Fixed processing of retrofitted library interfaces.
- Fixed processing of
.class
constructs in internal classes
targeted at JRE1.2 (the default in JDK1.4).
- Fixed
-dump
option when -outjar
option is not
present.
- Updated documentation and examples.
Nov 2002
Version 1.4
- Now copying resource files over from the input jars to the output jar.
- Added option to obfuscate using lower-case class names only.
- Added better option for obfuscating native methods.
- Added option not to ignore non-public library classes.
- Added automatic
.class
detection for classes compiled with
Jikes.
- Updated documentation and examples.
Sep 2002
Version 1.3
- Added support for wildcards in class names.
- Added tool to de-obfuscate stack traces.
- Added options to print processing information to files.
- Added option to rename source file attributes.
- Fixed processing of implicitly used interfaces targeted at JRE1.2 (the
default in JDK1.4)
- Fixed processing of configurations with negated access modifiers.
- Fixed duplicate class entry bug.
- Updated documentation and examples.
Aug 2002
Version 1.2
- Improved speed.
- Fixed processing of classes targeted at JRE1.2 (the default in JDK1.4)
with references to their own subclasses.
- Fixed processing of static initializers in J2ME MIDP applications.
- Fixed processing of retrofitted interfaces (again).
- Added more flexible handling of white space in configuration.
- Updated documentation.
Jul 2002
Version 1.1
Jun 2002
Version 1.0
- First public release, based on class parsing code from Mark Welsh's
RetroGuard.
Copyright © 2002-2007
Eric Lafortune.