ProGuard is a free Java class file shrinker, optimizer, and obfuscator. It can detect and remove unused classes, fields, methods, and attributes. It can then optimize bytecode and remove unused instructions. Finally, it can rename the remaining classes, fields, and methods using short meaningless names. The resulting jars are smaller and harder to reverse-engineer.
More compact jar files also means smaller storage requirements, faster
transfer of applications across networks, faster loading, and smaller memory
ProGuard's main advantage compared to other Java obfuscators is
probably its compact template-based configuration. A few intuitive command
line options or a simple configuration file are usually sufficient. For
instance, the following configuration option preserves all applets in a jar:
-keep public class * extends java.applet.Applet
The user manual explains all available options and shows more examples of this
powerful configuration style.
ProGuard is fast. It only takes seconds to process programs and
libraries of several megabytes. The results section presents actual figures
for a number of applications.
ProGuard is a command-line tool with an optional graphical user
interface. It also comes with plugins for Ant and for the J2ME Wireless
Version 3.0 introduced bytecode optimization, reading and writing of nested
jars, and a brand new Ant task. Please report any problems, so they can be
-keep options more orthogonal and flexible, with option
- Added support for configuration by means of annotations.
- Now respecting naming rule for nested class names
EnclosingMethod attributes are being kept.
- Now also obfuscating package names, with new options
- Improved making classes and class members public or protected.
- Comparing modification times of input and output to avoid unnecessary
processing, with new option
- Now printing notes on suspiciously unkept classes in parameters of
- Printing notes for class names that don't seem to be fully qualified.
- Rewritten class file I/O code.
- Added support for uppercase filename extensions.
- Now supporting Java 6 class files.
- TODO: Finish up intra-procedural optimizations.
- TODO: Finish up Java 6 preverifier, with new option
- TODO: Update documentation and examples.