summaryrefslogtreecommitdiff
path: root/docs
diff options
context:
space:
mode:
authorYing Wang <wangying@google.com>2012-02-27 18:34:24 -0800
committerYing Wang <wangying@google.com>2012-02-27 18:34:24 -0800
commit9f606f95f03a75961498803e24bee6799a7c0885 (patch)
treea45f4d74feda9b76277a0c9ced55ad15d82248a1 /docs
parentcfead78069f3dc32998dc118ee08cab3867acea2 (diff)
downloadproguard-9f606f95f03a75961498803e24bee6799a7c0885.tar.gz
This reverts commit cfead78069f3dc32998dc118ee08cab3867acea2. Bug: 6079915
Diffstat (limited to 'docs')
-rw-r--r--docs/FAQ.html159
-rw-r--r--docs/GPL_exception.html20
-rw-r--r--docs/acknowledgements.html42
-rw-r--r--docs/alternatives.html748
-rw-r--r--docs/downloads.html110
-rw-r--r--docs/feedback.html56
-rw-r--r--docs/index.html44
-rw-r--r--docs/license.html27
-rw-r--r--docs/luciadlogo.pngbin0 -> 2356 bytes
-rw-r--r--docs/main.html66
-rw-r--r--docs/manual/ant.html56
-rw-r--r--docs/manual/examples.html576
-rw-r--r--docs/manual/gui.html199
-rw-r--r--docs/manual/index.html44
-rw-r--r--docs/manual/introduction.html81
-rw-r--r--docs/manual/limitations.html57
-rw-r--r--docs/manual/optimizations.html26
-rw-r--r--docs/manual/refcard.html45
-rw-r--r--docs/manual/retrace/examples.html37
-rw-r--r--docs/manual/retrace/index.html26
-rw-r--r--docs/manual/retrace/introduction.html21
-rw-r--r--docs/manual/retrace/usage.html26
-rw-r--r--docs/manual/sections.html14
-rw-r--r--docs/manual/style.css19
-rw-r--r--docs/manual/troubleshooting.html227
-rw-r--r--docs/manual/usage.html272
-rw-r--r--docs/manual/wtk.html22
-rw-r--r--docs/quality.html22
-rw-r--r--docs/results.html33
-rw-r--r--docs/saikoalogo.pngbin2901 -> 0 bytes
-rw-r--r--docs/sanawarelogo.pngbin0 -> 8552 bytes
-rw-r--r--docs/screenshots.html27
-rw-r--r--docs/sections.html26
-rw-r--r--docs/style.css15
-rw-r--r--docs/testimonials.html73
-rw-r--r--docs/title.html6
36 files changed, 1217 insertions, 2005 deletions
diff --git a/docs/FAQ.html b/docs/FAQ.html
index bdc9c04..8f19b15 100644
--- a/docs/FAQ.html
+++ b/docs/FAQ.html
@@ -1,21 +1,10 @@
-<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!doctype html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<meta http-equiv="content-style-type" content="text/css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>ProGuard FAQ</title>
-<script type="text/javascript" language="JavaScript">
-<!--
-if (window.self==window.top)
- window.top.location.replace("index.html#"+window.location.pathname+window.location.hash);
-else {
- var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
- if (window.top.location.hash!=hash)
- window.top.location.hash=hash;
-}
-//-->
-</script>
</head>
<body>
@@ -24,37 +13,35 @@ else {
<h3>Contents</h3>
<ol>
-<li><a href="#shrinking">What is shrinking?</a></li>
-<li><a href="#obfuscation">What is obfuscation?</a></li>
-<li><a href="#preverification">What is preverification?</a></li>
+<li><a href="#shrinking">What is shrinking?</a>
+<li><a href="#obfuscation">What is obfuscation?</a>
+<li><a href="#preverification">What is preverification?</a>
<li><a href="#optimization">What kind of optimizations does <b>ProGuard</b>
- support?</a></li>
+ support?</a>
<li><a href="#commercial">Can I use <b>ProGuard</b> to process my commercial
- application?</a></li>
+ application?</a>
<li><a href="#jdk1.4">Does <b>ProGuard</b> work with Java 2? Java 5? Java
- 6?</a></li>
-<li><a href="#jme">Does <b>ProGuard</b> work with Java Micro Edition?</a></li>
-<li><a href="#android">Does <b>ProGuard</b> work for Google Android
- code?</a></li>
-<li><a href="#blackberry">Does <b>ProGuard</b> work for Blackberry
- code?</a></li>
-<li><a href="#ant">Does <b>ProGuard</b> have support for Ant?</a></li>
-<li><a href="#gui">Does <b>ProGuard</b> come with a GUI?</a></li>
+ 6?</a>
+<li><a href="#jme">Does <b>ProGuard</b> work with Java Micro Edition?</a>
+<li><a href="#android">Does <b>ProGuard</b> work for Google Android code?</a>
+<li><a href="#blackberry">Does <b>ProGuard</b> work for Blackberry code?</a>
+<li><a href="#ant">Does <b>ProGuard</b> have support for Ant?</a>
+<li><a href="#gui">Does <b>ProGuard</b> come with a GUI?</a>
<li><a href="#forname">Does <b>ProGuard</b> handle <code>Class.forName</code>
- calls?</a></li>
-<li><a href="#resource">Does <b>ProGuard</b> handle resource files?</a></li>
-<li><a href="#encrypt">Does <b>ProGuard</b> encrypt strings constants?</a></li>
-<li><a href="#flow">Does <b>ProGuard</b> perform control flow
- obfuscation?</a></li>
+ calls?</a>
+<li><a href="#resource">Does <b>ProGuard</b> handle resource files?</a>
+<li><a href="#encrypt">Does <b>ProGuard</b> encrypt strings constants?</a>
+<li><a href="#flow">Does <b>ProGuard</b> perform control flow obfuscation?</a>
<li><a href="#incremental">Does <b>ProGuard</b> support incremental
- obfuscation?</a></li>
+ obfuscation?</a>
<li><a href="#keywords">Can <b>ProGuard</b> obfuscate using reserved
- keywords?</a></li>
+ keywords?</a>
<li><a href="#stacktrace">Can <b>ProGuard</b> reconstruct obfuscated stack
- traces?</a></li>
+ traces?</a>
</ol>
-<h3><a name="shrinking">What is shrinking?</a></h3>
+<a name="shrinking">&nbsp;</a>
+<h3>What is shrinking?</h3>
Java source code (.java files) is typically compiled to bytecode (.class
files). Bytecode is more compact than Java source code, but it may still
@@ -63,7 +50,8 @@ Shrinking programs such as <b>ProGuard</b> can analyze bytecode and remove
unused classes, fields, and methods. The program remains functionally
equivalent, including the information given in exception stack traces.
-<h3><a name="obfuscation">What is obfuscation?</a></h3>
+<a name="obfuscation">&nbsp;</a>
+<h3>What is obfuscation?</h3>
By default, compiled bytecode still contains a lot of debugging information:
source file names, line numbers, field names, method names, argument names,
@@ -75,7 +63,8 @@ it much harder to reverse-engineer the code. It further compacts the code as a
bonus. The program remains functionally equivalent, except for the class
names, method names, and line numbers given in exception stack traces.
-<h3><a name="preverification">What is preverification?</a></h3>
+<a name="preverification">&nbsp;</a>
+<h3>What is preverification?</h3>
When loading class files, the class loader performs some sophisticated
verification of the byte code. This analysis makes sure the code can't
@@ -88,7 +77,8 @@ then be loaded faster and in a more memory-efficient way. <b>ProGuard</b> can
perform the preverification step too, for instance allowing to retarget older
class files at Java 6.
-<h3><a name="optimization">What kind of optimizations does <b>ProGuard</b> support?</a></h3>
+<a name="optimization">&nbsp;</a>
+<h3>What kind of optimizations does <b>ProGuard</b> support?</h3>
Apart from removing unused classes, fields, and methods in the shrinking step,
<b>ProGuard</b> can also perform optimizations at the bytecode level, inside
@@ -97,24 +87,24 @@ analysis, partial evaluation, static single assignment, global value numbering,
and liveness analysis, <b>ProGuard</b> can:
<ul>
-<li>Evaluate constant expressions.</li>
-<li>Remove unnecessary field accesses and method calls.</li>
-<li>Remove unnecessary branches.</li>
-<li>Remove unnecessary comparisons and instanceof tests.</li>
-<li>Remove unused code blocks.</li>
-<li>Merge identical code blocks.</li>
-<li>Reduce variable allocation.</li>
-<li>Remove write-only fields and unused method parameters.</li>
-<li>Inline constant fields, method parameters, and return values.</li>
-<li>Inline methods that are short or only called once.</li>
-<li>Simplify tail recursion calls.</li>
-<li>Merge classes and interfaces.</li>
-<li>Make methods private, static, and final when possible.</li>
-<li>Make classes static and final when possible.</li>
-<li>Replace interfaces that have single implementations.</li>
+<li>Evaluate constant expressions.
+<li>Remove unnecessary field accesses and method calls.
+<li>Remove unnecessary branches.
+<li>Remove unnecessary comparisons and instanceof tests.
+<li>Remove unused code blocks.
+<li>Merge identical code blocks.
+<li>Reduce variable allocation.
+<li>Remove write-only fields and unused method parameters.
+<li>Inline constant fields, method parameters, and return values.
+<li>Inline methods that are short or only called once.
+<li>Simplify tail recursion calls.
+<li>Merge classes and interfaces.
+<li>Make methods private, static, and final when possible.
+<li>Make classes static and final when possible.
+<li>Replace interfaces that have single implementations.
<li>Perform over 200 peephole optimizations, like replacing ...*2 by
- ...&lt;&lt;1.</li>
-<li>Optionally remove logging code.</li>
+ ...&lt;&lt;1.
+<li>Optionally remove logging code.
</ul>
The positive effects of these optimizations will depend on your code and on
the virtual machine on which the code is executed. Simple virtual machines may
@@ -123,26 +113,27 @@ At the very least, your bytecode may become a bit smaller.
<p>
Some notable optimizations that aren't supported yet:
<ul>
-<li>Moving constant expressions out of loops.</li>
-<li>Optimizations that require escape analysis.</li>
+<li>Moving constant expressions out of loops.
+<li>Optimizations that require escape analysis.
</ul>
-<h3><a name="commercial">Can I use <b>ProGuard</b> to process my commercial application?</a></h3>
+<a name="commercial">&nbsp;</a>
+<h3>Can I use <b>ProGuard</b> to process my commercial application?</h3>
Yes, you can. <b>ProGuard</b> itself is distributed under the GPL, but this
doesn't affect the programs that you process. Your code remains yours, and
its license can remain the same.
-<h3><a name="jdk1.4">Does <b>ProGuard</b> work with Java 2? Java 5? Java 6? Java 7?</a></h3>
+<a name="jdk1.4">&nbsp;</a>
+<h3>Does <b>ProGuard</b> work with Java 2? Java 5? Java 6?</h3>
-Yes, <b>ProGuard</b> supports all JDKs from 1.1 up to and including 7.0. Java 2
+Yes, <b>ProGuard</b> supports all JDKs from 1.1 up to and including 6.0. Java 2
introduced some small differences in the class file format. Java 5 added
-attributes for generics and for annotations. Java 6 introduced optional
-preverification attributes. Java 7 made preverification obligatory and
-introduced support for dynamic languages. <b>ProGuard</b> handles all versions
-correctly.
+attributes for generics and for annotations. Java 6 introduced preverification
+attributes. <b>ProGuard</b> handles all versions correctly.
-<h3><a name="jme">Does <b>ProGuard</b> work with Java Micro Edition?</a></h3>
+<a name="jme">&nbsp;</a>
+<h3>Does <b>ProGuard</b> work with Java Micro Edition?</h3>
Yes. <b>ProGuard</b> itself runs in Java Standard Edition, but you can freely
specify the run-time environment at which your programs are targeted,
@@ -153,14 +144,16 @@ preverifier.
<b>ProGuard</b> also comes with an obfuscator plug-in for the JME Wireless
Toolkit.
-<h3><a name="android">Does <b>ProGuard</b> work for Google Android code?</a></h3>
+<a name="android">&nbsp;</a>
+<h3>Does <b>ProGuard</b> work for Google Android code?</h3>
Yes. Google's <code>dx</code> compiler converts ordinary jar files into files
that run on Android devices. By preprocessing the original jar files,
<b>ProGuard</b> can significantly reduce the file sizes and boost the run-time
performance of the code.
-<h3><a name="blackberry">Does <b>ProGuard</b> work for Blackberry code?</a></h3>
+<a name="blackberry">&nbsp;</a>
+<h3>Does <b>ProGuard</b> work for Blackberry code?</h3>
It should. RIM's proprietary <code>rapc</code> compiler converts ordinary JME
jar files into cod files that run on Blackberry devices. The compiler performs
@@ -170,21 +163,24 @@ percent. However, the <code>rapc</code> compiler also seems to contain some
bugs. It sometimes fails on obfuscated code that is valid and accepted by other
JME tools and VMs. Your mileage may therefore vary.
-<h3><a name="ant">Does <b>ProGuard</b> have support for Ant?</a></h3>
+<a name="ant">&nbsp;</a>
+<h3>Does <b>ProGuard</b> have support for Ant?</h3>
Yes. <b>ProGuard</b> provides an Ant task, so that it integrates seamlessly
into your Ant build processes. You can still use configurations in
<b>ProGuard</b>'s own readable format. Alternatively, if you prefer XML, you
can specify the equivalent XML configuration.
-<h3><a name="gui">Does <b>ProGuard</b> come with a GUI?</a></h3>
+<a name="gui">&nbsp;</a>
+<h3>Does <b>ProGuard</b> come with a GUI?</h3>
Yes. First of all, <b>ProGuard</b> is perfectly usable as a command-line tool
that can easily be integrated into any automatic build process. For casual
users, there's also a graphical user interface that simplifies creating,
loading, editing, executing, and saving ProGuard configurations.
-<h3><a name="forname">Does <b>ProGuard</b> handle <code>Class.forName</code> calls?</a></h3>
+<a name="forname">&nbsp;</a>
+<h3>Does <b>ProGuard</b> handle <code>Class.forName</code> calls?</h3>
Yes. <b>ProGuard</b> automatically handles constructs like
<code>Class.forName("SomeClass")</code> and <code>SomeClass.class</code>. The
@@ -199,19 +195,22 @@ be an indication that the class or interface <code>SomeClass</code> and/or its
implementations may need to be preserved. The user can adapt his configuration
accordingly.
-<h3><a name="resource">Does <b>ProGuard</b> handle resource files?</a></h3>
+<a name="resource">&nbsp;</a>
+<h3>Does <b>ProGuard</b> handle resource files?</h3>
Yes. <b>ProGuard</b> copies all non-class resource files, optionally adapting
their names and their contents to the obfuscation that has been applied.
-<h3><a name="encrypt">Does <b>ProGuard</b> encrypt strings constants?</a></h3>
+<a name="encrypt">&nbsp;</a>
+<h3>Does <b>ProGuard</b> encrypt strings constants?</h3>
No. Storing encrypted string constants in program code is fairly futile, since
the encryption has to be perfectly reversible by definition. Moreover, the
decryption costs additional memory and computation at run-time. If this feature
is ever incorporated, I'll provide a tool to decrypt the strings as well.
-<h3><a name="flow">Does <b>ProGuard</b> perform flow obfuscation?</a></h3>
+<a name="flow">&nbsp;</a>
+<h3>Does <b>ProGuard</b> perform flow obfuscation?</h3>
Not explicitly. Control flow obfuscation injects additional branches into the
bytecode, in an attempt to fool decompilers. <b>ProGuard</b> does not do this,
@@ -219,13 +218,15 @@ in order to avoid any negative effects on performance and size. However, the
optimization step often already restructures the code to the point where most
decompilers get confused.
-<h3><a name="incremental">Does <b>ProGuard</b> support incremental obfuscation?</a></h3>
+<a name="incremental">&nbsp;</a>
+<h3>Does <b>ProGuard</b> support incremental obfuscation?</h3>
Yes. This feature allows you to specify a previous obfuscation mapping file in
a new obfuscation step, in order to produce add-ons or patches for obfuscated
code.
-<h3><a name="keywords">Can <b>ProGuard</b> obfuscate using reserved keywords?</a></h3>
+<a name="keywords">&nbsp;</a>
+<h3>Can <b>ProGuard</b> obfuscate using reserved keywords?</h3>
Yes. You can specify your own obfuscation dictionary, such as a list of
reserved key words, identifiers with foreign characters, random source files,
@@ -233,7 +234,8 @@ or a text by Shakespeare. Note that this hardly improves the obfuscation.
Decent decompilers can automatically replace reserved keywords, and the effect
can be undone fairly easily, by obfuscating again with simpler names.
-<h3><a name="stacktrace">Can <b>ProGuard</b> reconstruct obfuscated stack traces?</a></h3>
+<a name="stacktrace">&nbsp;</a>
+<h3>Can <b>ProGuard</b> reconstruct obfuscated stack traces?</h3>
Yes. <b>ProGuard</b> comes with a companion tool, <b>ReTrace</b>, that can
'de-obfuscate' stack traces produced by obfuscated applications. The
@@ -243,11 +245,10 @@ names is presented for each obfuscated method name that has an ambiguous
reverse mapping. Please refer to the <a href="manual/index.html">ProGuard User
Manual</a> for more details.
-<hr />
-<noscript><div><a target="_top" href="index.html" class="button">Show menu</a></div></noscript>
+<hr>
<address>
-Copyright &copy; 2002-2011
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2009
+<a href="http://www.graphics.cornell.edu/~eric/">Eric Lafortune</a>.
</address>
</body>
</html>
diff --git a/docs/GPL_exception.html b/docs/GPL_exception.html
index 0a1cd4f..0a44d66 100644
--- a/docs/GPL_exception.html
+++ b/docs/GPL_exception.html
@@ -7,7 +7,7 @@
<H1>Special Exception to the GNU General Public License</H1>
<P>
-Copyright &copy; 2002-2011 Eric Lafortune
+Copyright &copy; 2002-2009 Eric Lafortune
</P>
<P>
@@ -33,17 +33,13 @@ Place, Suite 330, Boston, MA 02111-1307 USA
In addition, as a special exception, Eric Lafortune gives permission to link
the code of this program with the following stand-alone applications:
<ul>
-<li>Apache Ant,</li>
-<li>Apache Maven,</li>
-<li>the Google Android SDK,</li>
-<li>the Eclipse ProGuardDT GUI,</li>
-<li>the EclipseME JME IDE,</li>
-<li>the Oracle NetBeans Java IDE,</li>
-<li>the Oracle JME Wireless Toolkit,</li>
-<li>the Simple Build Tool for Scala (and its scripts),</li>
-<li>the NeoMAD Tools by Neomades,</li>
-<li>the Javaground Tools, and</li>
-<li>the Sanaware Tools,</li>
+<li>Apache Ant,
+<li>Apache Maven,
+<li>the Eclipse ProGuardDT GUI,
+<li>the EclipseME JME IDE,
+<li>the Sun NetBeans Java IDE,
+<li>the Sun JME Wireless Toolkit, and
+<li>the Javaground Tools,
</ul>
and distribute linked combinations including the two. You must obey the GNU
General Public License in all respects for all of the code used other than
diff --git a/docs/acknowledgements.html b/docs/acknowledgements.html
index 96ed635..af19461 100644
--- a/docs/acknowledgements.html
+++ b/docs/acknowledgements.html
@@ -1,21 +1,10 @@
-<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!doctype html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<meta http-equiv="content-style-type" content="text/css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>ProGuard Acknowledgements</title>
-<script type="text/javascript" language="JavaScript">
-<!--
-if (window.self==window.top)
- window.top.location.replace("index.html#"+window.location.pathname+window.location.hash);
-else {
- var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
- if (window.top.location.hash!=hash)
- window.top.location.hash=hash;
-}
-//-->
-</script>
</head>
<body>
@@ -44,32 +33,35 @@ QZ Shines, Thomas Singer, Michele Puccini, Roman Bednarek, Natalia Pujol,
Daniel Sj&ouml;blom, Jan Filipsky, Charles Smith, Gerrit Telkamp, Noel
Grandin, Torbj&ouml;rn S&ouml;derstedt, Clemens Eisserer, Clark Bassett,
Eduard Welch, Dawid Weiss, Andrew Wilson, Sean Owen, Niels Gron, Ishan Mehta,
-Steven Adams, Xavier Kral, Stefan Martin, Toby Reyelts,
+Steven Adams, Xavier Kral,
and many others. Thanks! Your feedback has been invaluable.
<p>
-<a href="http://www.saikoa.com/" target="_top">Saikoa</a> is providing the
-financial resources for this project.
+I am developing ProGuard in my spare time, which is possible thanks to my
+day-time job at <a href="http://www.luciad.com/" target="other">Luciad</a>.
<p>
<a href="http://sourceforge.net/projects/proguard/"
-target="other">SourceForge</a> is providing the resources for hosting this
-project and many other projects.
+target="other">SourceForge</a> is generously providing the resources for
+hosting this project and many other projects.
<p>
-The code and these web pages were written using Oracle/Sun's JDKs, Linux,
-IntelliJ IDEA, GNU emacs, bash, sed, awk, and a whole host of other tools that
-continue to make programming interesting.
+JetBrains is kindly providing a license for its IntelliJ IDEA development
+environment.
<p>
-And finally, I'm a great fan of Sanaware's <a
+The code and these web pages were written using Sun's JDKs, Linux, IntelliJ
+IDEA, GNU emacs, bash, sed, awk, and a whole host of other tools that continue
+to make programming interesting.
+<p>
+
+And finally, I'm a great fan of the <a
href="http://www.javadocking.com/" target="other">Java Docking Library</a>.
-<hr />
-<noscript><div><a target="_top" href="index.html" class="button">Show menu</a></div></noscript>
+<hr>
<address>
-Copyright &copy; 2002-2011
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2009
+<a href="http://www.graphics.cornell.edu/~eric/">Eric Lafortune</a>.
</address>
</body>
diff --git a/docs/alternatives.html b/docs/alternatives.html
index f235692..fa5db0c 100644
--- a/docs/alternatives.html
+++ b/docs/alternatives.html
@@ -1,21 +1,10 @@
-<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!doctype html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<meta http-equiv="content-style-type" content="text/css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>ProGuard Alternatives</title>
-<script type="text/javascript" language="JavaScript">
-<!--
-if (window.self==window.top)
- window.top.location.replace("index.html#"+window.location.pathname+window.location.hash);
-else {
- var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
- if (window.top.location.hash!=hash)
- window.top.location.hash=hash;
-}
-//-->
-</script>
</head>
<body>
@@ -45,642 +34,612 @@ below is incorrect.
</tr>
<tr>
-<td><a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a></td>
+<td><a target="other" href="http://www.graphics.cornell.edu/~eric/">Eric Lafortune</a></td>
<td><a target="_top" href="http://proguard.sourceforge.net/">ProGuard</a></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
<td>Free (GPL)</td>
</tr>
<tr>
<td><a target="other" rel="nofollow" href="http://www.informatik.uni-oldenburg.de/leute/hoenicke.html">Jochen Hoenicke</a></td>
<td><a target="other" href="http://jode.sourceforge.net/">Jode</a></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
<td>Free (GPL)</td>
</tr>
<tr>
+<td><a target="other" rel="nofollow" href="http://www.nq4.de/">NQ4</a></td>
+<td><a target="other" href="http://www.nq4.de/">Joga</a></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
+<td>Free (no source)</td>
+</tr>
+
+<tr>
<td><a target="other" rel="nofollow" href="http://www.cs.cornell.edu/nystrom/">Nate Nystrom</a></td>
<td><a target="other" href="http://www.cs.purdue.edu/homes/hosking/bloat/">Bloat</a></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
-<td align="center"><br /></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
+<td align="center"><br></td>
<td>Free</td>
</tr>
<tr>
<td><a target="other" rel="nofollow" href="http://sourceforge.net/users/hchacha/">Hidetoshi Ohuchi</a></td>
<td><a target="other" href="http://jarg.sourceforge.net/">Jarg</a></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
<td>Free (BSD)</td>
</tr>
<tr>
+<td><a target="other" rel="nofollow" href="http://www.geocities.com/CapeCanaveral/Hall/2334/resume.html">Alexander Shvets</a></td>
+<td><a target="other" href="http://www.geocities.com/CapeCanaveral/Hall/2334/Programs/cafebabe.html">CafeBabe</a></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
+<td>Free</td>
+</tr>
+
+<tr>
<td><a target="other" rel="nofollow" href="http://www.yworks.com/">yWorks</a></td>
<td><a target="other" href="http://www.yworks.com/en/products_yguard_about.htm">yGuard</a></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
<td>Free (no source)</td>
</tr>
<tr>
+<td><a target="other" rel="nofollow" href="http://www.cs.purdue.edu/homes/grothoff/">Christian Grothoff</a></td>
+<td><a target="other" href="http://www.ovmj.org/jamit/">Jamit</a></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
+<td align="center"><br></td>
+<td align="center"><br></td>
+<td>Free (GPL)</td>
+</tr>
+
+<tr>
<td><a target="other" rel="nofollow" href="http://mojo.codehaus.org/">Mojo</a></td>
<td><a target="other" href="http://mojo.codehaus.org/minijar-maven-plugin/">Minijar</a></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
-<td align="center"><br /></td>
-<td align="center"><br /></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
+<td align="center"><br></td>
+<td align="center"><br></td>
<td>Free (Apache)</td>
</tr>
<tr>
<td><a target="other" rel="nofollow" href="http://www.riggshill.com/">RiggsHill Software</a></td>
<td><a target="other" href="http://genjar.sourceforge.net/">GenJar</a></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
-<td align="center"><br /></td>
-<td align="center"><br /></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
+<td align="center"><br></td>
+<td align="center"><br></td>
<td>Free (Apache)</td>
</tr>
<tr>
<td><a target="other" rel="nofollow" href="http://ant.apache.org/">Apache</a></td>
-<td><a target="other" href="http://ant.apache.org/manual/Types/classfileset.html">Ant Classfileset</a></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
-<td align="center"><br /></td>
-<td align="center"><br /></td>
-<td>Free (Apache)</td>
-</tr>
-
-<tr>
-<td><a target="other" rel="nofollow" href="http://www.celton.mobi/">Carsten Elton S&oslash;rensen</a></td>
-<td><a target="other" href="http://code.google.com/p/treeshaker/">Treeshaker</a></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
-<td align="center"><br /></td>
-<td align="center"><br /></td>
+<td><a target="other" href="http://ant.apache.org/manual/OptionalTypes/classfileset.html">Ant Classfileset</a></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
+<td align="center"><br></td>
+<td align="center"><br></td>
<td>Free (Apache)</td>
</tr>
<tr>
-<td><a target="other" rel="nofollow" href="http://www.ucdetector.org/">J&ouml;rg Spieler</a></td>
-<td><a target="other" href="http://www.ucdetector.org/">UCDetector</a></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
-<td align="center"><br /></td>
-<td align="center"><br /></td>
-<td>Free (EPL)</td>
-</tr>
-
-<tr>
<td><a target="other" rel="nofollow" href="http://www.curious-creature.org/">Romain Guy</a></td>
<td><a target="other" href="http://www.jroller.com/gfx/entry/get_what_you_need_from">Harvester</a></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
-<td align="center"><br /></td>
-<td align="center"><br /></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
+<td align="center"><br></td>
+<td align="center"><br></td>
<td>Free (BSD)</td>
</tr>
<tr>
-<td><a target="other" rel="nofollow" href="http://java.net/projects/dcd/">Emeric Vernat</a></td>
-<td><a target="other" href="http://java.net/projects/dcd/">DCD</a></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
-<td align="center"><br /></td>
-<td align="center"><br /></td>
+<td><a target="other" rel="nofollow" href="https://dcd.dev.java.net/">Emeric Vernat</a></td>
+<td><a target="other" href="https://dcd.dev.java.net/">DCD</a></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
+<td align="center"><br></td>
+<td align="center"><br></td>
<td>Free (LGPL)</td>
</tr>
<tr>
<td><a target="other" rel="nofollow" href="http://sadun-util.sourceforge.net/">Cristiano Sadun</a></td>
<td><a target="other" href="http://sadun-util.sourceforge.net/pack.html">Pack</a></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
-<td align="center"><br /></td>
-<td align="center"><br /></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
+<td align="center"><br></td>
+<td align="center"><br></td>
+<td>Free (LGPL)</td>
+</tr>
+
+<tr>
+<td><a target="other" rel="nofollow" href="http://darcs.brianweb.net/">Brian Alliet</a></td>
+<td><a target="other" href="http://darcs.brianweb.net/gcclass/">Gcclass</a></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
+<td align="center"><br></td>
+<td align="center"><br></td>
<td>Free (LGPL)</td>
</tr>
<tr>
<td><a target="other" rel="nofollow" href="http://www.sable.mcgill.ca/">Sable</a></td>
<td><a target="other" href="http://www.sable.mcgill.ca/soot/">Soot</a></td>
-<td align="center"><br /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
-<td align="center"><br /></td>
+<td align="center"><br></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
+<td align="center"><br></td>
<td>Free (LGPL)</td>
</tr>
<tr>
<td><a target="other" rel="nofollow" href="http://www.garret.ru/~knizhnik/">Konstantin Knizhnik</a></td>
<td><a target="other" href="http://www.garret.ru/~knizhnik/javago/ReadMe.htm">JavaGO</a></td>
-<td align="center"><br /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
-<td align="center"><br /></td>
+<td align="center"><br></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
+<td align="center"><br></td>
+<td>Free</td>
+</tr>
+
+<tr>
+<td><a target="other" rel="nofollow" href="http://donquixote.cafebabe.jp/">Haruaki Tamada</a></td>
+<td><a target="other" href="http://donquixote.cafebabe.jp/">DonQuixote</a></td>
+<td align="center"><br></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
<td>Free</td>
</tr>
<tr>
<td><a target="other" rel="nofollow" href="http://www.sable.mcgill.ca/">Sable</a></td>
<td><a target="other" href="http://www.sable.mcgill.ca/JBCO/">JBCO</a></td>
-<td align="center"><br /></td>
-<td align="center"><br /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
+<td align="center"><br></td>
+<td align="center"><br></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
<td>Free (LGPL)</td>
</tr>
<tr>
<td><a target="other" rel="nofollow" href="http://sourceforge.net/users/glurk/">Thorsten Heit</a></td>
<td><a target="other" href="http://sourceforge.net/projects/javaguard/">JavaGuard</a></td>
-<td align="center"><br /></td>
-<td align="center"><br /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
+<td align="center"><br></td>
+<td align="center"><br></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
<td>Free (LGPL)</td>
</tr>
<tr>
<td><a target="other" rel="nofollow" href="http://mwobfu.sourceforge.net/">Patrick Mueller</a></td>
<td><a target="other" href="http://mwobfu.sourceforge.net/">Mwobfu</a></td>
-<td align="center"><br /></td>
-<td align="center"><br /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
+<td align="center"><br></td>
+<td align="center"><br></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
<td>Free (GPL)</td>
</tr>
<tr>
+<td><a target="other" rel="nofollow" href="http://www.elegant-software.com/">Elegant Software</a></td>
+<td><a target="other" href="http://www.elegant-software.com/software/jmangle/">JMangle</a></td>
+<td align="center"><br></td>
+<td align="center"><br></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
+<td>Free</td>
+</tr>
+
+<tr>
<td><a target="other" rel="nofollow" href="http://www.bebbosoft.de/">BebboSoft</a></td>
-<td><a target="other" href="http://www.bebbosoft.de/#java/mug/index.wiki">Bb_mug</a></td>
-<td align="center"><br /></td>
-<td align="center"><br /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
+<td><a target="other" href="http://www.bebbosoft.de/index.html#java/mug/index.html">Bb_mug</a></td>
+<td align="center"><br></td>
+<td align="center"><br></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
+<td>Free (no source)</td>
+</tr>
+
+<tr>
+<td><a target="other" rel="nofollow" href="http://www.drjava.de/">Dr. Java</a></td>
+<td><a target="other" href="http://www.drjava.de/obfuscator/">Marvin Obfuscator</a></td>
+<td align="center"><br></td>
+<td align="center"><br></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
<td>Free (no source)</td>
</tr>
<tr>
-<td><a target="other" rel="nofollow" href="http://github.com/v6ak">V&iacute;t &Scaron;est&aacute;k</a></td>
-<td><a target="other" href="http://github.com/v6ak/Preverifier/">Preverifier</a></td>
-<td align="center"><br /></td>
-<td align="center"><br /></td>
-<td align="center"><br /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td>Free (EPL)</td>
+<td><a target="other" rel="nofollow" href="http://www.ibm.com/">IBM</a></td>
+<td><a target="other" href="http://www-306.ibm.com/software/wireless/wsdd/">WSDD</a></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
+<td>Commercial</td>
</tr>
<tr>
<td><a target="other" rel="nofollow" href="http://www.preemptive.com/">PreEmptive</a></td>
<td><a target="other" href="http://www.preemptive.com/products/dasho/index.html">DashOPro</a></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
<td>Commercial</td>
</tr>
<tr>
<td><a target="other" rel="nofollow" href="http://www.zelix.com/">Zelix</a></td>
<td><a target="other" href="http://www.zelix.com/klassmaster/index.html">KlassMaster</a></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
+<td>Commercial</td>
+</tr>
+
+<tr>
+<td><a target="other" rel="nofollow" href="http://www.s5systems.com/">S5 Systems</a></td>
+<td><a target="other" href="http://www.s5systems.com/jPresto.htm">jPresto</a></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
<td>Commercial</td>
</tr>
<tr>
<td><a target="other" rel="nofollow" href="http://www.s-cradle.com/english/index.html">Sophia Cradle</a></td>
<td><a target="other" href="http://www.s-cradle.com/english/products/sophiacompress_java/index.html">SophiaCompress</a></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
+<td>Commercial</td>
+</tr>
+
+<tr>
+<td><a target="other" rel="nofollow" href="http://www.retrologic.com/">RetroLogic</a></td>
+<td><a target="other" href="http://www.retrologic.com/">RetroGuard</a></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
+<td>Commercial</td>
+</tr>
+
+<tr>
+<td><a target="other" rel="nofollow" href="http://www.codingart.com/">CodingArt</a></td>
+<td><a target="other" href="http://www.codingart.com/codeshield.html">CodeShield</a></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
<td>Commercial</td>
</tr>
<tr>
<td><a target="other" rel="nofollow" href="http://www.e-t.com/">Eastridge Technology</a></td>
<td><a target="other" href="http://www.e-t.com/jshrink.html">Jshrink</a></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
+<td>Commercial</td>
+</tr>
+
+<tr>
+<td><a target="other" rel="nofollow" href="http://www.helseth.com/">Helseth</a></td>
+<td><a target="other" href="http://www.helseth.com/HJO.htm">JObfuscator</a></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
<td>Commercial</td>
</tr>
<tr>
<td><a target="other" rel="nofollow" href="http://www.leesw.com/">LeeSoftware</a></td>
<td><a target="other" href="http://www.leesw.com/">Smokescreen Obfuscator</a></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
+<td>Commercial</td>
+</tr>
+
+<tr>
+<td><a target="other" rel="nofollow" href="http://www.vegatech.com/">Vega Technologies</a></td>
+<td><a target="other" href="http://www.vegatech.com/jzipper/">JZipper</a></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
<td>Commercial</td>
</tr>
<tr>
<td><a target="other" rel="nofollow" href="http://www.innaworks.com/">Innaworks</a></td>
-<td><a target="other" href="http://www.innaworks.com/mBooster">mBooster</a></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
+<td><a target="other" href="http://www.innaworks.com/">mBooster</a></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
<td>Commercial</td>
</tr>
<tr>
<td><a target="other" rel="nofollow" href="http://www.uni-vologda.ac.ru/~c3c/">Sergey Sverdlov</a></td>
<td><a target="other" href="http://www.uni-vologda.ac.ru/~c3c/jco/">J.Class Optimizer</a></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
-<td align="center"><br /></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
+<td align="center"><br></td>
<td>Commercial</td>
</tr>
<tr>
<td><a target="other" rel="nofollow" href="http://www.smardec.com/">Smardec</a></td>
-<td><a target="other" href="http://www.allatori.com/">Allatori</a></td>
-<td align="center"><br /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
+<td><a target="other" href="//www.allatori.com/">Allatori</a></td>
+<td align="center"><br></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
<td>Commercial</td>
</tr>
<tr>
<td><a target="other" rel="nofollow" href="http://cs.arizona.edu/">U. of Arizona</a></td>
<td><a target="other" href="http://sandmark.cs.arizona.edu/">SandMark</a></td>
-<td align="center"><br /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
+<td align="center"><br></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
<td>Commercial</td>
</tr>
<tr>
<td><a target="other" rel="nofollow" href="http://www.force5.com/">Force 5</a></td>
-<td><a target="other" href="http://www.force5.com/JCloak/ProductJCloak.html">JCloak</a></td>
-<td align="center"><br /></td>
-<td align="center"><br /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
+<td><a target="other" href="http://www.force5.com/">JCloak</a></td>
+<td align="center"><br></td>
+<td align="center"><br></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
<td>Commercial</td>
</tr>
<tr>
<td><a target="other" rel="nofollow" href="http://www.semdesigns.com/">Semantic Designs</a></td>
<td><a target="other" href="http://www.semdesigns.com/Products/Obfuscators/JavaObfuscator.html">Obfuscator</a></td>
-<td align="center"><br /></td>
-<td align="center"><br /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
+<td align="center"><br></td>
+<td align="center"><br></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
<td>Commercial</td>
</tr>
<tr>
<td><a target="other" rel="nofollow" href="http://www.duckware.com/">Duckware</a></td>
<td><a target="other" href="http://www.duckware.com/jobfuscate/">Jobfuscate</a></td>
-<td align="center"><br /></td>
-<td align="center"><br /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
+<td align="center"><br></td>
+<td align="center"><br></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
<td>Commercial</td>
</tr>
<tr>
-<td><a target="other" rel="nofollow" href="http://www.arxan.com/">Arxan</a></td>
-<td><a target="other" href="http://www.arxan.com/software-protection-products/java-GuardIt/index.php">GuardIT</a></td>
-<td align="center"><br /></td>
-<td align="center"><br /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
+<td><a target="other" rel="nofollow" href="http://www.jproof.com/">JProof</a></td>
+<td><a target="other" href="http://www.jproof.com/">JProof</a></td>
+<td align="center"><br></td>
+<td align="center"><br></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
<td>Commercial</td>
</tr>
<tr>
+<td><a target="other" rel="nofollow" href="http://www.solutia.ro/">GITS</a></td>
+<td><a target="other" href="http://www.solutia.ro/pages/javadc/">Blurfuscator</a></td>
+<td align="center"><br></td>
+<td align="center"><br></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
+<td>Commercial</td>
+</tr>
+
+<tr>
+<td><a target="other" rel="nofollow" href="http://www.chainkey.com/">ChainKey</a></td>
+<td><a target="other" href="http://www.chainkey.com/en/jcp/">Java Code Protector</a></td>
+<td align="center"><br></td>
+<td align="center"><br></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
+<td>Commercial</td>
+</tr>
+
+<tr>
+<td><a target="other" rel="nofollow" href="http://sourceforge.net/projects/flmobf/">Alain Moran</a></td>
+<td><a target="other" href="http://sourceforge.net/projects/flmobf/">flmObf</a></td>
+<td align="center"><br></td>
+<td align="center"><br></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
+<td>Free (BSD)</td>
+</tr>
+
+<tr>
<td><a target="other" rel="nofollow" href="http://www.chez.com/vasile/">Vasile Calmatui</a></td>
<td><a target="other" href="http://www.chez.com/vasile/obfu/VasObfuLite.html">VasObfuLite</a></td>
-<td align="center"><br /></td>
-<td align="center"><br /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
+<td align="center"><br></td>
+<td align="center"><br></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
<td>Free</td>
</tr>
<tr class="disappeared">
<td><a target="other" rel="nofollow" href="http://www.alphaworks.ibm.com/">IBM AlphaWorks</a></td>
<td><a target="other" href="http://www.research.ibm.com/jax/">JAX</a></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
<td>(discontinued)</td>
</tr>
<tr class="disappeared">
-<td><a target="other" rel="nofollow" href="http://www.nq4.de/">NQ4</a></td>
-<td><a target="other" rel="nofollow" href="http://www.nq4.de/">Joga</a></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
-<td>(discontinued?)</td>
-</tr>
-
-<tr class="disappeared">
<td><a target="other" rel="nofollow" href="http://www-i2.informatik.rwth-aachen.de/~markusj/">Markus Jansen</a></td>
<td><a target="other" rel="nofollow" href="http://www-i2.informatik.rwth-aachen.de/~markusj/jopt/">Jopt</a></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
-<td>(disappeared?)</td>
-</tr>
-
-<tr class="disappeared">
-<td><a target="other" rel="nofollow" href="http://www.geocities.com/CapeCanaveral/Hall/2334/resume.html">Alexander Shvets</a></td>
-<td><a target="other" rel="nofollow" href="http://www.geocities.com/CapeCanaveral/Hall/2334/Programs/cafebabe.html">CafeBabe</a></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
-<td>(disappeared?)</td>
-</tr>
-
-<tr class="disappeared">
-<td><a target="other" rel="nofollow" href="http://darcs.brianweb.net/">Brian Alliet</a></td>
-<td><a target="other" rel="nofollow" href="http://darcs.brianweb.net/gcclass/">Gcclass</a></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
-<td align="center"><br /></td>
-<td align="center"><br /></td>
-<td>(disappeared?)</td>
-</tr>
-
-<tr class="disappeared">
-<td><a target="other" rel="nofollow" href="http://www.cs.purdue.edu/homes/grothoff/">Christian Grothoff</a></td>
-<td><a target="other" rel="nofollow" href="http://www.ovmj.org/jamit/">Jamit</a></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
-<td align="center"><br /></td>
-<td align="center"><br /></td>
-<td>(disappeared?)</td>
-</tr>
-
-<tr class="disappeared">
-<td><a target="other" rel="nofollow" href="http://donquixote.cafebabe.jp/">Haruaki Tamada</a></td>
-<td><a target="other" rel="nofollow" href="http://donquixote.cafebabe.jp/">DonQuixote</a></td>
-<td align="center"><br /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
-<td>(disappeared?)</td>
-</tr>
-
-<tr class="disappeared">
-<td><a target="other" rel="nofollow" href="http://www.utdallas.edu/~gxz014000/">Bajie</a></td>
-<td><a target="other" rel="nofollow" href="http://www.utdallas.edu/~gxz014000/jcmp/">JCMP</a></td>
-<td align="center"><br /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
-<td>(disappeared?)</td>
-</tr>
-
-<tr class="disappeared">
-<td><a target="other" rel="nofollow" href="http://www.elegant-software.com/">Elegant Software</a></td>
-<td><a target="other" rel="nofollow" href="http://www.elegant-software.com/software/jmangle/">JMangle</a></td>
-<td align="center"><br /></td>
-<td align="center"><br /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
<td>(disappeared?)</td>
</tr>
<tr class="disappeared">
<td><a target="other" rel="nofollow" href="http://www.primenet.com/~ej">Eron Jokipii</a></td>
<td><a target="other" rel="nofollow" href="http://www.primenet.com/~ej">Jobe</a></td>
-<td align="center"><br /></td>
-<td align="center"><br /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
+<td align="center"><br></td>
+<td align="center"><br></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
<td>(disappeared?)</td>
</tr>
<tr class="disappeared">
<td><a target="other" rel="nofollow" href="http://jrc.krdl.org.sg/">JRC</a></td>
<td><a target="other" rel="nofollow" href="http://jrc.krdl.org.sg/decaf/">DeCaf</a></td>
-<td align="center"><br /></td>
-<td align="center"><br /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
+<td align="center"><br></td>
+<td align="center"><br></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
<td>(disappeared?)</td>
</tr>
<tr class="disappeared">
-<td><a target="other" rel="nofollow" href="http://www.drjava.de/">Dr. Java</a></td>
-<td><a target="other" rel="nofollow" href="http://www.drjava.de/obfuscator/">Marvin Obfuscator</a></td>
-<td align="center"><br /></td>
-<td align="center"><br /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
+<td><a target="other" rel="nofollow" href="http://www.utdallas.edu/~gxz014000/">Bajie</a></td>
+<td><a target="other" rel="nofollow" href="http://www.utdallas.edu/~gxz014000/jcmp/">JCMP</a></td>
+<td align="center"><br></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
<td>(disappeared?)</td>
</tr>
<tr class="disappeared">
-<td><a target="other" rel="nofollow" href="http://www.ibm.com/">IBM</a></td>
-<td><a target="other" rel="nofollow" href="http://www-306.ibm.com/software/wireless/wsdd/">WSDD</a></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
-<td>Commercial (discontinued?)</td>
-</tr>
-
-<tr class="disappeared">
-<td><a target="other" rel="nofollow" href="http://www.s5systems.com/">S5 Systems</a></td>
-<td><a target="other" rel="nofollow" href="http://www.s5systems.com/jPresto.htm">jPresto</a></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
-<td>Commercial (discontinued?)</td>
-</tr>
-
-<tr class="disappeared">
<td><a target="other" rel="nofollow" href="http://www.plumbdesign.com/">Plumb Design</a></td>
<td><a target="other" rel="nofollow" href="http://www.condensity.com/">Condensity</a></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
<td>Commercial (discontinued)</td>
</tr>
<tr class="disappeared">
<td><a target="other" rel="nofollow" href="http://www.4thpass.com/">4th Pass</a></td>
<td><a target="other" rel="nofollow" href="http://www.4thpass.com/">SourceGuard</a></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
-<td>Commercial (discontinued?)</td>
-</tr>
-
-<tr class="disappeared">
-<td><a target="other" rel="nofollow" href="http://www.codingart.com/">CodingArt</a></td>
-<td><a target="other" rel="nofollow" href="http://www.codingart.com/codeshield.html">CodeShield</a></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
<td>Commercial (discontinued?)</td>
</tr>
<tr class="disappeared">
<td><a target="other" rel="nofollow" href="http://www.software4j.com/">Software4j</a></td>
<td><a target="other" rel="nofollow" href="http://www.software4j.com/obfuscate4j/">Obfuscate4j</a></td>
-<td align="center"><br /></td>
-<td align="center"><br /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
+<td align="center"><br></td>
+<td align="center"><br></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
<td>Commercial (discontinued?)</td>
</tr>
<tr class="disappeared">
<td><a target="other" rel="nofollow" href="http://www.jammconsulting.com/">JAMM Consulting</a></td>
<td><a target="other" rel="nofollow" href="http://www.jammconsulting.com/jamm/servlet/com.jammconsulting.servlet.JAMMServlet?pageId=ObfuscateProPage">ObfuscatePro</a></td>
-<td align="center"><br /></td>
-<td align="center"><br /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
+<td align="center"><br></td>
+<td align="center"><br></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
<td>Commercial (discontinued?)</td>
</tr>
<tr class="disappeared">
<td><a target="other" rel="nofollow" href="http://www.jdevelop.com/">JDevelop</a></td>
<td><a target="other" rel="nofollow" href="http://www.jdevelop.com/best-java-obfuscator.html">JSCO</a></td>
-<td align="center"><br /></td>
-<td align="center"><br /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
+<td align="center"><br></td>
+<td align="center"><br></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
<td>Commercial (discontinued?)</td>
</tr>
<tr class="disappeared">
<td><a target="other" rel="nofollow" href="http://www.4fang.net/">4Fang</a></td>
<td><a target="other" rel="nofollow" href="http://www.4fang.net/jmix/">JMix</a></td>
-<td align="center"><br /></td>
-<td align="center"><br /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
+<td align="center"><br></td>
+<td align="center"><br></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
<td>Commercial (discontinued?)</td>
</tr>
<tr class="disappeared">
-<td><a target="other" rel="nofollow" href="http://www.retrologic.com/">RetroLogic</a></td>
-<td><a target="other" rel="nofollow" href="http://www.retrologic.com/">RetroGuard</a></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
-<td>Commercial (disappeared?)</td>
-</tr>
-
-<tr class="disappeared">
-<td><a target="other" rel="nofollow" href="http://www.helseth.com/">Helseth</a></td>
-<td><a target="other" rel="nofollow" href="http://www.helseth.com/HJO.htm">JObfuscator</a></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
-<td>Commercial (disappeared?)</td>
-</tr>
-
-<tr class="disappeared">
-<td><a target="other" rel="nofollow" href="http://www.vegatech.com/">Vega Technologies</a></td>
-<td><a target="other" rel="nofollow" href="http://www.vegatech.com/jzipper/">JZipper</a></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
-<td>Commercial (disappeared?)</td>
-</tr>
-
-<tr class="disappeared">
-<td><a target="other" rel="nofollow" href="http://www.jproof.com/">JProof</a></td>
-<td><a target="other" rel="nofollow" href="http://www.jproof.com/">JProof</a></td>
-<td align="center"><br /></td>
-<td align="center"><br /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
-<td>Commercial (disappeared?)</td>
-</tr>
-
-<tr class="disappeared">
-<td><a target="other" rel="nofollow" href="http://www.chainkey.com/">ChainKey</a></td>
-<td><a target="other" rel="nofollow" href="http://www.chainkey.com/en/jcp/">Java Code Protector</a></td>
-<td align="center"><br /></td>
-<td align="center"><br /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
-<td>Commercial (disappeared?)</td>
-</tr>
-
-<tr class="disappeared">
<td><a target="other" rel="nofollow" href="http://www.2lkit.com/">2LKit</a></td>
<td><a target="other" rel="nofollow" href="http://www.2lkit.com/products/2LKitObf/index.htm">2LKit Obfuscator</a></td>
-<td align="center"><br /></td>
-<td align="center"><br /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
+<td align="center"><br></td>
+<td align="center"><br></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
<td>Commercial (disappeared?)</td>
</tr>
<tr class="disappeared">
<td><a target="other" rel="nofollow" href="http://www.wingsoft.com/">WingSoft</a></td>
<td><a target="other" rel="nofollow" href="http://www.wingsoft.com/wingguard.html">WingGuard</a></td>
-<td align="center"><br /></td>
-<td align="center"><br /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
+<td align="center"><br></td>
+<td align="center"><br></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
<td>Commercial (disappeared?)</td>
</tr>
<tr class="disappeared">
<td><a target="other" rel="nofollow" href="http://www.sbktech.org/">HashJava</a></td>
<td><a target="other" rel="nofollow" href="http://www.sbktech.org/">HashJava</a></td>
-<td align="center"><br /></td>
-<td align="center"><br /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
-<td>Commercial (disappeared?)</td>
-</tr>
-
-<tr class="disappeared">
-<td><a target="other" rel="nofollow" href="http://www.solutia.ro/">GITS</a></td>
-<td><a target="other" rel="nofollow" href="http://www.solutia.ro/pages/javadc/">Blurfuscator</a></td>
-<td align="center"><br /></td>
-<td align="center"><br /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
+<td align="center"><br></td>
+<td align="center"><br></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x"></td>
+<td align="center"><br></td>
<td>Commercial (disappeared?)</td>
</tr>
@@ -688,11 +647,10 @@ below is incorrect.
<p>
All trademarks are property of their respective holders.
-<hr />
-<noscript><div><a target="_top" href="index.html" class="button">Show menu</a></div></noscript>
+<hr>
<address>
-Copyright &copy; 2002-2011
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2009
+<a href="http://www.graphics.cornell.edu/~eric/">Eric Lafortune</a>.
</address>
</body>
diff --git a/docs/downloads.html b/docs/downloads.html
index e322ca6..ebd1b28 100644
--- a/docs/downloads.html
+++ b/docs/downloads.html
@@ -1,22 +1,11 @@
-<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!doctype html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<meta http-equiv="content-style-type" content="text/css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>ProGuard Downloads</title>
-<script type="text/javascript" language="JavaScript">
-<!--
-if (window.self==window.top)
- window.top.location.replace("index.html#"+window.location.pathname+window.location.hash);
-else {
- var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
- if (window.top.location.hash!=hash)
- window.top.location.hash=hash;
-}
-//-->
-</script>
</head>
<body>
@@ -55,96 +44,6 @@ interest too, because they typically contain any less urgent bug fixes
collected since the previous release.
<p>
-<h3><div>Dec 2011</div> Version 4.7</h3>
-<ul>
-<li>Added support for Java 7.
-<li>Parsing unquoted file names with special characters more leniently.
-<li>Added support for instance methods overriding class methods.
-<li>Added removal of unused parameterless constructors.
-<li>Added removal of empty class initializers.
-<li>Added peephole optimizations for constant strings.
-<li>Avoiding idle optimization passes.
-<li>Improved removal of unused constants after obfuscation.
-<li>Fixed removal of unused classes referenced by annotations.
-<li>Fixed simplifying parameters of constructors that should actually be
- preserved.
-<li>Fixed simplifying parameters of large numbers of similar constructors.
-<li>Fixed exceptions in optimization of unusual obfuscated code.
-<li>Fixed NullPointerException when specifying <code>-keepclassmembers</code>
- without specific class or class members.
-<li>Fixed potential problems with mixed-case class name dictionaries when not
- allowing mixed-case class names.
-<li>Fixed obfuscation of classes with EnclosingMethod attributes that don't
- specify methods.
-<li>Fixed preverification of returning try blocks with finally blocks, inside
- try blocks, when compiled with JDK 1.4.
-<li>Fixed sorting of interfaces containing generics.
-<li>Fixed paths in shell scripts.
-<li>Fixed filling in of text fields showing class obfuscation dictionary and
- package obfuscation dictionary from configuration in GUI.
-<li>Worked around Oracle Java 6/7 bug #7027598 that locked the GUI on Linux.
-<li>Updated documentation and examples.
-</ul>
-
-<h3><div>Feb 2011</div> Version 4.6</h3>
-<ul>
-<li>Added support for synthetic, bridge, and varargs modifiers in configuration.
-<li>Added detection of atomic updater construction with constant arguments.
-<li>Fixed merging of package visible classes.
-<li>Fixed optimization of fields that are only accessed by reflection.
-<li>Fixed optimization of read-only or write-only fields that are volatile.
-<li>Fixed handling of side-effects due to static initializers.
-<li>Fixed handling of bridge flags in obfuscation step.
-<li>Fixed handling of super flag when merging classes.
-<li>Fixed updating of variable tables when optimizing variables.
-<li>Fixed removal of unused parameters with 32 or more parameters.
-<li>Fixed incorrect removal of exception handler for instanceof instruction.
-<li>Fixed inlining of methods with unusual exception handlers.
-<li>Fixed optimization of unusual code causing stack underflow.
-<li>Fixed keeping of constructor parameter names.
-<li>Fixed unwanted wrapping of non-standard META-INF files.
-<li>Fixed filtering of warnings about references to array types.
-<li>Fixed overriding of warning option and note option in Ant task.
-<li>Improved detection of file name extensions for canonical paths.
-<li>Improved printing of seeds specified by <code>-keep</code> options.
-<li>Improved printing of notes about unkept classes.
-<li>Improved checking whether output is up to date.
-<li>Updated documentation and examples.
-</ul>
-
-<h3><div>Jun 2010</div> Version 4.5</h3>
-<ul>
-<li>Added option <code>-keepparameternames</code>.
-<li><code>-dontskipnonpubliclibraryclasses</code> is now set by default. Added
- <code>-skipnonpubliclibraryclasses</code> as an option.
-<li>Made processing independent of order of input classes to get even more
- deterministic output.
-<li>Improved constant field propagation.
-<li>Improved renaming of resource files in subdirectories of packages.
-<li>Avoiding making fields in interfaces private.
-<li>Optimizing exception handlers for monitorexit instruction.
-<li>Reduced maximum allowed code length after inlining from 8000 bytes to
- 7000 bytes.
-<li>Fixed missing warnings about missing library classes.
-<li>Fixed shrinking of annotations with arrays of length 0.
-<li>Fixed handling of -0.0 and NaN values when simplifying expressions.
-<li>Fixed copying of exception handlers when simplifying tail recursion calls.
-<li>Fixed optimization of introspected fields.
-<li>Fixed simplification of unnecessary variable initializations.
-<li>Fixed evaluation of subroutines in pre-JDK 1.5 code.
-<li>Fixed updating of access flags in inner classes information.
-<li>Fixed disabling of field privatization.
-<li>Fixed invocations of privatized methods.
-<li>Fixed updating of local variable debug information in optimization step.
-<li>Fixed print settings without file name in GUI.
-<li>Fixed field privatization setting in GUI.
-<li>Fixed saving incorrectly quoted arguments in GUI.
-<li>Fixed handling of regular expressions with only negators.
-<li>Fixed unwanted wrapping of non-standard META-INF files.
-<li>Fixed regular expression pattern for constructors in ReTrace.
-<li>Updated documentation and examples.
-</ul>
-
<h3><div>Jul 2009</div> Version 4.4</h3>
<ul>
<li>Added new peephole optimizations.
@@ -612,11 +511,10 @@ Upgrade considerations:
<b>RetroGuard</b>.
</ul>
-<hr />
-<noscript><div><a target="_top" href="index.html" class="button">Show menu</a></div></noscript>
+<hr>
<address>
-Copyright &copy; 2002-2011
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2009
+<a href="http://www.graphics.cornell.edu/~eric/">Eric Lafortune</a>.
</address>
</body>
diff --git a/docs/feedback.html b/docs/feedback.html
index 197fc33..a7e770b 100644
--- a/docs/feedback.html
+++ b/docs/feedback.html
@@ -1,4 +1,4 @@
-<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!doctype html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
@@ -6,17 +6,6 @@
<meta http-equiv="content-style-type" content="text/css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>ProGuard Feedback</title>
-<script type="text/javascript" language="JavaScript">
-<!--
-if (window.self==window.top)
- window.top.location.replace("index.html#"+window.location.pathname+window.location.hash);
-else {
- var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
- if (window.top.location.hash!=hash)
- window.top.location.hash=hash;
-}
-//-->
-</script>
</head>
<body>
@@ -24,32 +13,28 @@ else {
By now, I've invested a fair amount of time in <b>ProGuard</b>. You can help
by providing feedback! If you have problems, bugs, bug fixes, ideas,
-encouragements, etc., please get in touch:
+encouragements, etc., please let me know:
<p>
-<ul class="spacious">
-<li>Through
- <a href="http://www.saikoa.com/proguard/support" target="_top">Saikoa</a>,
- we provide professional support for ProGuard. If you find ProGuard useful
- and you would like to have some professional backing, this is the place to
- go.</li>
-
-<li>The <a href="https://sourceforge.net/projects/proguard/forums/forum/182456"
+<ul>
+<li>The <a href="http://sourceforge.net/forum/forum.php?forum_id=182456"
target="other">help forum</a> (at SourceForge) is the right place to ask
questions about any problems you might have configuring and running
- ProGuard. At this time, I can generally only assist other open source
- projects though. If you're working on commercial software, please consider
- our professional support above.</li>
+ <b>ProGuard</b>.
+ <p>
-<li>The <a href="https://sourceforge.net/projects/proguard/forums/forum/182455"
+<li>The <a href="http://sourceforge.net/forum/forum.php?forum_id=182455"
target="other">open discussion forum</a> (at SourceForge) offers a place
- to share your thoughts and discuss new ideas.</li>
+ to share your thoughts and discuss new ideas.
+ <p>
<li>The <a
+
href="http://sourceforge.net/tracker/?atid=474704&group_id=54750&func=browse"
target="other">bug tracking page</a> (at SourceForge) allows you to submit
and consult bug reports. Please make sure the reports are complete and
concise. If I can't reproduce the problem, I most likely can't fix it
- either.</li>
+ either.
+ <p>
<li>The <a
@@ -57,14 +42,16 @@ encouragements, etc., please get in touch:
target="other">feature request page</a> (at SourceForge) allows you to
submit and consult feature requests. I generally have my own road map in
mind, but this is the place express your interest in new and existing
- ideas.</li>
+ ideas.
+ <p>
-<li>The <a href="https://sourceforge.net/projects/proguard/files/"
+<li>The <a href="http://sourceforge.net/project/showfiles.php?group_id=54750"
target="other">download section</a> at SourceForge and the <a
href="http://software.freshmeat.net/projects/proguard/"
target="other">project page</a> at FreshMeat offer the possibility to
subscribe to the announcements of new releases. They are the most
- efficient way to stay abreast of the latest developments.</li>
+ efficient way to stay abreast of the latest developments.
+ <p>
<li>For anything that doesn't fall in the above categories, you can mail me
directly at
@@ -97,7 +84,7 @@ document.write("</a>");
<em>or</em> at
&lt;&nbsp;eric&nbsp;&#64;&nbsp;graphics&nbsp;.&nbsp;cornell&nbsp;.&nbsp;edu&nbsp;&gt; (please remove the spaces)
</noscript>
-.</li>
+.
</ul>
<p>
I can't promise a swift answer, or any answer at all, for that matter, but I
@@ -109,11 +96,10 @@ like seeing any constructive comments.
do things my way, without the overhead and compromises associated with larger
projects.
-<hr />
-<noscript><div><a target="_top" href="index.html" class="button">Show menu</a></div></noscript>
+<hr>
<address>
-Copyright &copy; 2002-2011
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2009
+<a href="http://www.graphics.cornell.edu/~eric/">Eric Lafortune</a>.
</address>
</body>
diff --git a/docs/index.html b/docs/index.html
index 866fc3d..771bb6a 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -1,4 +1,4 @@
-<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!doctype html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
@@ -11,34 +11,18 @@
<link rel="shortcut icon" type="image/x-icon" href="favicon.ico">
<title>ProGuard</title>
</head>
-
-<script type="text/javascript" language="JavaScript">
-<!--
-var main="main.html";
-if (window.location.hash.length > 1)
- main=window.location.hash.substr(1);
-var sections="sections.html";
-if (main.search(/manual\//) >= 0)
- sections="manual/sections.html";
-
-document.write("<frameset rows=\"50,*\" framespacing=\"0\" frameborder=\"no\"><frame id=\"title\" name=\"title\" src=\"title.html\" scrolling=\"no\" marginwidth=\"0\" marginheight=\"0\" noresize /><frameset cols=\"120,*\" framespacing=\"0\" frameborder=\"no\"><frame id=\"sections\" name=\"sections\" src=\""+sections+"\" scrolling=\"no\" marginwidth=\"0\" marginheight=\"0\" noresize /><frame id=\"main\" name=\"main\" src=\""+main+"\" scrolling=\"auto\" marginwidth=\"10\" marginheight=\"10\" noresize /></frameset></frameset>");
-//-->
-</script>
-
-<noscript>
<frameset
rows="50,*"
framespacing="0"
frameborder="no">
<frame
- id="title"
name="title"
src="title.html"
scrolling="no"
marginwidth="0"
marginheight="0"
- noresize />
+ noresize>
<frameset
cols="120,*"
@@ -46,46 +30,42 @@ document.write("<frameset rows=\"50,*\" framespacing=\"0\" frameborder=\"no\"><f
frameborder="no">
<frame
- id="sections"
name="sections"
src="sections.html"
scrolling="no"
marginwidth="0"
marginheight="0"
- noresize />
+ noresize>
<frame
- id="main"
name="main"
src="main.html"
scrolling="auto"
marginwidth="10"
marginheight="10"
- noresize />
+ noresize>
</frameset>
</frameset>
-</noscript>
<noframes>
<body>
<p class="intro">
-<b>ProGuard</b> is a free Java class file shrinker, optimizer, obfuscator, and
-preverifier. It detects and removes unused classes, fields, methods, and
-attributes. It optimizes bytecode and removes unused instructions. It renames
-the remaining classes, fields, and methods using short meaningless names.
-Finally, it preverifies the processed code for Java 6 or for Java Micro
-Edition.
+<b>ProGuard</b> 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.
</p>
<p>
Your browser doesn't support frames, but that's cool.
<p>
You can go straight to the <a href="main.html">main page</a>.
-<hr />
+<hr>
<address>
-Copyright &copy; 2002-2011
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2009
+<a href="http://www.graphics.cornell.edu/~eric/">Eric Lafortune</a>.
</address>
</body>
</noframes>
diff --git a/docs/license.html b/docs/license.html
index 0a10092..b4654fd 100644
--- a/docs/license.html
+++ b/docs/license.html
@@ -1,21 +1,10 @@
-<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!doctype html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<meta http-equiv="content-style-type" content="text/css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>ProGuard License</title>
-<script type="text/javascript" language="JavaScript">
-<!--
-if (window.self==window.top)
- window.top.location.replace("index.html#"+window.location.pathname+window.location.hash);
-else {
- var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
- if (window.top.location.hash!=hash)
- window.top.location.hash=hash;
-}
-//-->
-</script>
</head>
<body>
@@ -40,21 +29,19 @@ under the GPL. I am granting a <a href="GPL_exception.html">special
exception</a> to the latter clause (in wording suggested by
the <a href="http://www.gnu.org/copyleft/gpl-faq.html#GPLIncompatibleLibs"
target="other">FSF</a>), for combinations with the following stand-alone
-applications: Apache Ant, Apache Maven, the Google Android SDK, the Eclipse
-ProGuardDT GUI, the EclipseME JME IDE, the Oracle NetBeans Java IDE, the Oracle
-JME Wireless Toolkit, the Simple Build Tool for Scala, the NeoMAD Tools by
-Neomades, the Javaground Tools, and the Sanaware Tools.
+applications: Apache Ant, Apache Maven, the Eclipse ProGuardDT GUI, the
+EclipseME JME IDE, the Sun NetBeans Java IDE, the Sun JME Wireless Toolkit,
+and the Javaground Tools.
<p>
The <b>ProGuard user documentation</b> represents an important part of this
work. It may only be redistributed without changes, along with the unmodified
version of the code.
-<hr />
-<noscript><div><a target="_top" href="index.html" class="button">Show menu</a></div></noscript>
+<hr>
<address>
-Copyright &copy; 2002-2011
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2009
+<a href="http://www.graphics.cornell.edu/~eric/">Eric Lafortune</a>.
</address>
</body>
</html>
diff --git a/docs/luciadlogo.png b/docs/luciadlogo.png
new file mode 100644
index 0000000..0147ce3
--- /dev/null
+++ b/docs/luciadlogo.png
Binary files differ
diff --git a/docs/main.html b/docs/main.html
index 0a89673..e988c79 100644
--- a/docs/main.html
+++ b/docs/main.html
@@ -1,4 +1,4 @@
-<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!doctype html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
@@ -8,16 +8,6 @@
<meta name="keywords" content="java obfuscator, optimizer, shrinker, preverfier">
<link rel="stylesheet" type="text/css" href="style.css">
<title>ProGuard Main</title>
-<script type="text/javascript" language="JavaScript">
-<!--
-if (window.self==window.top)
- window.top.location.replace("index.html#"+window.location.pathname+window.location.hash);
-else {
- if (window.top.location.hash!="")
- window.top.location.hash="";
-}
-//-->
-</script>
</head>
<body>
@@ -35,21 +25,25 @@ Some uses of <b>ProGuard</b> are:
<ul>
<li>Creating more compact code, for smaller code archives, faster transfer
- across networks, faster loading, and smaller memory footprints.</li>
+ across networks, faster loading, and smaller memory footprints.
-<li>Making programs and libraries harder to reverse-engineer.</li>
+<li>Making programs and libraries harder to reverse-engineer.
-<li>Listing dead code, so it can be removed from the source code.</li>
+<li>Listing dead code, so it can be removed from the source code.
<li>Retargeting and preverifying existing class files for Java 6, to take full
- advantage of Java 6's faster class loading.</li>
+ advantage of Java 6's faster class loading.
</ul>
<p>
<b>ProGuard</b>'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.
-The user manual explains all available options and shows examples of this
+line options or a simple configuration file are usually sufficient. For
+instance, the following configuration option preserves all applets in a jar:
+<pre>
+ -keep public class * extends java.applet.Applet
+</pre>
+The user manual explains all available options and shows more examples of this
powerful configuration style.
<p>
<b>ProGuard</b> is fast. It only takes seconds to process programs and
@@ -61,42 +55,38 @@ interface. It also comes with plugins for Ant and for the JME Wireless
Toolkit.
<p>
<p class="intro">
-<b>ProGuard</b> is being used in various development contexts, ranging from
-small Android apps to large Java applications and libraries. Its user base is
-continuing to grow at a fast pace. In order to better manage the many
-questions and requests, we are now providing professional support at
-<a target="_top" href="http://www.saikoa.com/proguard/support">Saikoa</a>.
+Version 4.0 introduced preverification and more bytecode optimizations. Please
+report any problems, so they can be fixed soon.
</p>
The following sections provide more detailed information:
<ul>
-<li><a href="main.html">Main</a>: this overview page.</li>
+<li><a href="main.html">Main</a>: this overview page.
<li><a href="results.html">Results</a>: some results obtained with
- <b>ProGuard</b>, including timings and memory usage.</li>
-<li><a href="FAQ.html">FAQ</a>: answers to some Frequently Asked Questions.</li>
+ <b>ProGuard</b>, including timings and memory usage.
+<li><a href="FAQ.html">FAQ</a>: answers to some Frequently Asked Questions.
<li><a href="manual/index.html">Manual</a>: the complete <b>ProGuard</b> user
- manual, with examples and troubleshooting tips.</li>
+ manual, with examples and troubleshooting tips.
<li><a href="quality.html">Quality</a>: a discussion of the (excellent) quality
- of <b>ProGuard</b>'s code.</li>
-<li><a href="screenshots.html">Screenshots</a>: some impressions of what <b>ProGuard</b> looks like.</li>
+ of <b>ProGuard</b>'s code.
+<li><a href="screenshots.html">Screenshots</a>: some impressions of what <b>ProGuard</b> looks like.
<li><a href="testimonials.html">Testimonials</a>: what users think of
- <b>ProGuard</b>.</li>
+ <b>ProGuard</b>.
<li><a href="license.html">License</a>: <b>ProGuard</b> is free, under a GPL
- license.</li>
+ license.
<li><a href="downloads.html">Downloads</a>: download the <b>ProGuard</b>
- package yourself.</li>
+ package yourself.
<li><a href="feedback.html">Feedback</a>: tell me about your experiences, or
- learn from others on our forums.</li>
+ learn from others on our forums.
<li><a href="acknowledgements.html">Acknowledgements</a>: people who have been
- helpful.</li>
+ helpful.
<li><a href="alternatives.html">Alternatives</a>: other Java obfuscators,
- optimizers, and shrinkers.</li>
+ optimizers, and shrinkers.
</ul>
-<hr />
-<noscript><div><a target="_top" href="index.html" class="button">Show menu</a></div></noscript>
+<hr>
<address>
-Copyright &copy; 2002-2011
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2009
+<a href="http://www.graphics.cornell.edu/~eric/">Eric Lafortune</a>.
</address>
</body>
</html>
diff --git a/docs/manual/ant.html b/docs/manual/ant.html
index 26c6853..bc3a3b4 100644
--- a/docs/manual/ant.html
+++ b/docs/manual/ant.html
@@ -1,21 +1,10 @@
-<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!doctype html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<meta http-equiv="content-style-type" content="text/css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>Ant Task</title>
-<script type="text/javascript" language="JavaScript">
-<!--
-if (window.self==window.top)
- window.top.location.replace("../index.html#"+window.location.pathname+window.location.hash);
-else {
- var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
- if (window.top.location.hash!=hash)
- window.top.location.hash=hash;
-}
-//-->
-</script>
</head>
<body>
@@ -118,7 +107,8 @@ href="usage.html">Usage</a> section. You can find some sample configuration
files in the <code>examples/ant</code> directory of the ProGuard distribution.
<p>
-<h2><a name="proguard">Task Attributes and Nested Elements</a></h2>
+<a name="proguard">&nbsp;</a>
+<h2>Task Attributes and Nested Elements</h2>
The <code><b>&lt;proguard&gt;</b></code> task and the
<code><b>&lt;proguardconfiguration&gt;</b></code> task can have the following
@@ -134,9 +124,9 @@ elements:
href="#configuration_element"><code>configuration</code></a>
<i>element</i>.</dd>
-<dt><a href="usage.html#skipnonpubliclibraryclasses"><code><b>skipnonpubliclibraryclasses</b></code></a>
+<dt><a href="usage.html#dontskipnonpubliclibraryclasses"><code><b>skipnonpubliclibraryclasses</b></code></a>
= "<i>boolean</i>"
- (default = false)</dt>
+ (default = true)</dt>
<dd>Ignore non-public library classes.</dd>
<dt><a href="usage.html#dontskipnonpubliclibraryclassmembers"><code><b>skipnonpubliclibraryclassmembers</b></code></a>
@@ -252,11 +242,6 @@ elements:
<dd>Repackage all class files that are renamed into the single given
package.</dd>
-<dt><a href="usage.html#keepparameternames"><code><b>keepparameternames</b></code></a>
- = "<i>boolean</i>"
- (default = false)</dt>
-<dd>Keep the parameter names and types of methods that are kept.</dd>
-
<dt><a href="usage.html#renamesourcefileattribute"><code><b>renamesourcefileattribute</b></code></a>
= "<i>string</i>"
(default = none)</dt>
@@ -463,7 +448,8 @@ elements:
</dl>
-<h2><a name="classpath">Class Path Attributes and Nested Elements</a></h2>
+<a name="classpath">&nbsp;</a>
+<h2>Class Path Attributes and Nested Elements</h2>
The jar tags are path tags, so they can have any of the path attributes (or
nested elements). The most common attributes are:
@@ -513,7 +499,8 @@ In addition, the jar tags can have ProGuard-style filter attributes:
</dl>
-<h2><a name="keepmodifier">Keep Modifier Attributes</a></h2>
+<a name="keepmodifier">&nbsp;</a>
+<h2>Keep Modifier Attributes</h2>
The keep tags can have the following <i>modifier</i> attributes:
@@ -539,7 +526,8 @@ The keep tags can have the following <i>modifier</i> attributes:
</dl>
-<h2><a name="classspecification">Class Specification Attributes and Nested Elements</a></h2>
+<a name="classspecification">&nbsp;</a>
+<h2>Class Specification Attributes and Nested Elements</h2>
The keep tags can have the following <i>class_specification</i> attributes and
<i>class_member_specifications</i> nested elements:
@@ -550,10 +538,6 @@ The keep tags can have the following <i>class_specification</i> attributes and
<dd>The optional access modifiers of the class. Any space-separated list of
"public", "final", and "abstract", with optional negators "!".</dd>
-<dt><code><b>annotation</b></code> = "<i>annotation_name</i>"</dt>
-<dd>The optional fully qualified name of an annotation of the class, with
- optional wildcards.</dd>
-
<dt><code><b>type</b></code> = "<i>type</i>"</dt>
<dd>The optional type of the class: one of "class", "interface", or
"!interface".</dd>
@@ -562,10 +546,6 @@ The keep tags can have the following <i>class_specification</i> attributes and
<dd>The optional fully qualified name of the class, with optional
wildcards.</dd>
-<dt><code><b>extendsannotation</b></code> = "<i>annotation_name</i>"</dt>
-<dd>The optional fully qualified name of an annotation of the the class that
- the specified classes must extend, with optional wildcards.</dd>
-
<dt><code><b>extends</b></code> = "<i>class_name</i>"</dt>
<dd>The optional fully qualified name of the class the specified classes
must extend, with optional wildcards.</dd>
@@ -591,7 +571,8 @@ The keep tags can have the following <i>class_specification</i> attributes and
</dl>
-<h2><a name="classmemberspecification">Class Member Specification Attributes</a></h2>
+<a name="classmemberspecification">&nbsp;</a>
+<h2>Class Member Specification Attributes</h2>
The class member tags can have the following <i>class_member_specification</i>
attributes:
@@ -603,10 +584,6 @@ attributes:
"public", "protected", "private", "static", etc., with optional negators
"!".</dd>
-<dt><code><b>annotation</b></code> = "<i>annotation_name</i>"</dt>
-<dd>The optional fully qualified name of an annotation of the class member,
- with optional wildcards.</dd>
-
<dt><code><b>type</b></code> = "<i>type</i>"</dt>
<dd>The optional fully qualified type of the class member, with optional
wildcards. Not applicable for constructors, but required for methods for
@@ -624,11 +601,10 @@ attributes:
</dl>
-<hr />
-<noscript><div><a target="_top" href="../index.html" class="button">Show menu</a></div></noscript>
+<hr>
<address>
-Copyright &copy; 2002-2011
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2009
+<a href="http://www.graphics.cornell.edu/~eric/">Eric Lafortune</a>.
</address>
</body>
</html>
diff --git a/docs/manual/examples.html b/docs/manual/examples.html
index 14e0758..3f47fca 100644
--- a/docs/manual/examples.html
+++ b/docs/manual/examples.html
@@ -1,21 +1,10 @@
-<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!doctype html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<meta http-equiv="content-style-type" content="text/css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>ProGuard Examples</title>
-<script type="text/javascript" language="JavaScript">
-<!--
-if (window.self==window.top)
- window.top.location.replace("../index.html#"+window.location.pathname+window.location.hash);
-else {
- var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
- if (window.top.location.hash!=hash)
- window.top.location.hash=hash;
-}
-//-->
-</script>
</head>
<body>
@@ -23,82 +12,76 @@ else {
Some typical useful configurations:
<ol>
-<li><a href="#application">A typical application</a></li>
-<li><a href="#applet">A typical applet</a></li>
-<li><a href="#midlet">A typical midlet</a></li>
-<li><a href="#jcapplet">A typical Java Card applet</a></li>
-<li><a href="#xlet">A typical xlet</a></li>
-<li><a href="#androidactivity">A simple Android activity</a></li>
-<li><a href="#androidapplication">A complete Android application</a></li>
-<li><a href="#library">A typical library</a></li>
-<li><a href="#applications">All possible applications in the input jars</a></li>
-<li><a href="#applets">All possible applets in the input jars</a></li>
-<li><a href="#midlets">All possible midlets in the input jars</a></li>
-<li><a href="#jcapplets">All possible Java Card applets in the input jars</a></li>
-<li><a href="#xlets">All possible xlets in the input jars</a></li>
-<li><a href="#servlets">All possible servlets in the input jars</a></li>
-<li><a href="#scala">Scala applications with the Scala runtime</a></li>
-<li><a href="#native">Processing native methods</a></li>
-<li><a href="#callback">Processing callback methods</a></li>
-<li><a href="#enumerations">Processing enumeration classes</a></li>
-<li><a href="#serializable">Processing serializable classes</a></li>
-<li><a href="#beans">Processing bean classes</a></li>
-<li><a href="#annotations">Processing annotations</a></li>
-<li><a href="#database">Processing database drivers</a></li>
-<li><a href="#componentui">Processing ComponentUI classes</a></li>
-<li><a href="#rmi">Processing RMI code</a></li>
-<li><a href="#resourcefiles">Processing resource files</a></li>
-<li><a href="#manifestfiles">Processing manifest files</a></li>
-<li><a href="#stacktrace">Producing useful obfuscated stack traces</a></li>
-<li><a href="#repackaging">Obfuscating package names</a></li>
-<li><a href="#restructuring">Restructuring the output archives</a></li>
-<li><a href="#filtering">Filtering the input and the output</a></li>
-<li><a href="#multiple">Processing multiple applications at once</a></li>
-<li><a href="#incremental">Incremental obfuscation</a></li>
-<li><a href="#microedition">Preverifying class files for Java Micro Edition</a></li>
-<li><a href="#upgrade">Upgrading class files to Java 6</a></li>
-<li><a href="#deadcode">Finding dead code</a></li>
-<li><a href="#structure">Printing out the internal structure of class files</a></li>
-<li><a href="#annotated">Using annotations to configure ProGuard</a></li>
+<li><a href="#application">A typical application</a>
+<li><a href="#applet">A typical applet</a>
+<li><a href="#midlet">A typical midlet</a>
+<li><a href="#jcapplet">A typical Java Card applet</a>
+<li><a href="#xlet">A typical xlet</a>
+<li><a href="#androidapplication">A typical Android application</a>
+<li><a href="#library">A typical library</a>
+<li><a href="#applications">All possible applications in the input jars</a>
+<li><a href="#applets">All possible applets in the input jars</a>
+<li><a href="#midlets">All possible midlets in the input jars</a>
+<li><a href="#jcapplets">All possible Java Card applets in the input jars</a>
+<li><a href="#xlets">All possible xlets in the input jars</a>
+<li><a href="#androidapplications">All possible Android applications in the input jars</a>
+<li><a href="#servlets">All possible servlets in the input jars</a>
+<li><a href="#native">Processing native methods</a>
+<li><a href="#callback">Processing callback methods</a>
+<li><a href="#enumerations">Processing enumeration classes</a>
+<li><a href="#serializable">Processing serializable classes</a>
+<li><a href="#beans">Processing bean classes</a>
+<li><a href="#annotations">Processing annotations</a>
+<li><a href="#database">Processing database drivers</a>
+<li><a href="#componentui">Processing ComponentUI classes</a>
+<li><a href="#rmi">Processing RMI code</a>
+<li><a href="#resourcefiles">Processing resource files</a>
+<li><a href="#stacktrace">Producing useful obfuscated stack traces</a>
+<li><a href="#repackaging">Obfuscating package names</a>
+<li><a href="#restructuring">Restructuring the output archives</a>
+<li><a href="#filtering">Filtering the input and the output</a>
+<li><a href="#multiple">Processing multiple applications at once</a>
+<li><a href="#incremental">Incremental obfuscation</a>
+<li><a href="#microedition">Preverifying class files for Java Micro Edition</a>
+<li><a href="#upgrade">Upgrading class files to Java 6</a>
+<li><a href="#deadcode">Finding dead code</a>
+<li><a href="#structure">Printing out the internal structure of class files</a>
+<li><a href="#annotated">Using annotations to configure ProGuard</a>
</ol>
You can find some sample configuration files in the <code>examples</code>
directory of the ProGuard distribution.
-<h3><a name="application">A typical application</a></h3>
-
-To shrink, optimize, and obfuscate a simple Java application, you typically
-create a configuration file like <code>myconfig.pro</code>, which can be used
-with
+<a name="application">&nbsp;</a>
+<h3>A typical application</h3>
+To shrink, optimize, and obfuscate the ProGuard application itself, one would
+typically create a configuration file <code>proguard.pro</code> and then type:
<pre>
-bin/proguard @myconfig.pro
+java -jar proguard.jar @proguard.pro
</pre>
<p>
-The configuration file specifies the input, the output, and the entry points
-of the application:
+The configuration file would contain the following options:
<pre>
--injars myapplication.jar
--outjars myapplication_out.jar
+-injars proguard.jar
+-outjars proguard_out.jar
-libraryjars &lt;java.home&gt;/lib/rt.jar
--printmapping myapplication.map
+-printmapping proguard.map
--keep public class mypackage.MyMain {
+-keep public class proguard.ProGuard {
public static void main(java.lang.String[]);
}
</pre>
<p>
-Note the use of the <code>&lt;java.home&gt;</code> system property. ProGuard
-automatically replaces it when parsing the file.
+Note the use of the <code>&lt;java.home&gt;</code> system property; it is
+replaced automatically.
+<p>
+Also note that all type names are fully specified:
+<code>proguard.ProGuard</code> and <code>java.lang.String[]</code>.
<p>
-The <a href="usage.html#keep"><code>-keep</code></a> option specifies the
-entry point of the application that has to be preserved.
The access modifiers <code>public</code> and <code>static</code> are not
really required in this case, since we know a priori that the specified class
and method have the proper access flags. It just looks more familiar this way.
<p>
-Note that all type names are fully specified:
-<code>mypackage.MyMain</code> and <code>java.lang.String[]</code>.
-<p>
We're writing out an obfuscation mapping file with <a
href="usage.html#printmapping"><code>-printmapping</code></a>, for
de-obfuscating any stack traces later on, or for incremental obfuscation of
@@ -120,10 +103,11 @@ href="#native">native methods</a>, <a href="#callback">callback methods</a>,
<a href="#enumerations">enumerations</a>, <a href="#serializable">serializable
classes</a>, <a href="#beans">bean classes</a>, <a
href="#annotations">annotations</a>, and <a href="#resourcefiles">resource
-files</a>.
-
-<h3><a name="applet">A typical applet</a></h3>
+files</a>. For processing 'simple' applications like ProGuard, that is not
+required.
+<a name="applet">&nbsp;</a>
+<h3>A typical applet</h3>
These options shrink, optimize, and obfuscate the applet
<code>mypackage.MyApplet</code>:
<pre>
@@ -145,15 +129,15 @@ classes</a>, <a href="#beans">bean classes</a>, <a
href="#annotations">annotations</a>, and <a href="#resourcefiles">resource
files</a>.
-<h3><a name="midlet">A typical midlet</a></h3>
-
+<a name="midlet">&nbsp;</a>
+<h3>A typical midlet</h3>
These options shrink, optimize, obfuscate, and preverify the midlet
<code>mypackage.MyMIDlet</code>:
<pre>
-injars in.jar
-outjars out.jar
--libraryjars /usr/local/java/wtk2.5.2/lib/midpapi20.jar
--libraryjars /usr/local/java/wtk2.5.2/lib/cldcapi11.jar
+-libraryjars /usr/local/java/wtk2.1/lib/midpapi20.jar
+-libraryjars /usr/local/java/wtk2.1/lib/cldcapi11.jar
-overloadaggressively
-repackageclasses ''
-allowaccessmodification
@@ -188,8 +172,8 @@ methods</a> and <a href="#resourcefiles">resource files</a>.
Note that you will still have to adapt the midlet jar size in the
corresponding jad file; ProGuard doesn't do that for you.
-<h3><a name="jcapplet">A typical Java Card applet</a></h3>
-
+<a name="jcapplet">&nbsp;</a>
+<h3>A typical Java Card applet</h3>
These options shrink, optimize, and obfuscate the Java Card applet
<code>mypackage.MyApplet</code>:
<pre>
@@ -208,8 +192,8 @@ The configuration is very similar to the configuration for midlets, except that
it now targets the Java Card run-time environment. This environment doesn't
have java.lang.Class, so we're telling ProGuard not to worry about it.
-<h3><a name="xlet">A typical xlet</a></h3>
-
+<a name="xlet">&nbsp;</a>
+<h3>A typical xlet</h3>
These options shrink, optimize, and obfuscate the xlet
<code>mypackage.MyXlet</code>:
<pre>
@@ -228,16 +212,15 @@ These options shrink, optimize, and obfuscate the xlet
The configuration is very similar to the configuration for midlets, except that
it now targets the CDC run-time environment with the Java TV API.
-<h3><a name="androidactivity">A simple Android activity</a></h3>
-
-These options shrink, optimize, and obfuscate the single Android
-activity <code>mypackage.MyActivity</code>:
+<a name="androidapplication">&nbsp;</a>
+<h3>A typical Android application</h3>
+These options shrink, optimize, and obfuscate the simple Android application
+based on a single activity <code>mypackage.MyActivity</code>:
<pre>
--injars bin/classes
--outjars bin/classes-processed.jar
--libraryjars /usr/local/java/android-sdk/platforms/android-9/android.jar
-
--dontpreverify
+-injars in.jar
+-outjars out.jar
+-libraryjars /usr/local/java/android-1.5_r1/platforms/android-1.5/android.jar
+-overloadaggressively
-repackageclasses ''
-allowaccessmodification
-optimizations !code/simplification/arithmetic
@@ -245,145 +228,27 @@ activity <code>mypackage.MyActivity</code>:
-keep public class mypackage.MyActivity
</pre>
<p>
-We're targeting the Android run-time and keeping the activity as an entry
-point.
-<p>
-Preverification is irrelevant for the dex compiler and the Dalvik VM, so we
-can switch it off with the
-<a href="usage.html#dontpreverify"><code>-dontpreverify</code></a> option.
+The configuration is very similar to the configuration for midlets, except that
+it now targets the Android run-time environment.
<p>
The <a href="usage.html#optimizations"><code>-optimizations</code></a> option
disables some arithmetic simplifications that Dalvik 1.0 and 1.5 can't handle.
-Note that the Dalvik VM also can't
-handle <a href="usage.html#overloadaggressively">aggressive overloading</a>
-(of static fields).
-<p>
-If applicable, you should add options for processing <a href="#native">native
-methods</a>, <a href="#callback">callback methods</a>,
-<a href="#enumerations">enumerations</a>,
-<a href="#annotations">annotations</a>, and
-<a href="#resourcefiles">resource files</a>.
-
-<h3><a name="androidapplication">A complete Android application</a></h3>
-
-These options shrink, optimize, and obfuscate all public activities, services,
-broadcast receivers, and content providers from the compiled classes and
-external libraries:
-<pre>
--injars bin/classes
--injars libs
--outjars bin/classes-processed.jar
--libraryjars /usr/local/java/android-sdk/platforms/android-9/android.jar
-
--dontpreverify
--repackageclasses ''
--allowaccessmodification
--optimizations !code/simplification/arithmetic
--keepattributes *Annotation*
-
--keep public class * extends android.app.Activity
--keep public class * extends android.app.Application
--keep public class * extends android.app.Service
--keep public class * extends android.content.BroadcastReceiver
--keep public class * extends android.content.ContentProvider
-
--keep public class * extends android.view.View {
- public &lt;init&gt;(android.content.Context);
- public &lt;init&gt;(android.content.Context, android.util.AttributeSet);
- public &lt;init&gt;(android.content.Context, android.util.AttributeSet, int);
- public void set*(...);
-}
-
--keepclasseswithmembers class * {
- public &lt;init&gt;(android.content.Context, android.util.AttributeSet);
-}
-
--keepclasseswithmembers class * {
- public &lt;init&gt;(android.content.Context, android.util.AttributeSet, int);
-}
-
--keepclassmembers class * implements android.os.Parcelable {
- static android.os.Parcelable$Creator CREATOR;
-}
-
--keepclassmembers class **.R$* {
- public static &lt;fields&gt;;
-}
-</pre>
-<p>
-Most importantly, we're keeping all fundamental classes that may be referenced
-by the <code>AndroidManifest.xml</code> file of the application. If your
-manifest file contains other classes and methods, you may have to specify
-those as well.
-<p>
-We're keeping annotations, since they might be used by custom
-<code>RemoteViews</code>.
-<p>
-We're keeping any custom <code>View</code> extensions and other classes with
-typical constructors, since they might be referenced from XML layout files.
-<p>
-We're also keeping the required static fields in <code>Parcelable</code>
-implementations, since they are accessed by introspection.
-<p>
-Finally, we're keeping the static fields of referenced inner classes of
-auto-generated <code>R</code> classes, just in case your code is accessing
-those fields by introspection. Note that the compiler already inlines
-primitive fields, so ProGuard can generally remove all these classes entirely
-anyway (because the classes are not referenced and therefore not required).
-<p>
-If you're using additional Google APIs, you'll have to specify
-those as well, for instance:
-<pre>
--libraryjars /usr/local/android-sdk/add-ons/google_apis-7_r01/libs/maps.jar
-</pre>
-<p>
-If you're using Google's optional License Verification Library, you can
-obfuscate its code along with your own code. You do have to preserve
-its <code>ILicensingService</code> interface for the library to work:
-<pre>
--keep public interface com.android.vending.licensing.ILicensingService
-</pre>
-<p>
-If you're using the Android Compatibility library, you should add the
-following line, to let ProGuard know it's ok that the library references some
-classes that are not available in all versions of the API:
-<pre>
--dontwarn android.support.**
-</pre>
<p>
If applicable, you should add options for processing <a href="#native">native
-methods</a>, <a href="#callback">callback methods</a>,
-<a href="#enumerations">enumerations</a>,
-and <a href="#resourcefiles">resource files</a>. You may also want to add
-options for producing <a href="#stacktrace">useful stack traces</a>. You can
-find a complete sample configuration in <code>examples/android.pro</code> in
-the ProGuard distribution.
-<p>
-The build process of the Android SDK (version 2.3 and higher) already
-integrates ProGuard by default. You only need to enable it (for release
-builds) by adding <code>proguard.config=proguard.cfg</code> to the file
-<code>build.properties</code>. In case of problems, you may want to check if
-the automatically generated file <code>proguard.cfg</code> contains the
-settings discussed above. The generated Ant build file already sets the input
-and output files for you.
-<p>
-For more information, you can consult the official <a target="other"
-href="http://developer.android.com/guide/developing/tools/proguard.html">Developer
-Guide</a> in the Android SDK.
-
-<h3><a name="library">A typical library</a></h3>
+methods</a>, <a href="#callback">callback methods</a>, and <a
+href="#resourcefiles">resource files</a>.
+<a name="library">&nbsp;</a>
+<h3>A typical library</h3>
These options shrink, optimize, and obfuscate an entire library, keeping all
public and protected classes and class members, native method names, and
-serialization code. The processed version of the library can then still be
-used as such, for developing code based on its public API.
+serialization code:
<pre>
-injars in.jar
-outjars out.jar
-libraryjars &lt;java.home&gt;/lib/rt.jar
-printmapping out.map
--keepparameternames
-renamesourcefileattribute SourceFile
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,
SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
@@ -408,7 +273,6 @@ used as such, for developing code based on its public API.
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
- private static final java.io.ObjectStreamField[] serialPersistentFields;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
@@ -425,12 +289,12 @@ The <a
href="usage.html#keepclassmembernames"><code>-keepclassmembernames</code></a>
option for the <code>class$</code> methods is not strictly necessary. These
methods are inserted by the <code>javac</code> compiler and the
-<code>jikes</code> compiler respectively, in JDK 1.2 and older, to implement
-the <code>.class</code> construct. ProGuard will automatically detect them and
-deal with them, even when their names have been obfuscated. However, other
-obfuscators may rely on the original method names. It may therefore be helpful
-to preserve them, in case these other obfuscators are ever used for further
-obfuscation of the library.
+<code>jikes</code> compiler respectively, to implement the <code>.class</code>
+construct. ProGuard will automatically detect them and deal with them, even
+when their names have been obfuscated. However, older versions of ProGuard and
+other obfuscators may rely on the original method names. It may therefore be
+helpful to preserve them, in case these other obfuscators are ever used for
+further obfuscation of the library.
<p>
The "Exceptions" attribute has to be preserved, so the compiler knows which
exceptions methods may throw.
@@ -443,11 +307,6 @@ classes otherwise.
The "Signature" attribute is required to be able to access generic types when
compiling in JDK 5.0 and higher.
<p>
-The <a href="usage.html#keepparameternames"><code>-keepparameternames</code></a>
-option keeps the parameter names in the "LocalVariableTable" and
-"LocalVariableTypeTable" attributes of public library methods. Some IDEs can
-present these names to the developers who use the library.
-<p>
Finally, we're keeping the "Deprecated" attribute and the attributes for
producing <a href="#stacktrace">useful stack traces</a>.
<p>
@@ -457,8 +316,8 @@ href="#serializable">serializable classes</a>, and <a
href="#annotations">annotations</a>, which are all discussed in their
respective examples.
-<h3><a name="applications">All possible applications in the input jars</a></h3>
-
+<a name="applications">&nbsp;</a>
+<h3>All possible applications in the input jars</h3>
These options shrink, optimize, and obfuscate all public applications in
<code>in.jar</code>:
<pre>
@@ -488,8 +347,8 @@ classes</a>, <a href="#beans">bean classes</a>, <a
href="#annotations">annotations</a>, and <a href="#resourcefiles">resource
files</a>.
-<h3><a name="applets">All possible applets in the input jars</a></h3>
-
+<a name="applets">&nbsp;</a>
+<h3>All possible applets in the input jars</h3>
These options shrink, optimize, and obfuscate all public applets in
<code>in.jar</code>:
<pre>
@@ -513,15 +372,15 @@ classes</a>, <a href="#beans">bean classes</a>, <a
href="#annotations">annotations</a>, and <a href="#resourcefiles">resource
files</a>.
-<h3><a name="midlets">All possible midlets in the input jars</a></h3>
-
+<a name="midlets">&nbsp;</a>
+<h3>All possible midlets in the input jars</h3>
These options shrink, optimize, obfuscate, and preverify all public midlets in
<code>in.jar</code>:
<pre>
-injars in.jar
-outjars out.jar
--libraryjars /usr/local/java/wtk2.5.2/lib/midpapi20.jar
--libraryjars /usr/local/java/wtk2.5.2/lib/cldcapi11.jar
+-libraryjars /usr/local/java/wtk2.1/lib/midpapi20.jar
+-libraryjars /usr/local/java/wtk2.1/lib/cldcapi11.jar
-overloadaggressively
-repackageclasses ''
-allowaccessmodification
@@ -553,8 +412,8 @@ methods</a> and <a href="#resourcefiles">resource files</a>.
Note that you will still have to adapt the midlet jar size in the
corresponding jad file; ProGuard doesn't do that for you.
-<h3><a name="jcapplets">All possible Java Card applets in the input jars</a></h3>
-
+<a name="jcapplets">&nbsp;</a>
+<h3>All possible Java Card applets in the input jars</h3>
These options shrink, optimize, and obfuscate all public Java Card applets in
<code>in.jar</code>:
<pre>
@@ -576,8 +435,8 @@ interface.
The <a href="usage.html#printseeds"><code>-printseeds</code></a> option prints
out which applets exactly will be preserved.
-<h3><a name="xlets">All possible xlets in the input jars</a></h3>
-
+<a name="xlets">&nbsp;</a>
+<h3>All possible xlets in the input jars</h3>
These options shrink, optimize, and obfuscate all public xlets in
<code>in.jar</code>:
<pre>
@@ -599,8 +458,38 @@ We're simply keeping all classes that implement the <code>Xlet</code> interface.
The <a href="usage.html#printseeds"><code>-printseeds</code></a> option prints
out which xlets exactly will be preserved.
-<h3><a name="servlets">All possible servlets in the input jars</a></h3>
+<a name="androidapplications">&nbsp;</a>
+<h3>All possible Android applications in the input jars</h3>
+These options shrink, optimize, and obfuscate all public activities, services,
+broadcast receivers, and content providers in <code>in.jar</code>:
+<pre>
+-injars in.jar
+-outjars out.jar
+-libraryjars /usr/local/java/android-1.5_r1/platforms/android-1.5/android.jar
+-overloadaggressively
+-repackageclasses ''
+-allowaccessmodification
+-optimizations !code/simplification/arithmetic
+-printseeds
+-keep public class * extends android.app.Activity
+-keep public class * extends android.app.Service
+-keep public class * extends android.content.BroadcastReceiver
+-keep public class * extends android.content.ContentProvider
+</pre>
+<p>
+We're keeping all classes that extend the base classes that may be referenced
+by the <code>AndroidManifest.xml</code> file of the application.
+<p>
+The <a href="usage.html#printseeds"><code>-printseeds</code></a> option prints
+out which implementations exactly will be preserved.
+<p>
+If applicable, you should add options for processing <a href="#native">native
+methods</a>, <a href="#callback">callback methods</a>, and <a
+href="#resourcefiles">resource files</a>.
+
+<a name="servlets">&nbsp;</a>
+<h3>All possible servlets in the input jars</h3>
These options shrink, optimize, and obfuscate all public servlets in
<code>in.jar</code>:
<pre>
@@ -632,77 +521,8 @@ classes</a>, <a href="#beans">bean classes</a>, <a
href="#annotations">annotations</a>, and <a href="#resourcefiles">resource
files</a>.
-<h3><a name="scala">Scala applications with the Scala runtime</a></h3>
-
-These options shrink, optimize, and obfuscate all public Scala applications in
-<code>in.jar</code>:
-<pre>
--injars in.jar
--injars /usr/local/java/scala-2.9.1/lib/scala-library.jar
--outjars out.jar
--libraryjars &lt;java.home&gt;/lib/rt.jar
-
--dontwarn scala.**
-
--keepclasseswithmembers public class * {
- public static void main(java.lang.String[]);
-}
-
--keep class * implements org.xml.sax.EntityResolver
-
--keepclassmembers class * {
- ** MODULE$;
-}
-
--keepclassmembernames class scala.concurrent.forkjoin.ForkJoinPool {
- long eventCount;
- int workerCounts;
- int runControl;
- scala.concurrent.forkjoin.ForkJoinPool$WaitQueueNode syncStack;
- scala.concurrent.forkjoin.ForkJoinPool$WaitQueueNode spareStack;
-}
-
--keepclassmembernames class scala.concurrent.forkjoin.ForkJoinWorkerThread {
- int base;
- int sp;
- int runState;
-}
-
--keepclassmembernames class scala.concurrent.forkjoin.ForkJoinTask {
- int status;
-}
-
--keepclassmembernames class scala.concurrent.forkjoin.LinkedTransferQueue {
- scala.concurrent.forkjoin.LinkedTransferQueue$PaddedAtomicReference head;
- scala.concurrent.forkjoin.LinkedTransferQueue$PaddedAtomicReference tail;
- scala.concurrent.forkjoin.LinkedTransferQueue$PaddedAtomicReference cleanMe;
-}
-</pre>
-<p>
-The configuration is essentially the same as
-for <a href="#applications">processing applications</a>, because Scala is
-compiled to ordinary Java bytecode. However, the example processes the Scala
-runtime library as well. The processed jar can be an order of magnitude
-smaller and a few times faster than the original code (for the Scala code
-examples, for instance).
-<p>
-The <a href="usage.html#dontwarn"><code>-dontwarn</code></a> option tells
-ProGuard not to complain about some artefacts in the Scala runtime, the way it
-is compiled by the <code>scalac</code> compiler (at least in Scala 2.9.1 and
-older). Note that this option should always be used with care.
-<p>
-The additional <a href="usage.html#keepoverview"><code>-keep</code></a>
-options make sure that some classes and some fields that are accessed by means
-of introspection are not removed or renamed.
-<p>
-If applicable, you should add options for processing <a href="#native">native
-methods</a>, <a href="#callback">callback methods</a>, <a
-href="#enumerations">enumerations</a>, <a href="#serializable">serializable
-classes</a>, <a href="#beans">bean classes</a>, <a
-href="#annotations">annotations</a>, and <a href="#resourcefiles">resource
-files</a>.
-<h3><a name="native">Processing native methods</a></h3>
-
+<a name="native">&nbsp;</a>
+<h3>Processing native methods</h3>
If your application, applet, servlet, library, etc., contains native methods,
you'll want to preserve their names and their classes' names, so they can
still be linked to the native library. The following additional option will
@@ -723,8 +543,8 @@ the classes or class members that are invoked by the native code. These are
entry points, which you'll have to specify explicitly. <a
href="callback">Callback methods</a> are discussed below as a typical example.
-<h3><a name="callback">Processing callback methods</a></h3>
-
+<a name="callback">&nbsp;</a>
+<h3>Processing callback methods</h3>
If your application, applet, servlet, library, etc., contains callback
methods, which are called from external code (native code, scripts,...),
you'll want to preserve them, and probably their classes too. They are just
@@ -739,8 +559,8 @@ the following option will keep the callback class and method:
<p>
This will preserve the given class and method from being removed or renamed.
-<h3><a name="enumerations">Processing enumeration classes</a></h3>
-
+<a name="enumerations">&nbsp;</a>
+<h3>Processing enumeration classes</h3>
If your application, applet, servlet, library, etc., contains enumeration
classes, you'll have to preserve some special methods. Enumerations were
introduced in Java 5. The java compiler translates enumerations into classes
@@ -756,8 +576,8 @@ removed or obfuscated:
}
</pre>
-<h3><a name="serializable">Processing serializable classes</a></h3>
-
+<a name="serializable">&nbsp;</a>
+<h3>Processing serializable classes</h3>
More complex applications, applets, servlets, libraries, etc., may contain
classes that are serialized. Depending on the way in which they are used, they
may require special attention:
@@ -769,7 +589,6 @@ may require special attention:
<pre>
-keepclassmembers class * implements java.io.Serializable {
- private static final java.io.ObjectStreamField[] serialPersistentFields;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
@@ -783,7 +602,8 @@ may require special attention:
option makes sure that any serialization methods are kept. By using this
option instead of the basic <code>-keep</code> option, we're not
forcing preservation of <i>all</i> serializable classes, just preservation
- of the listed members of classes that are actually used.</li>
+ of the listed members of classes that are actually used.
+ <p>
<li>Sometimes, the serialized data are stored, and read back later into newer
versions of the serializable classes. One then has to take care the classes
@@ -797,7 +617,7 @@ may require special attention:
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
- private static final java.io.ObjectStreamField[] serialPersistentFields;
+ static final java.io.ObjectStreamField[] serialPersistentFields;
!static !transient &lt;fields&gt;;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
@@ -812,7 +632,7 @@ may require special attention:
The <code>&lt;fields&gt;</code> line preserves all non-static,
non-transient fields, with their original names. The introspection of the
serialization process and the de-serialization process will then find
- consistent names.</li>
+ consistent names.
<li>Occasionally, the serialized data have to remain compatible, but the
classes involved lack <code>serialVersionUID</code> fields. I imagine the
@@ -831,7 +651,7 @@ may require special attention:
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
- private static final java.io.ObjectStreamField[] serialPersistentFields;
+ static final java.io.ObjectStreamField[] serialPersistentFields;
!static !transient &lt;fields&gt;;
!private &lt;fields&gt;;
!private &lt;methods&gt;;
@@ -848,7 +668,7 @@ may require special attention:
interfaces of the serializable classes (using something like "<code>-keep
interface MyInterface</code>"), since these names are also used when
computing the UID. A fast but sub-optimal alternative would be simply
- keeping all interfaces with "<code>-keep interface *</code>".</li>
+ keeping all interfaces with "<code>-keep interface *</code>".
</ul>
<p>
@@ -859,8 +679,8 @@ the <code>Serialization</code> interface, yet only a small number may actually
ever be serialized. Knowing your application and tuning the configuration
often produces more compact results.
-<h3><a name="beans">Processing bean classes</a></h3>
-
+<a name="beans">&nbsp;</a>
+<h3>Processing bean classes</h3>
If your application, applet, servlet, library, etc., makes extensive use of
introspection on bean classes to find bean editor classes, or getter and
setter methods, then configuration may become painful. There's not much else
@@ -895,8 +715,8 @@ The '<code>***</code>' wildcard matches any type (primitive or non-primitive,
array or non-array). The methods with the '<code>int</code>' arguments matches
properties that are lists.
-<h3><a name="annotations">Processing annotations</a></h3>
-
+<a name="annotations">&nbsp;</a>
+<h3>Processing annotations</h3>
If your application, applet, servlet, library, etc., uses annotations, you may
want to preserve them in the processed output. Annotations are represented by
attributes that have no direct effect on the execution of the code. However,
@@ -924,8 +744,8 @@ has to be preserved as well:
-keepattributes EnclosingMethod
</pre>
-<h3><a name="database">Processing database drivers</a></h3>
-
+<a name="database">&nbsp;</a>
+<h3>Processing database drivers</h3>
Database drivers are implementations of the <code>Driver</code> interface.
Since they are often created dynamically, you may want to preserve any
implementations that you are processing as entry points:
@@ -938,8 +758,8 @@ This option also gets rid of the note that ProGuard prints out about
instantiating a driver in your code (without necessarily implementing any
drivers yourself).
-<h3><a name="componentui">Processing ComponentUI classes</a></h3>
-
+<a name="componentui">&nbsp;</a>
+<h3>Processing ComponentUI classes</h3>
Swing UI look and feels are implemented as extensions of the
<code>ComponentUI</code> class. For some reason, these have to contain a
static method <code>createUI</code>, which the Swing API invokes using
@@ -953,8 +773,8 @@ point, for instance like this:
<p>
This option also keeps the classes themselves.
-<h3><a name="rmi">Processing RMI code</a></h3>
-
+<a name="rmi">&nbsp;</a>
+<h3>Processing RMI code</h3>
Reportedly, the easiest way to handle RMI code is to process the code with
ProGuard first and then invoke the <code>rmic</code> tool. If that is not
possible, you may want to try something like this:
@@ -978,8 +798,8 @@ The <code>Exceptions</code> attribute has to be kept too, because the RMI
handling code performs introspection to check whether the method signatures
are compatible.
-<h3><a name="resourcefiles">Processing resource files</a></h3>
-
+<a name="resourcefiles">&nbsp;</a>
+<h3>Processing resource files</h3>
If your application, applet, servlet, library, etc., contains resource files,
it may be necessary to adapt their names and/or their contents when the
application is obfuscated. The following two options can achieve this
@@ -998,31 +818,8 @@ option looks for class names in properties files and in the manifest file, and
replaces these names by the obfuscated names (if any). You'll probably want to
adapt the filters to suit your application.
-<h3><a name="manifestfiles">Processing manifest files</a></h3>
-
-As illustrated in the previous section, manifest files can be treated like
-ordinary resource files. ProGuard can adapt obfuscated class names in the
-files, but it won't make any other changes. If you want anything else, you
-should apply an external tool. For instance, if a manifest file contains
-signing information, you should sign the jar again after it has been
-processed.
-<p>
-If you're merging several input jars into a single output jar, you'll have to
-pick one, typically by specifying <a href="usage.html#filters">filters</a>:
-<pre>
--injars in1.jar
--injars in2.jar(!META-INF/MANIFEST.MF)
--injars in3.jar(!META-INF/MANIFEST.MF)
--outjars out.jar
-</pre>
-<p>
-The filters will let ProGuard copy the manifest file from the first jar and
-ignore any manifest files in the second and third input jars. Note that
-ProGuard will leave the order of the files in the jars unchanged; manifest
-files are not necessarily put first.
-
-<h3><a name="stacktrace">Producing useful obfuscated stack traces</a></h3>
-
+<a name="stacktrace">&nbsp;</a>
+<h3>Producing useful obfuscated stack traces</h3>
These options let obfuscated applications or libraries produce stack traces
that can still be deciphered later on:
<pre>
@@ -1047,8 +844,8 @@ their original names, so we're saving the mapping to a file
<code>out.map</code>. The information can then be used by the <a
href="retrace/index.html">ReTrace</a> tool to restore the original stack trace.
-<h3><a name="repackaging">Obfuscating package names</a></h3>
-
+<a name="repackaging">&nbsp;</a>
+<h3>Obfuscating package names</h3>
Package names can be obfuscated in various ways, with increasing levels of
obfuscation and compactness. For example, consider the following classes:
<pre>
@@ -1154,8 +951,8 @@ Note that not all levels of obfuscation of package names may be acceptable for
all code. Notably, you may have to take into account that your application may
contain <a href="#resourcefiles">resource files</a> that have to be adapted.
-<h3><a name="restructuring">Restructuring the output archives</a></h3>
-
+<a name="restructuring">&nbsp;</a>
+<h3>Restructuring the output archives</h3>
In simple applications, all output classes and resources files are merged into
a single jar. For example:
<pre>
@@ -1225,12 +1022,12 @@ This grouping, archiving, and flattening can be arbitrarily complex. ProGuard
always tries to package output archives in a sensible way, reconstructing the
input entries as much as required.
-<h3><a name="filtering">Filtering the input and the output</a></h3>
+<a name="filtering">&nbsp;</a>
+<h3>Filtering the input and the output</h3>
-If you want even greater control, you can add
-<a href="usage.html#filters">filters</a> to the input and the output,
-filtering out zips, ears, wars, jars, and/or ordinary files. For example, if
-you want to disregard certain files from an input jar:
+If you want even greater control, you can add filters to the input and the
+output, filtering out zips, ears, wars, jars, and/or ordinary files. For
+example, if you want to disregard certain files from an input jar:
<pre>
-injars in.jar(!images/**)
-outjars out.jar
@@ -1283,10 +1080,10 @@ files to <code>code_out.jar</code>, and all remaining files to
<code>resources_out.jar</code>.
<p>
Again, the filtering can be arbitrarily complex, especially when combined with
-grouping input and output.
-
-<h3><a name="multiple">Processing multiple applications at once</a></h3>
+the grouping of input and output.
+<a name="multiple">&nbsp;</a>
+<h3>Processing multiple applications at once</h3>
You can process several dependent or independent applications (or applets,
midlets,...) in one go, in order to save time and effort. ProGuard's input and
output handling offers various ways to keep the output nicely structured.
@@ -1303,10 +1100,10 @@ just the input and output options:
</pre>
<p>
After processing, the directory <code>processed_applications</code> will
-contain processed versions of application jars, with their original names.
-
-<h3><a name="incremental">Incremental obfuscation</a></h3>
+contain the processed application jars, with their original names.
+<a name="incremental">&nbsp;</a>
+<h3>Incremental obfuscation</h3>
After having <a href="#application">processed an application</a>, e.g.
ProGuard itself, you can still incrementally add other pieces of code that
depend on it, e.g. the ProGuard GUI:
@@ -1352,18 +1149,18 @@ jar as a library jar:
}
</pre>
-<h3><a name="microedition">Preverifying class files for Java Micro Edition</a></h3>
-
+<a name="microedition">&nbsp;</a>
+<h3>Preverifying class files for Java Micro Edition</h3>
Even if you're not interested in shrinking, optimizing, and obfuscating your
midlets, as shown in the <a href="#midlets">midlets example</a>, you can still
use ProGuard to preverify the class files for Java Micro Edition. ProGuard
-produces slightly more compact results than the traditional external
+produces slightly more compact results compared to the traditional external
preverifier.
<pre>
-injars in.jar
-outjars out.jar
--libraryjars /usr/local/java/wtk2.5.2/lib/midpapi20.jar
--libraryjars /usr/local/java/wtk2.5.2/lib/cldcapi11.jar
+-libraryjars /usr/local/java/wtk2.1/lib/midpapi20.jar
+-libraryjars /usr/local/java/wtk2.1/lib/cldcapi11.jar
-dontshrink
-dontoptimize
@@ -1378,8 +1175,8 @@ href="usage.html#microedition"><code>-microedition</code></a> option. Note
that we don't need any <code>-keep</code> options to specify entry points; all
class files are simply preverified.
-<h3><a name="upgrade">Upgrading class files to Java 6</a></h3>
-
+<a name="upgrade">&nbsp;</a>
+<h3>Upgrading class files to Java 6</h3>
The following options upgrade class files to Java 6, by updating their
internal version numbers and preverifying them. The class files can then be
loaded more efficiently by the Java 6 Virtual Machine.
@@ -1401,8 +1198,8 @@ automatically be preverified for Java 6 as a result. Note that we don't need
any <code>-keep</code> options to specify entry points; all class files are
simply updated and preverified.
-<h3><a name="deadcode">Finding dead code</a></h3>
-
+<a name="deadcode">&nbsp;</a>
+<h3>Finding dead code</h3>
These options list unused classes, fields, and methods in the application
<code>mypackage.MyApplication</code>:
<pre>
@@ -1435,8 +1232,8 @@ that keeps those fields a priori, in order to avoid having them listed:
}
</pre>
-<h3><a name="structure">Printing out the internal structure of class files</a></h3>
-
+<a name="structure">&nbsp;</a>
+<h3>Printing out the internal structure of class files</h3>
These options print out the internal structure of all class files in the input
jar:
<pre>
@@ -1453,7 +1250,8 @@ jar:
Note how we don't need to specify the Java run-time jar, because we're not
processing the input jar at all.
-<h3><a name="annotated">Using annotations to configure ProGuard</a></h3>
+<a name="annotated">&nbsp;</a>
+<h3>Using annotations to configure ProGuard</h3>
The traditional ProGuard configuration allows to keep a clean separation
between the code and the configuration for shrinking, optimization, and
@@ -1493,12 +1291,12 @@ href="#annotations">annotations</a>.
<p>
The directory <code>examples/annotations</code> contains more examples that
illustrate some of the possibilities.
+<p>
-<hr />
-<noscript><div><a target="_top" href="../index.html" class="button">Show menu</a></div></noscript>
+<hr>
<address>
-Copyright &copy; 2002-2011
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2009
+<a href="http://www.graphics.cornell.edu/~eric/">Eric Lafortune</a>.
</address>
</body>
</html>
diff --git a/docs/manual/gui.html b/docs/manual/gui.html
index aa41b1b..37684a6 100644
--- a/docs/manual/gui.html
+++ b/docs/manual/gui.html
@@ -1,21 +1,10 @@
-<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!doctype html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<meta http-equiv="content-style-type" content="text/css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>ProGuard GUI</title>
-<script type="text/javascript" language="JavaScript">
-<!--
-if (window.self==window.top)
- window.top.location.replace("../index.html#"+window.location.pathname+window.location.hash);
-else {
- var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
- if (window.top.location.hash!=hash)
- window.top.location.hash=hash;
-}
-//-->
-</script>
</head>
<body>
@@ -68,7 +57,8 @@ process is assumed. Please refer to the <a
href="introduction.html">Introduction</a> of this manual.
<p>
-<h2><a name="proguard">The ProGuard Tab</a></h2>
+<a name="proguard">&nbsp;</a>
+<h2>The ProGuard Tab</h2>
The <i>ProGuard</i> tab presents a welcome message and one important button at
the bottom:
@@ -85,7 +75,8 @@ If you don't want to load an existing configuration, you can just continue
creating a new configuration from scratch.
<p>
-<h2><a name="inputoutput">The Input/Output Tab</a></h2>
+<a name="inputoutput">&nbsp;</a>
+<h2>The Input/Output Tab</h2>
The <i>Input/Output</i> tab contains two lists, respectively to specify the
program jars (or wars, ears, zips, or directories), and the library jars (or
@@ -97,12 +88,12 @@ wars, ears, zips, or directories).
entries specify the destinations to which the processed results will be
written. They are preceded by arrows, to distinguish them from input
entries. The results of each consecutive list of input entries will be
- written to the subsequent consecutive list of output entries.</li>
+ written to the subsequent consecutive list of output entries.
<li>The library jars are not copied to the output jars; they contain class
files that are used by class files in the program jars and that are
necessary for correct processing. This list typically at least contains the
- targeted Java runtime jar.</li>
+ targeted Java runtime jar.
</ul>
<p>
@@ -154,15 +145,16 @@ any duplicate entries gets precedence, just as in conventional class paths.
Corresponding configuration options:
<ul type="none">
-<li>-<a href="usage.html#injars">injars</a></li>
-<li>-<a href="usage.html#outjars">outjars</a></li>
-<li>-<a href="usage.html#libraryjars">libraryjars</a></li>
-<li><a href="usage.html#classpath"><i>class_path</i></a></li>
-<li><a href="usage.html#filters"><i>filters</i></a></li>
+<li>-<a href="usage.html#injars">injars</a>
+<li>-<a href="usage.html#outjars">outjars</a>
+<li>-<a href="usage.html#libraryjars">libraryjars</a>
+<li><a href="usage.html#classpath"><i>class_path</i></a>
+<li><a href="usage.html#filters"><i>filters</i></a>
</ul>
<p>
-<h2><a name="shrinking">The Shrinking Tab</a></h2>
+<a name="shrinking">&nbsp;</a>
+<h2>The Shrinking Tab</h2>
The <i>Shrinking</i> tab presents a number of options that affect the
shrinking step. The basic options are followed by a few lists of classes and
@@ -232,41 +224,41 @@ advanced options.
<ul>
<li>The <b>Comments</b> text field allows to add optional comments to this
entry. The comments will identify the entry in the list and they will
- appear as comments in the configuration file.</li>
+ appear as comments in the configuration file.
<li>The <b>Keep</b> selection allows to specify whether you want to protect
the specified classes and their specified class members, or just the
specified class members from the specified classes, or the specified
classes and the specified class members, if the class members are present.
Note that class members will only be protected if they are explicitly
- specified, even if only by means of a wildcard.</li>
+ specified, even if only by means of a wildcard.
<li>The <b>Allow</b> selection allows to specify whether you want to allow the
the specified classes and their specified class members to be shrunk,
- optimized and/or obfuscated.</li>
+ optimized and/or obfuscated.
<li>The <b>Access</b> selections allows to specify constraints on the class or
- classes, based on their access modifiers.</li>
+ classes, based on their access modifiers.
<li>The <b>Annotation</b> text field takes the fully-qualified name of an
annotation that is required for matching classes. The annotation name can
contain wildcards. This is an advanced option for defining <i>keep</i>
- annotations.</li>
+ annotations.
<li>The <b>Class</b> text field takes the fully-qualified name of the class or
- classes. The class name can contain wildcards.</li>
+ classes. The class name can contain wildcards.
<li>The <b>Annotation</b> text field takes the fully-qualified name of an
annotation that is required for the class or interface that the above
class must extend. The annotation name can contain wildcards. This is an
- advanced option for defining <i>keep</i> annotations.</li>
+ advanced option for defining <i>keep</i> annotations.
<li>The <b>Extends/implements class</b> text field takes the fully-qualified
- name of the class or interface that the above classes must extend.</li>
+ name of the class or interface that the above classes must extend.
<li>The <b>Class members</b> list allows to specify a list of fields and
methods to keep. It can be edited by means of a list of buttons on the
- right-hand side.</li>
+ right-hand side.
</ul>
<p>
@@ -278,18 +270,18 @@ advanced options.
<ul>
<li>The <b>Access</b> selections allows to specify constraints on the field or
- fields, based on their access modifiers.</li>
+ fields, based on their access modifiers.
<li>The <b>Annotation</b> text field takes the fully-qualified name of an
annotation that is required for matching fields. The annotation name can
contain wildcards. This is an advanced option for defining <i>keep</i>
- annotations.</li>
+ annotations.
<li>The <b>Return type</b> text field takes the fully-qualified type of the
- field or fields. The type can contain wildcards.</li>
+ field or fields. The type can contain wildcards.
<li>The <b>Name</b> text field takes the name of the field or fields. The field
- name can contain wildcards.</li>
+ name can contain wildcards.
</ul>
<p>
@@ -301,35 +293,36 @@ to toggle showing the advanced options.
<ul>
<li>The <b>Access</b> selections allows to specify constraints on the method or
- methods, based on their access modifiers.</li>
+ methods, based on their access modifiers.
<li>The <b>Annotation</b> text field takes the fully-qualified name of an
annotation that is required for matching methods. The annotation name can
contain wildcards. This is an advanced option for defining <i>keep</i>
- annotations.</li>
+ annotations.
-<li>The <b>Return type</b> text field takes the fully-qualified type of the method or methods. The type can contain wildcards.</li>
+<li>The <b>Return type</b> text field takes the fully-qualified type of the method or methods. The type can contain wildcards.
<li>The <b>Name</b> text field takes the name of the method or methods. The
- method name can contain wildcards.</li>
+ method name can contain wildcards.
<li>The <b>Arguments</b> text field takes the comma-separated list of
fully-qualified method arguments. Each of these arguments can contain
- wildcards.</li>
+ wildcards.
</ul>
<p>
Corresponding configuration options:
<ul type="none">
-<li>-<a href="usage.html#dontshrink">dontshrink</a></li>
-<li>-<a href="usage.html#printusage">printusage</a></li>
-<li>-<a href="usage.html#keep">keep</a></li>
-<li>-<a href="usage.html#keepclassmembers">keepclassmembers</a></li>
-<li>-<a href="usage.html#keepclasseswithmembers">keepclasseswithmembers</a></li>
+<li>-<a href="usage.html#dontshrink">dontshrink</a>
+<li>-<a href="usage.html#printusage">printusage</a>
+<li>-<a href="usage.html#keep">keep</a>
+<li>-<a href="usage.html#keepclassmembers">keepclassmembers</a>
+<li>-<a href="usage.html#keepclasseswithmembers">keepclasseswithmembers</a>
</ul>
<p>
-<h2><a name="obfuscation">The Obfuscation Tab</a></h2>
+<a name="obfuscation">&nbsp;</a>
+<h2>The Obfuscation Tab</h2>
The <i>Obfuscation</i> tab presents a number of options that affect the
obfuscation step. The basic options are followed by a few lists of classes and
@@ -343,32 +336,32 @@ href="#shrinking">Shrinking Tab</a>.
Corresponding configuration options:
<ul type="none">
-<li>-<a href="usage.html#dontobfuscate">dontobfuscate</a></li>
-<li>-<a href="usage.html#printmapping">printmapping</a></li>
-<li>-<a href="usage.html#applymapping">applymapping</a></li>
-<li>-<a href="usage.html#obfuscationdictionary">obfuscationdictionary</a></li>
-<li>-<a href="usage.html#classobfuscationdictionary">classobfuscationdictionary</a></li>
-<li>-<a href="usage.html#packageobfuscationdictionary">packageobfuscationdictionary</a></li>
-<li>-<a href="usage.html#overloadaggressively">overloadaggressively</a></li>
-<li>-<a href="usage.html#useuniqueclassmembernames">useuniqueclassmembernames</a></li>
-<li>-<a href="usage.html#dontusemixedcaseclassnames">dontusemixedcaseclassnames</a></li>
-<li>-<a href="usage.html#keeppackagenames">keeppackagenames</a></li>
-<li>-<a href="usage.html#flattenpackagehierarchy">flattenpackagehierarchy</a></li>
-<li>-<a href="usage.html#repackageclasses">repackageclasses</a></li>
-<li>-<a href="usage.html#keepattributes">keepattributes</a></li>
-<li>-<a href="usage.html#keepparameternames">keepparameternames</a></li>
-<li>-<a href="usage.html#renamesourcefileattribute">renamesourcefileattribute</a></li>
-<li>-<a href="usage.html#adaptclassstrings">adaptclassstrings</a></li>
-<li>-<a href="usage.html#adaptresourcefilenames">adaptresourcefilenames</a></li>
-<li>-<a href="usage.html#adaptresourcefilecontents">adaptresourcefilecontents</a></li>
-<li>-<a href="usage.html#keepnames">keepnames</a></li>
-<li>-<a href="usage.html#keepclassmembernames">keepclassmembernames</a></li>
-<li>-<a href="usage.html#keepclasseswithmembernames">keepclasseswithmembernames</a></li>
-<li><a href="usage.html#classspecification"><i>class_specification</i></a></li>
+<li>-<a href="usage.html#dontobfuscate">dontobfuscate</a>
+<li>-<a href="usage.html#printmapping">printmapping</a>
+<li>-<a href="usage.html#applymapping">applymapping</a>
+<li>-<a href="usage.html#obfuscationdictionary">obfuscationdictionary</a>
+<li>-<a href="usage.html#classobfuscationdictionary">classobfuscationdictionary</a>
+<li>-<a href="usage.html#packageobfuscationdictionary">packageobfuscationdictionary</a>
+<li>-<a href="usage.html#overloadaggressively">overloadaggressively</a>
+<li>-<a href="usage.html#useuniqueclassmembernames">useuniqueclassmembernames</a>
+<li>-<a href="usage.html#dontusemixedcaseclassnames">dontusemixedcaseclassnames</a>
+<li>-<a href="usage.html#keeppackagenames">keeppackagenames</a>
+<li>-<a href="usage.html#flattenpackagehierarchy">flattenpackagehierarchy</a>
+<li>-<a href="usage.html#repackageclasses">repackageclasses</a>
+<li>-<a href="usage.html#keepattributes">keepattributes</a>
+<li>-<a href="usage.html#renamesourcefileattribute">renamesourcefileattribute</a>
+<li>-<a href="usage.html#adaptclassstrings">adaptclassstrings</a>
+<li>-<a href="usage.html#adaptresourcefilenames">adaptresourcefilenames</a>
+<li>-<a href="usage.html#adaptresourcefilecontents">adaptresourcefilecontents</a>
+<li>-<a href="usage.html#keepnames">keepnames</a>
+<li>-<a href="usage.html#keepclassmembernames">keepclassmembernames</a>
+<li>-<a href="usage.html#keepclasseswithmembernames">keepclasseswithmembernames</a>
+<li><a href="usage.html#classspecification"><i>class_specification</i></a>
</ul>
<p>
-<h2><a name="optimization">The Optimization Tab</a></h2>
+<a name="optimization">&nbsp;</a>
+<h2>The Optimization Tab</h2>
The <i>Optimization</i> tab presents a number of options that affect the
optimization step. The basic options are followed by a few lists of class
@@ -382,17 +375,18 @@ href="#shrinking">Shrinking Tab</a>.
Corresponding configuration options:
<ul type="none">
-<li>-<a href="usage.html#dontoptimize">dontoptimize</a></li>
-<li>-<a href="usage.html#optimizations">optimizations</a></li>
-<li>-<a href="usage.html#optimizationpasses">optimizationpasses</a></li>
-<li>-<a href="usage.html#allowaccessmodification">allowaccessmodification</a></li>
-<li>-<a href="usage.html#mergeinterfacesaggressively">mergeinterfacesaggressively</a></li>
-<li>-<a href="usage.html#assumenosideeffects">assumenosideeffects</a></li>
-<li><a href="usage.html#classspecification"><i>class_specification</i></a></li>
+<li>-<a href="usage.html#dontoptimize">dontoptimize</a>
+<li>-<a href="usage.html#optimizations">optimizations</a>
+<li>-<a href="usage.html#optimizationpasses">optimizationpasses</a>
+<li>-<a href="usage.html#allowaccessmodification">allowaccessmodification</a>
+<li>-<a href="usage.html#mergeinterfacesaggressively">mergeinterfacesaggressively</a>
+<li>-<a href="usage.html#assumenosideeffects">assumenosideeffects</a>
+<li><a href="usage.html#classspecification"><i>class_specification</i></a>
</ul>
<p>
-<h2><a name="information">The Information Tab</a></h2>
+<a name="information">&nbsp;</a>
+<h2>The Information Tab</h2>
The <i>Information</i> tab presents a number of options for preverification
and targeting, and for the information that ProGuard returns when processing
@@ -402,26 +396,26 @@ classes and class members are being kept in the shrinking step.
Corresponding configuration options:
<ul type="none">
-<li>-<a href="usage.html#dontpreverify">dontpreverify</a></li>
-<li>-<a href="usage.html#microedition">microedition</a></li>
-<li>-<a href="usage.html#target">target</a></li>
-<li>-<a href="usage.html#verbose">verbose</a></li>
-<li>-<a href="usage.html#dontnote">dontnote</a></li>
-<li>-<a href="usage.html#dontwarn">dontwarn</a></li>
-<li>-<a href="usage.html#ignorewarnings">ignorewarnings</a></li>
-<li>-<a href="usage.html#skipnonpubliclibraryclasses">skipnonpubliclibraryclasses</a></li>
-<li>-<a href="usage.html#dontskipnonpubliclibraryclasses">dontskipnonpubliclibraryclasses</a></li>
-<li>-<a href="usage.html#dontskipnonpubliclibraryclassmembers">dontskipnonpubliclibraryclassmembers</a></li>
-<li>-<a href="usage.html#keepdirectories">keepdirectories</a></li>
-<li>-<a href="usage.html#forceprocessing">forceprocessing</a></li>
-<li>-<a href="usage.html#printseeds">printseeds</a></li>
-<li>-<a href="usage.html#printconfiguration">printconfiguration</a></li>
-<li>-<a href="usage.html#dump">dump</a></li>
-<li>-<a href="usage.html#whyareyoukeeping">whyareyoukeeping</a></li>
+<li>-<a href="usage.html#dontpreverify">dontpreverify</a>
+<li>-<a href="usage.html#microedition">microedition</a>
+<li>-<a href="usage.html#target">target</a>
+<li>-<a href="usage.html#verbose">verbose</a>
+<li>-<a href="usage.html#dontnote">dontnote</a>
+<li>-<a href="usage.html#dontwarn">dontwarn</a>
+<li>-<a href="usage.html#ignorewarnings">ignorewarnings</a>
+<li>-<a href="usage.html#dontskipnonpubliclibraryclasses">dontskipnonpubliclibraryclasses</a>
+<li>-<a href="usage.html#dontskipnonpubliclibraryclassmembers">dontskipnonpubliclibraryclassmembers</a>
+<li>-<a href="usage.html#keepdirectories">keepdirectories</a>
+<li>-<a href="usage.html#forceprocessing">forceprocessing</a>
+<li>-<a href="usage.html#printseeds">printseeds</a>
+<li>-<a href="usage.html#printconfiguration">printconfiguration</a>
+<li>-<a href="usage.html#dump">dump</a>
+<li>-<a href="usage.html#whyareyoukeeping">whyareyoukeeping</a>
</ul>
<p>
-<h2><a name="process">The Process Tab</a></h2>
+<a name="process">&nbsp;</a>
+<h2>The Process Tab</h2>
The <i>Process</i> tab has an output console for displaying the configuration
and the messages while processing. There are three important buttons at the
@@ -439,7 +433,8 @@ bottom:
</table>
<p>
-<h2><a name="retrace">The ReTrace Tab</a></h2>
+<a name="retrace">&nbsp;</a>
+<h2>The ReTrace Tab</h2>
The <i>ReTrace</i> tab has a panel with a few settings, an input text area for
the obfuscated stack trace, and an output console to view the de-obfuscated
@@ -447,16 +442,16 @@ stack trace:
<ul>
<li>The <b>Verbose</b> check box in the settings panel allows to toggle between
- normal mode and verbose mode.</li>
+ normal mode and verbose mode.
<li>The <b>Mapping file</b> text field takes the name of the required mapping
file that ProGuard wrote while processing the original code. The file name
can be entered manually or by means of the <b>Browse...</b> button that
- opens a file chooser.</li>
+ opens a file chooser.
<li>The <b>Obfuscated stack trace</b> text area allows to enter the stack
trace, typically by copying and pasting it from elsewhere. Alternatively,
- it can be loaded from a file by means of the load button below.</li>
+ it can be loaded from a file by means of the load button below.
</ul>
There are two buttons at the bottom:
@@ -468,12 +463,12 @@ There are two buttons at the bottom:
<tr><td class="button">ReTrace!</td>
<td>executes ReTrace with the current settings.</td></tr>
</table>
+<p>
-<hr />
-<noscript><div><a target="_top" href="../index.html" class="button">Show menu</a></div></noscript>
+<hr>
<address>
-Copyright &copy; 2002-2011
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2009
+<a href="http://www.graphics.cornell.edu/~eric/">Eric Lafortune</a>.
</address>
</body>
</html>
diff --git a/docs/manual/index.html b/docs/manual/index.html
index 5b62d50..397b910 100644
--- a/docs/manual/index.html
+++ b/docs/manual/index.html
@@ -1,51 +1,39 @@
-<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!doctype html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<meta http-equiv="content-style-type" content="text/css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>ProGuard Manual</title>
-<script type="text/javascript" language="JavaScript">
-<!--
-if (window.self==window.top)
- window.top.location.replace("../index.html#"+window.location.pathname+window.location.hash);
-else {
- var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
- if (window.top.location.hash!=hash)
- window.top.location.hash=hash;
-}
-//-->
-</script>
</head>
<body>
<h2>ProGuard</h2>
<ol>
-<li><a href="introduction.html">Introduction</a></li>
-<li><a href="usage.html">Usage</a></li>
-<li><a href="limitations.html">Limitations</a></li>
-<li><a href="examples.html">Examples</a></li>
-<li><a href="troubleshooting.html">Troubleshooting</a></li>
-<li><a href="refcard.html">Reference Card</a></li>
-<li><a href="gui.html">Graphical User Interface</a></li>
-<li><a href="ant.html">Ant Task</a></li>
-<li><a href="wtk.html">JME Wireless Toolkit Integration</a></li>
+<li><a href="introduction.html">Introduction</a>
+<li><a href="usage.html">Usage</a>
+<li><a href="limitations.html">Limitations</a>
+<li><a href="examples.html">Examples</a>
+<li><a href="troubleshooting.html">Troubleshooting</a>
+<li><a href="refcard.html">Reference Card</a>
+<li><a href="gui.html">Graphical User Interface</a>
+<li><a href="ant.html">Ant Task</a>
+<li><a href="wtk.html">JME Wireless Toolkit Integration</a>
</ol>
<h2>ReTrace</h2>
<ol>
-<li><a href="retrace/introduction.html">Introduction</a></li>
-<li><a href="retrace/usage.html">Usage</a></li>
-<li><a href="retrace/examples.html">Examples</a></li>
+<li><a href="retrace/introduction.html">Introduction</a>
+<li><a href="retrace/usage.html">Usage</a>
+<li><a href="retrace/examples.html">Examples</a>
</ol>
-<hr />
-<noscript><div><a target="_top" href="../index.html" class="button">Show menu</a></div></noscript>
+<hr>
<address>
-Copyright &copy; 2002-2011
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2009
+<a href="http://www.graphics.cornell.edu/~eric/">Eric Lafortune</a>.
</address>
</body>
</html>
diff --git a/docs/manual/introduction.html b/docs/manual/introduction.html
index bc71f4a..cdab330 100644
--- a/docs/manual/introduction.html
+++ b/docs/manual/introduction.html
@@ -1,21 +1,10 @@
-<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!doctype html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<meta http-equiv="content-style-type" content="text/css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>ProGuard Introduction</title>
-<script type="text/javascript" language="JavaScript">
-<!--
-if (window.self==window.top)
- window.top.location.replace("../index.html#"+window.location.pathname+window.location.hash);
-else {
- var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
- if (window.top.location.hash!=hash)
- window.top.location.hash=hash;
-}
-//-->
-</script>
</head>
<body>
@@ -87,9 +76,7 @@ libraries that you would need for compiling the code. ProGuard uses them to
reconstruct the class dependencies that are necessary for proper processing.
The library jars themselves always remain unchanged. You should still put them
in the class path of your final application.
-
-<h3>Entry points</h3>
-
+<p>
In order to determine which code has to be preserved and which code can be
discarded or obfuscated, you have to specify one or more <i>entry points</i> to
your code. These entry points are typically classes with main methods, applets,
@@ -97,59 +84,55 @@ midlets, etc.
<ul>
<li>In the <b>shrinking step</b>, ProGuard starts from these seeds and
recursively determines which classes and class members are used. All other
- classes and class members are discarded.</li>
+ classes and class members are discarded.
<li>In the <b>optimization step</b>, ProGuard further optimizes the code.
Among other optimizations, classes and methods that are not entry points
can be made private, static, or final, unused parameters can be removed,
- and some methods may be inlined.</li>
+ and some methods may be inlined.
<li>In the <b>obfuscation step</b>, ProGuard renames classes and class members
that are not entry points. In this entire process, keeping the entry
- points ensures that they can still be accessed by their original names.</li>
+ points ensures that they can still be accessed by their original names.
<li>The <b>preverification step</b> is the only step that doesn't have to know
- the entry points.</li>
+ the entry points.
</ul>
<p>
The <a href="usage.html">Usage section</a> of this manual describes the
necessary <a href="usage.html#keepoptions"><code>-keep</code> options</a> and
the <a href="examples.html">Examples section</a> provides plenty of examples.
-<h3>Reflection</h3>
-
-Reflection and introspection present particular problems for any automatic
-processing of code. In ProGuard, classes or class members in your code that
-are created or invoked dynamically (that is, by name) have to be specified as
-entry points too. For example, <code>Class.forName()</code> constructs may
-refer to any class at run-time. It is generally impossible to foresee which
-classes have to be preserved (with their original names), since the class
-names might be read from a configuration file, for instance. You therefore
-have to specify them in your ProGuard configuration, with the same
-simple <code>-keep</code> options.
+<h3>Introspection</h3>
+
+Introspection presents particular problems for any automatic processing of
+code. In ProGuard, classes or class members in your code that are created or
+invoked dynamically (that is, by name) have to be specified as entry points
+too. For example, <code>Class.forName()</code> constructs may refer to any
+class at run-time. It is generally impossible to foresee which classes have to
+be preserved (with their original names), since the class names might be read
+from a configuration file, for instance. You therefore have to specify them in
+your ProGuard configuration, with the same simple <code>-keep</code> options.
<p>
However, ProGuard will already detect and handle the following cases for you:
<ul>
-<li><code>Class.forName("SomeClass")</code></li>
-<li><code>SomeClass.class</code></li>
-<li><code>SomeClass.class.getField("someField")</code></li>
-<li><code>SomeClass.class.getDeclaredField("someField")</code></li>
-<li><code>SomeClass.class.getMethod("someMethod", new Class[] {})</code></li>
-<li><code>SomeClass.class.getMethod("someMethod", new Class[] { A.class })</code></li>
-<li><code>SomeClass.class.getMethod("someMethod", new Class[] { A.class, B.class })</code></li>
-<li><code>SomeClass.class.getDeclaredMethod("someMethod", new Class[] {})</code></li>
-<li><code>SomeClass.class.getDeclaredMethod("someMethod", new Class[] { A.class })</code></li>
-<li><code>SomeClass.class.getDeclaredMethod("someMethod", new Class[] { A.class, B.class })</code></li>
-<li><code>AtomicIntegerFieldUpdater.newUpdater(SomeClass.class, "someField")</code></li>
-<li><code>AtomicLongFieldUpdater.newUpdater(SomeClass.class, "someField")</code></li>
-<li><code>AtomicReferenceFieldUpdater.newUpdater(SomeClass.class, SomeType.class, "someField")</code></li>
+<li><code>Class.forName("SomeClass")</code>
+<li><code>SomeClass.class</code>
+<li><code>SomeClass.class.getField("someField")</code>
+<li><code>SomeClass.class.getDeclaredField("someField")</code>
+<li><code>SomeClass.class.getMethod("someMethod", new Class[] {})</code>
+<li><code>SomeClass.class.getMethod("someMethod", new Class[] { A.class })</code>
+<li><code>SomeClass.class.getMethod("someMethod", new Class[] { A.class, B.class })</code>
+<li><code>SomeClass.class.getDeclaredMethod("someMethod", new Class[] {})</code>
+<li><code>SomeClass.class.getDeclaredMethod("someMethod", new Class[] { A.class })</code>
+<li><code>SomeClass.class.getDeclaredMethod("someMethod", new Class[] { A.class, B.class })</code>
</ul>
The names of the classes and class members may of course be different, but the
constructs should be literally the same for ProGuard to recognize them. The
referenced classes and class members are preserved in the shrinking phase, and
-the string arguments are properly updated in the obfuscation phase.
+the string arguments are properly replaced in the obfuscation phase.
<p>
Furthermore, ProGuard will offer some suggestions if keeping some classes or
class members appears necessary. For example, ProGuard will note constructs
@@ -159,15 +142,15 @@ and/or its implementations may need to be preserved. You can then adapt your
configuration accordingly.
<p>
For proper results, you should at least be somewhat familiar with the code
-that you are processing. Obfuscating code that performs a lot of reflection
+that you are processing. Obfuscating code that performs a lot of introspection
may require trial and error, especially without the necessary information
about the internals of the code.
+<p>
-<hr />
-<noscript><div><a target="_top" href="../index.html" class="button">Show menu</a></div></noscript>
+<hr>
<address>
-Copyright &copy; 2002-2011
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2009
+<a href="http://www.graphics.cornell.edu/~eric/">Eric Lafortune</a>.
</address>
</body>
</html>
diff --git a/docs/manual/limitations.html b/docs/manual/limitations.html
index 3b28a30..cfe0ff5 100644
--- a/docs/manual/limitations.html
+++ b/docs/manual/limitations.html
@@ -1,21 +1,10 @@
-<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!doctype html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<meta http-equiv="content-style-type" content="text/css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>ProGuard Limitations</title>
-<script type="text/javascript" language="JavaScript">
-<!--
-if (window.self==window.top)
- window.top.location.replace("../index.html#"+window.location.pathname+window.location.hash);
-else {
- var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
- if (window.top.location.hash!=hash)
- window.top.location.hash=hash;
-}
-//-->
-</script>
</head>
<body>
@@ -24,7 +13,16 @@ else {
When using ProGuard, you should be aware of a few technical issues, all of
which are easily avoided or resolved:
<p>
-<ul class="spacious">
+<ul>
+
+<li>For efficiency, ProGuard always ignores any <b>private or package visible
+ library classes</b> while reading library jars. If any of them are
+ extended by public library classes, and then extended again by input
+ classes, ProGuard will complain it can't find them. In that case, you'll
+ have to use the <code>-dontskipnonpubliclibraryclasses</code> option, and
+ maybe even the <code>-dontskipnonpubliclibraryclassmembers</code> option.
+ The graphical user interface has checkboxes for these settings.
+ <p>
<li>For best results, ProGuard's optimization algorithms assume that the
processed code never <b>intentionally throws NullPointerExceptions</b> or
@@ -35,35 +33,32 @@ which are easily avoided or resolved:
<code>myObject</code> might be null, causing a NullPointerException. In
some way this is a good thing: optimized code may throw fewer exceptions.
Should this entire assumption be false, you'll have to switch off
- optimization using the <code>-dontoptimize</code> option.</li>
-
-<li>ProGuard's optimization algorithms currently also assume that the
- processed code never creates <b>busy-waiting loops</b> without at least
- testing on a volatile field. Again, it may remove such loops. Should this
- assumption be false, you'll have to switch off optimization using
- the <code>-dontoptimize</code> option.</li>
+ optimization using the <code>-dontoptimize</code> option.
+ <p>
<li>If an input jar and a library jar contain classes in the <b>same
package</b>, the obfuscated output jar may contain class names that
overlap with class names in the library jar. This is most likely if the
library jar has been obfuscated before, as it will then probably contain
classes named 'a', 'b', etc. Packages should therefore never be split
- across input jars and library jars.</li>
+ across input jars and library jars.
+ <p>
-<li>When obfuscating, ProGuard writes out class files named
- "<code>a.class</code>", "<code>b.class</code>", etc. If a package contains
- a large number of classes, ProGuard may also write out
- <b>"<code>aux.class</code>"</b>. Inconveniently, Windows refuses to create
- files with this reserved name (among a few other names). It's generally
- better to write the output to a jar, in order to avoid such problems.</li>
+<li>When obfuscating, ProGuard will write out class files named
+ "<code>a.class</code>", "<code>b.class</code>", etc. If there is a large
+ numbers of classes in the same package, it may also write out
+ <b>"<code>aux.class</code>"</b>. Windows doesn't allow creating files with
+ this reserved name (among a few other names), so it's generally better to
+ write the output to a jar, in order to avoid such problems.
+ <p>
</ul>
+<p>
-<hr />
-<noscript><div><a target="_top" href="../index.html" class="button">Show menu</a></div></noscript>
+<hr>
<address>
-Copyright &copy; 2002-2011
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2009
+<a href="http://www.graphics.cornell.edu/~eric/">Eric Lafortune</a>.
</address>
</body>
</html>
diff --git a/docs/manual/optimizations.html b/docs/manual/optimizations.html
index 4711f83..9c20571 100644
--- a/docs/manual/optimizations.html
+++ b/docs/manual/optimizations.html
@@ -1,21 +1,10 @@
-<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!doctype html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<meta http-equiv="content-style-type" content="text/css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>Optimizations</title>
-<script type="text/javascript" language="JavaScript">
-<!--
-if (window.self==window.top)
- window.top.location.replace("../index.html#"+window.location.pathname+window.location.hash);
-else {
- var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
- if (window.top.location.hash!=hash)
- window.top.location.hash=hash;
-}
-//-->
-</script>
</head>
<body>
@@ -135,9 +124,6 @@ are added and reorganized.
<code><b>code/simplification/branch</b></code></dt>
<dd>Performs peephole optimizations for branch instructions.</dd>
-<dt><code><b>code/simplification/string</b></code></dt>
-<dd>Performs peephole optimizations for constant strings.</dd>
-
<dt><div>(<i>best used with</i> <code>code/removal/advanced</code>)</div>
<code><b>code/simplification/advanced</b></code></dt>
<dd>Simplifies code based on control flow analysis and data flow
@@ -156,17 +142,17 @@ are added and reorganized.
<dd>Removes unused variables from the local variable frame.</dd>
<dt><code><b>code/removal/exception</b></code></dt>
-<dd>Removes exceptions with empty try blocks.</dd>
+<dd>Removes exceptions with empty catch blocks.</dd>
<dt><code><b>code/allocation/variable</b></code></dt>
<dd>Optimizes variable allocation on the local variable frame.</dd>
</dl>
+<p>
-<hr />
-<noscript><div><a target="_top" href="../index.html" class="button">Show menu</a></div></noscript>
+<hr>
<address>
-Copyright &copy; 2002-2011
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2009
+<a href="http://www.graphics.cornell.edu/~eric/">Eric Lafortune</a>.
</address>
</body>
</html>
diff --git a/docs/manual/refcard.html b/docs/manual/refcard.html
index 02a8e50..236f049 100644
--- a/docs/manual/refcard.html
+++ b/docs/manual/refcard.html
@@ -1,21 +1,10 @@
-<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!doctype html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<meta http-equiv="content-style-type" content="text/css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>ProGuard Reference Card</title>
-<script type="text/javascript" language="JavaScript">
-<!--
-if (window.self==window.top)
- window.top.location.replace("../index.html#"+window.location.pathname+window.location.hash);
-else {
- var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
- if (window.top.location.hash!=hash)
- window.top.location.hash=hash;
-}
-//-->
-</script>
</head>
<body>
@@ -74,13 +63,8 @@ else {
</tr>
<tr>
-<td valign="top"><a href="usage.html#skipnonpubliclibraryclasses"><code><b>-skipnonpubliclibraryclasses</b></code></a></td>
-<td>Ignore non-public library classes.</td>
-</tr>
-
-<tr>
<td valign="top"><a href="usage.html#dontskipnonpubliclibraryclasses"><code><b>-dontskipnonpubliclibraryclasses</b></code></a></td>
-<td>Don't ignore non-public library classes (the default).</td>
+<td>Don't ignore non-public library classes.</td>
</tr>
<tr>
@@ -297,11 +281,6 @@ else {
</tr>
<tr>
-<td valign="top"><a href="usage.html#keepparameternames"><code><b>-keepparameternames</b></code></a></td>
-<td>Keep the parameter names and types of methods that are kept.</td>
-</tr>
-
-<tr>
<td valign="top"><a href="usage.html#renamesourcefileattribute"><code><b>-renamesourcefileattribute</b></code></a>
[<i>string</i>]</td>
<td>Put the given constant string in the <code>SourceFile</code>
@@ -383,11 +362,11 @@ Notes:
<ul>
<li><i>class_path</i> is a list of jars, wars, ears, zips, and directories,
- with optional filters, separated by path separators.</li>
+ with optional filters, separated by path separators.
<li><i>filename</i> can contain Java system properties delimited by
- '<b>&lt;</b>' and '<b>&gt;</b>'.</li>
+ '<b>&lt;</b>' and '<b>&gt;</b>'.
<li>If <i>filename</i> contains special characters, the entire name
- should be quoted with single or double quotes.</li>
+ should be quoted with single or double quotes.
</ul>
<p>
@@ -464,23 +443,23 @@ Notes:
Notes:
<ul>
<li>Class names must always be fully qualified, i.e. including their package
- names.</li>
+ names.
<li>Types in <i>classname</i>, <i>annotationtype</i>, <i>returntype</i>, and
<i>argumenttype</i> can contain wildcards: '<code><b>?</b></code>' for a
single character, '<code><b>*</b></code>' for any number of characters
(but not the package separator), '<code><b>**</b></code>' for any number
of (any) characters, '<code><b>%</b></code>' for any primitive type,
- '<code><b>***</b></code>' for any type, and '<code><b>...</b></code>' for any number of arguments.</li>
+ '<code><b>***</b></code>' for any type, and '<code><b>...</b></code>' for any number of arguments..
<li><i>fieldname</i> and <i>methodname</i> can contain wildcards as well:
'<code><b>?</b></code>' for a single character and '<code><b>*</b></code>'
- for any number of characters.</li>
+ for any number of characters.
</ul>
+<p>
-<hr />
-<noscript><div><a target="_top" href="../index.html" class="button">Show menu</a></div></noscript>
+<hr>
<address>
-Copyright &copy; 2002-2011
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2009
+<a href="http://www.graphics.cornell.edu/~eric/">Eric Lafortune</a>.
</address>
</body>
</html>
diff --git a/docs/manual/retrace/examples.html b/docs/manual/retrace/examples.html
index c372491..211017b 100644
--- a/docs/manual/retrace/examples.html
+++ b/docs/manual/retrace/examples.html
@@ -1,21 +1,10 @@
-<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!doctype html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<meta http-equiv="content-style-type" content="text/css">
<link rel="stylesheet" type="text/css" href="../style.css">
<title>ReTrace Examples</title>
-<script type="text/javascript" language="JavaScript">
-<!--
-if (window.self==window.top)
- window.top.location.replace("../../index.html#"+window.location.pathname+window.location.hash);
-else {
- var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
- if (window.top.location.hash!=hash)
- window.top.location.hash=hash;
-}
-//-->
-</script>
</head>
<body>
@@ -23,13 +12,13 @@ else {
Some typical example uses:
<ol>
-<li><a href="#with">Restoring a stack trace with line numbers</a></li>
-<li><a href="#withverbose">Restoring a stack trace with line numbers
- (verbose)</a></li>
-<li><a href="#without">Restoring a stack trace without line numbers</a></li>
+<li><a href="#with">Restoring a stack trace with line numbers</a>
+<li><a href="#withverbose">Restoring a stack trace with line numbers (verbose)</a>
+<li><a href="#without">Restoring a stack trace without line numbers</a>
</ol>
-<h3><a name="with">Restoring a stack trace with line numbers</a></h3>
+<a name="with">&nbsp;</a>
+<h3>Restoring a stack trace with line numbers</h3>
Assume for instance ProGuard itself has been obfuscated using the following
extra options:
@@ -144,7 +133,8 @@ Exception in thread "main" java.lang.Error: Random exception
at proguard.ProGuard.main(ProGuard:429)
</pre>
-<h3><a name="withverbose">Restoring a stack trace with line numbers (verbose)</a></h3>
+<a name="withverbose">&nbsp;</a>
+<h3>Restoring a stack trace with line numbers (verbose)</h3>
In the previous example, we could also use the verbose flag:
<pre>
@@ -199,7 +189,8 @@ Exception in thread "main" java.lang.Error: Random exception
</pre>
-<h3><a name="without">Restoring a stack trace without line numbers</a></h3>
+<a name="without">&nbsp;</a>
+<h3>Restoring a stack trace without line numbers</h3>
Assume for instance ProGuard itself has been obfuscated using the following
extra options, this time without preserving the line number tables:
@@ -333,12 +324,12 @@ Exception in thread "main" java.lang.Error: Random exception
execute
at proguard.ProGuard.main(Unknown Source)
</pre>
+<p>
-<hr />
-<noscript><div><a target="_top" href="../../index.html" class="button">Show menu</a></div></noscript>
+<hr>
<address>
-Copyright &copy; 2002-2011
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2009
+<a href="http://www.graphics.cornell.edu/~eric/">Eric Lafortune</a>.
</address>
</body>
</html>
diff --git a/docs/manual/retrace/index.html b/docs/manual/retrace/index.html
index 7c45c28..ebb23ac 100644
--- a/docs/manual/retrace/index.html
+++ b/docs/manual/retrace/index.html
@@ -1,37 +1,25 @@
-<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!doctype html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<meta http-equiv="content-style-type" content="text/css">
<link rel="stylesheet" type="text/css" href="../style.css">
<title>ReTrace Manual</title>
-<script type="text/javascript" language="JavaScript">
-<!--
-if (window.self==window.top)
- window.top.location.replace("../../index.html#"+window.location.pathname+window.location.hash);
-else {
- var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
- if (window.top.location.hash!=hash)
- window.top.location.hash=hash;
-}
-//-->
-</script>
</head>
<body>
<h2>ReTrace</h2>
<ol>
-<li><a href="introduction.html">Introduction</a></li>
-<li><a href="usage.html">Usage</a></li>
-<li><a href="examples.html">Examples</a></li>
+<li><a href="introduction.html">Introduction</a>
+<li><a href="usage.html">Usage</a>
+<li><a href="examples.html">Examples</a>
</ol>
-<hr />
-<noscript><div><a target="_top" href="../../index.html" class="button">Show menu</a></div></noscript>
+<hr>
<address>
-Copyright &copy; 2002-2011
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2009
+<a href="http://www.graphics.cornell.edu/~eric/">Eric Lafortune</a>.
</address>
</body>
</html>
diff --git a/docs/manual/retrace/introduction.html b/docs/manual/retrace/introduction.html
index f6b6a07..19f9471 100644
--- a/docs/manual/retrace/introduction.html
+++ b/docs/manual/retrace/introduction.html
@@ -1,21 +1,10 @@
-<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!doctype html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<meta http-equiv="content-style-type" content="text/css">
<link rel="stylesheet" type="text/css" href="../style.css">
<title>ReTrace Introduction</title>
-<script type="text/javascript" language="JavaScript">
-<!--
-if (window.self==window.top)
- window.top.location.replace("../../index.html#"+window.location.pathname+window.location.hash);
-else {
- var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
- if (window.top.location.hash!=hash)
- window.top.location.hash=hash;
-}
-//-->
-</script>
</head>
<body>
@@ -67,12 +56,12 @@ ReTrace can read an obfuscated stack trace and restore it to what it would
look like without obfuscation. The restoration is based on the mapping file
that ProGuard can write out during obfuscation. The mapping file links the
original class names and class member names to their obfuscated names.
+<p>
-<hr />
-<noscript><div><a target="_top" href="../../index.html" class="button">Show menu</a></div></noscript>
+<hr>
<address>
-Copyright &copy; 2002-2011
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2009
+<a href="http://www.graphics.cornell.edu/~eric/">Eric Lafortune</a>.
</address>
</body>
</html>
diff --git a/docs/manual/retrace/usage.html b/docs/manual/retrace/usage.html
index a227635..88587ff 100644
--- a/docs/manual/retrace/usage.html
+++ b/docs/manual/retrace/usage.html
@@ -1,21 +1,10 @@
-<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!doctype html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<meta http-equiv="content-style-type" content="text/css">
<link rel="stylesheet" type="text/css" href="../style.css">
<title>ReTrace Usage</title>
-<script type="text/javascript" language="JavaScript">
-<!--
-if (window.self==window.top)
- window.top.location.replace("../../index.html#"+window.location.pathname+window.location.hash);
-else {
- var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
- if (window.top.location.hash!=hash)
- window.top.location.hash=hash;
-}
-//-->
-</script>
</head>
<body>
@@ -98,13 +87,14 @@ the obfuscated class files:
<ul>
<li>If all line numbers have been preserved while obfuscating the application,
- ReTrace will be able to restore the stack trace completely.</li>
+ ReTrace will be able to restore the stack trace completely.
+ <p>
<li>If the line numbers have been removed, mapping obfuscated method names
back to their original names has become ambiguous. Retrace will list all
possible original method names for each line in the stack trace. The user
can then try to deduce the actual stack trace manually, based on the logic
- of the program.</li>
+ of the program.
</ul>
<p>
@@ -115,12 +105,12 @@ href="../examples.html#stacktrace">example</a> in the ProGuard User Manual.
Unobfuscated elements and obfuscated elements for which no mapping is available
will be left unchanged.
+<p>
-<hr />
-<noscript><div><a target="_top" href="../../index.html" class="button">Show menu</a></div></noscript>
+<hr>
<address>
-Copyright &copy; 2002-2011
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2009
+<a href="http://www.graphics.cornell.edu/~eric/">Eric Lafortune</a>.
</address>
</body>
</html>
diff --git a/docs/manual/sections.html b/docs/manual/sections.html
index fb72573..62df9c3 100644
--- a/docs/manual/sections.html
+++ b/docs/manual/sections.html
@@ -1,4 +1,4 @@
-<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!doctype html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
@@ -42,18 +42,22 @@ document.write("<img src=\"");
document.write(document.location.hostname == "proguard.sourceforge.net" ?
"http://sourceforge.net/sflogo.php?group_id=54750&amp;type=1" :
"../sflogo.png");
-document.write("\" width=\"88\" height=\"31\" alt=\"SourceForge\" />");
+document.write("\" width=\"88\" height=\"31\" alt=\"SourceForge\">");
//-->
</script>
<noscript>
-<img src="../sflogo.png" width="88" height="31" alt="SourceForge" />
+<img src="../sflogo.png" width="88" height="31" alt="SourceForge">
</noscript>
</a>
<p>
-<a href="http://www.saikoa.com/" target="_top">
-<img src="../saikoalogo.png" width="88" height="19" alt="Saikoa" /></a>
+<a href="http://www.luciad.com/" target="other">
+<img src="../luciadlogo.png" width="88" height="24" alt="Luciad"></a>
+
+<p>
+<a href="http://www.javadocking.com/" target="other">
+<img src="../sanawarelogo.png" width="88" height="24" alt="Luciad"></a>
</center>
</body>
diff --git a/docs/manual/style.css b/docs/manual/style.css
index 9a876aa..28fc112 100644
--- a/docs/manual/style.css
+++ b/docs/manual/style.css
@@ -34,24 +34,11 @@ pre {
background: #E0E0E0;
}
-ul.spacious li
-{
- padding: 8px;
-}
-
a
{
text-decoration: none;
}
-a.button {
- color: #000000;
- text-decoration: none;
- background: #E0E0E0;
- border: 1px outset #FFFFFF;
- float: right;
-}
-
/* Settings for variable width code. */
p.code {
@@ -76,7 +63,7 @@ td.transparentblock {
td.whiteblock {
width: 100px;
text-align: center;
- border: 1px solid #C0C0C0;
+ border: solid #C0C0C0 1px;
background: #E0E0E0;
padding: 10px 0px;
}
@@ -84,7 +71,7 @@ td.whiteblock {
td.lightblock {
width: 100px;
text-align: center;
- border: 1px solid #8888FF;
+ border: solid #8888FF 1px;
background: #BBBBFF;
padding: 20px 0px;
}
@@ -100,6 +87,6 @@ td.darkblock {
td.button {
background: #E0E0E0;
- border: 1px outset #FFFFFF;
+ border: outset #FFFFFF 1px;
font-weight: bold;
}
diff --git a/docs/manual/troubleshooting.html b/docs/manual/troubleshooting.html
index 6b0c1a9..d3ed14e 100644
--- a/docs/manual/troubleshooting.html
+++ b/docs/manual/troubleshooting.html
@@ -1,21 +1,10 @@
-<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!doctype html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<meta http-equiv="content-style-type" content="text/css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>ProGuard Troubleshooting</title>
-<script type="text/javascript" language="JavaScript">
-<!--
-if (window.self==window.top)
- window.top.location.replace("../index.html#"+window.location.pathname+window.location.hash);
-else {
- var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
- if (window.top.location.hash!=hash)
- window.top.location.hash=hash;
-}
-//-->
-</script>
</head>
<body>
@@ -30,24 +19,19 @@ few problems. The following sections discuss some common issues and solutions:
<li><a href="#dynamicalclasscast">Note: ... calls '(...)Class.forName(variable).newInstance()'</a></li>
<li><a href="#dynamicalclassmember">Note: ... accesses a field/method '...' dynamically</a></li>
<li><a href="#descriptorclass">Note: the configuration keeps the entry point '...', but not the descriptor class '...'</a></li>
-<li><a href="#classmembers">Note: the configuration doesn't specify which class members to keep for class '...'</a></li>
<li><a href="#duplicateclass">Note: duplicate definition of program/library class</a></li>
<li><a href="#duplicatezipentry">Warning: can't write resource ... Duplicate zip entry</a></li>
<li><a href="#unresolvedclass">Warning: can't find superclass or interface</a></li>
<li><a href="#unresolvedclass">Warning: can't find referenced class</a></li>
-<li><a href="#superclass">Error: Can't find any super classes of ... (not even immediate super class ...)</a></li>
-<li><a href="#superclass">Error: Can't find common super class of ... and ...</a></li>
<li><a href="#unresolvedclassmember">Warning: can't find referenced field/method</a></li>
<li><a href="#unresolvedenclosingmethod">Warning: can't find enclosing class/method</a></li>
<li><a href="#dependency">Warning: library class ... depends on program class ...</a></li>
<li><a href="#unexpectedclass">Warning: class file ... unexpectedly contains class ...</a></li>
<li><a href="#mappingconflict1">Warning: ... is not being kept as ..., but remapped to ...</a></li>
<li><a href="#mappingconflict2">Warning: field/method ... can't be mapped to ...</a></li>
-<li><a href="#unsupportedclassversion">Error: Unsupported class version number</a></li>
<li><a href="#keep">Error: You have to specify '-keep' options</a></li>
<li><a href="#filename">Error: Expecting class path separator ';' before 'Files\Java\...' (in Windows)</a></li>
<li><a href="#macosx">Error: Can't read [.../lib/rt.jar] (No such file or directory) (in MacOS X)</a></li>
-<li><a href="#startinggui">Internal problem starting the ProGuard GUI (Cannot write XdndAware property) (in Linux)</a></li>
<li><a href="#outofmemoryerror">OutOfMemoryError</a></li>
<li><a href="#stackoverflowerror">StackOverflowError</a></li>
<li><a href="#unexpectederror">Unexpected error</a></li>
@@ -61,13 +45,6 @@ few problems. The following sections discuss some common issues and solutions:
<li><a href="#notobfuscated">Variable names not being obfuscated</a></li>
</ul>
-<h3><a href="#dalvik">Problems while converting to Android Dalvik bytecode</a></h3>
-
-<ul>
-<li><a href="#simexception">SimException: local variable type mismatch</a></li>
-<li><a href="#conversionerror">Conversion to Dalvik format failed with error 1</a></li>
-</ul>
-
<h3><a href="#preverifying">Problems while preverifying for Java Micro Edition</a></h3>
<ul>
@@ -81,9 +58,7 @@ few problems. The following sections discuss some common issues and solutions:
<li><a href="#classnotfoundexception">ClassNotFoundException</a></li>
<li><a href="#nosuchmethodexception">NoSuchMethodException</a></li>
<li><a href="#missingresourceexception">MissingResourceException or NullPointerException</a></li>
-<li><a href="#disappearingannotations">Disappearing annotations</a></li>
<li><a href="#invalidjarfile">Invalid or corrupt jarfile</a></li>
-<li><a href="#invalidjarindexexception">InvalidJarIndexException: Invalid index</a></li>
<li><a href="#invalidclassexception2">InvalidClassException, class loading error, or verification error (in Java Micro Edition)</a></li>
<li><a href="#nosuchfieldormethod">Error: No Such Field or Method, Error verifying method (in a Java Micro Edition emulator)</a></li>
<li><a href="#failingmidlets">Failing midlets (on a Java Micro Edition device)</a></li>
@@ -92,14 +67,14 @@ few problems. The following sections discuss some common issues and solutions:
<li><a href="#classcastexception">ClassCastException: class not an enum</a></li><li><a href="#classcastexception">IllegalArgumentException: class not an enum type</a></li>
<li><a href="#arraystoreexception">ArrayStoreException: sun.reflect.annotation.EnumConstantNotPresentExceptionProxy</a></li>
<li><a href="#compilererror">CompilerError: duplicate addition</a></li>
-<li><a href="#classformaterror1">ClassFormatError: repetitive field name/signature</a></li>
-<li><a href="#classformaterror2">ClassFormatError: Invalid index in LocalVariableTable in class file</a></li>
+<li><a href="#classformaterror">ClassFormatError: repetitive field name/signature</a></li>
<li><a href="#nosuchmethoderror">NoSuchMethodError or AbstractMethodError</a></li>
<li><a href="#verifyerror">VerifyError</a></li>
</ul>
-<h2><a name="processing">Problems while processing</a></h2>
+<a name="processing">&nbsp;</a>
+<h2>Problems while processing</h2>
ProGuard may print out some notes and non-fatal warnings:
@@ -143,17 +118,6 @@ ProGuard may print out some notes and non-fatal warnings:
API. You can switch off these notes by specifying the <a
href="usage.html#dontnote"><code>-dontnote</code></a> option.</dd>
-<dt><a name="classmembers"><b>Note: the configuration doesn't specify which class members to keep for class '...'</b></a></dt>
-
-<dd>Your configuration contains
- a <code>-keepclassmembers/-keepclasseswithmembers</code> option to
- preserve fields or methods in the given class, but it doesn't specify
- which fields or methods. This way, the option simply won't have any
- effect. You probably want to specify one or more fields or methods, as
- usual between curly braces. You can specify all fields or methods with a
- wildcard "<code>*;</code>". You can switch off these notes by specifying
- the <a href="usage.html#dontnote"><code>-dontnote</code></a> option.</dd>
-
<dt><a name="duplicateclass"><b>Note: duplicate definition of program/library class</b></a></dt>
<dd>Your program jars or library jars contain multiple definitions of the
@@ -188,43 +152,22 @@ some more serious warnings:
the Java run-time library. For specifying libraries, use
the <a href="usage.html#libraryjars"><code>-libraryjars</code></a> option.
<p>
- For example, if ProGuard complains that it can't find a
- <code>javax.crypto</code> class, you probably still have to specify
- <code>jce.jar</code>, next to the more common <code>rt.jar</code>.
+ If the class that is reported as missing is a non-public library class,
+ you should specify the <a
+ href="usage.html#dontskipnonpubliclibraryclasses"><code>-dontskipnonpubliclibraryclasses</code></a>
+ option. Common examples are the classes
+ <code>javax.swing.TransferHandler$HasGetTransferHandler</code> and
+ <code>java.util.zip.ZipConstants</code>, which are used as interfaces in
+ some public classes, even though they are only package visible. This
+ option is not set by default for reasons of efficiency. Setting it increases
+ the processing time a bit, but it won't hurt the output in any way.
<p>
If you're missing a library and you're absolutely sure it isn't used
anyway, you can try your luck with the <a
href="usage.html#ignorewarnings"><code>-ignorewarnings</code></a> option,
or even the <a href="usage.html#dontwarn"><code>-dontwarn</code></a>
option. Only use these options if you really know what you're doing
- though.
- <p>
- For example, if you're developing for Android, and ProGuard complains that
- it can't find a <code>java.awt</code> class, then some library that you
- are using is referring to <code>java.awt</code>. This is a bit shady, since
- Android doesn't have this package at all, but if your application works
- anyway, you can let ProGuard accept it with "<code>-dontwarn
- java.awt.**</code>".</dd>
-
-<dt><a name="superclass"><b>Error: Can't find any super classes of ... (not even immediate super class ...)</b><br/><b>Error: Can't find common super class of ... and ...</b></a></dt>
-
-<dd>It seems like you tried to avoid the warnings from the previous paragraph
- by specifying
- <a href="usage.html#ignorewarnings"><code>-ignorewarnings</code></a>
- or <a href="usage.html#dontwarn"><code>-dontwarn</code></a>, but it didn't
- work out. ProGuard's optimization step and preverification step really
- need the missing classes to make sense of the code. Preferably, you would
- solve the problem by adding the missing library, as discussed. If you're
- sure the class that references the missing class isn't used either, you
- could also try filtering it out from the input, by adding a filter to the
- corresponding <a href="usage.html#injars"><code>-injars</code></a> option:
- "<code>-injars
- myapplication.jar(!somepackage/SomeUnusedClass.class)</code>". Hopefully,
- you can access the configuration of your build process for such a
- modification. As a final solution, you could switch off optimization
- (<a href="usage.html#dontoptimize"><code>-dontoptimize</code></a>) and
- preverification
- (<a href="usage.html#dontpreverify"><code>-dontpreverify</code></a>).</dd>
+ though.</dd>
<dt><a name="unresolvedclassmember"><b>Warning: can't find referenced field/method</b></a></dt>
@@ -234,10 +177,19 @@ some more serious warnings:
source file was removed. Try removing all class files, recompiling them,
zipping them up, and running ProGuard again.
<p>
+ If the class member that is reported as missing is actually implemented in
+ a non-public library class, you should specify the
+ <a href="usage.html#dontskipnonpubliclibraryclasses"><code>-dontskipnonpubliclibraryclasses</code></a> option. A common example is
+ the method <code>setLength(int)</code> in the public class
+ <code>java.lang.StringBuilder</code>. This method is actually defined in
+ the package visible superclass
+ <code>java.lang.AbstractStringBuilder</code>, which ProGuard ignores by
+ default.
+ <p>
If your program classes reside in the same packages as library classes,
- and refer to their package visible class members, then you should also
- specify the
- <a href="usage.html#dontskipnonpubliclibraryclassmembers"><code>-dontskipnonpubliclibraryclassmembers</code></a>
+ and refer to their package visible class members, then you should specify
+ the <a
+ href="usage.html#dontskipnonpubliclibraryclassmembers"><code>-dontskipnonpubliclibraryclassmembers</code></a>
option.</dd>
<dt><a name="unresolvedenclosingmethod"><b>Warning: can't find enclosing class/method</b></a></dt>
@@ -258,11 +210,7 @@ some more serious warnings:
classes always remain unchanged. It is therefore impossible to adapt
references from library classes to program classes, for instance if the
program classes are renamed. You should define a clean separation between
- program code (specified with <a
- href="usage.html#injars"><code>-injars</code></a>) and library code
- (specified with <a
- href="usage.html#libraryjars"><code>-libraryjars</code></a>), and try
- again.</dd>
+ program code and library code, and try again.</dd>
<dt><a name="unexpectedclass"><b>Warning: class file ... unexpectedly contains class ...</b></a></dt>
@@ -309,13 +257,6 @@ some more serious warnings:
option in the initial obfuscation step, in order to reduce the risk of
conflicts.</dd>
-<dt><a name="unsupportedclassversion"><b>Error: Unsupported class version number</b></a></dt>
-
-<dd>You are trying to process class files compiled for a recent version of
- Java that your copy of ProGuard doesn't support yet. You should check if
- there is a more recent release
- <a href="http://proguard.sourceforge.net/downloads.html">on-line</a>.</dd>
-
<dt><a name="keep"><b>Error: You have to specify '-keep' options</b></a></dt>
<dd>You either forgot to specify <a
@@ -325,6 +266,7 @@ some more serious warnings:
these. Without the proper seed specifications, ProGuard would shrink,
optimize, or obfuscate all class files away.</dd>
+
<dt><a name="filename"><b>Error: Expecting class path separator ';' before 'Files\Java\</b>...<b>'</b> (in Windows)</a></dt>
<dd>If the path of your run-time jar contains spaces, like in "Program Files",
@@ -340,16 +282,6 @@ some more serious warnings:
the path <code>&lt;java.home&gt;/lib/rt.jar</code> by
<code>&lt;java.home&gt;/../Classes/classes.jar</code>.</dd>
-<dt><a name="startinggui"><b>Internal problem starting the ProGuard GUI (Cannot write XdndAware property)</b> (in Linux)</a></dt>
-
-<dd>In Linux, at least with Java 6, the GUI may not start properly, due to
- <a href="http://bugs.sun.com/view_bug.do?bug_id=7027598">Sun
- Bug #7027598</a>. The work-around at this time is to specify the JVM
- option <code>-DsuppressSwingDropSupport=true</code> when running the
- GUI.</dd>
-
-<dd>
-
</dl>
<p>
@@ -372,7 +304,7 @@ Should ProGuard crash while processing your application:
size of the Java virtual machine (with the usual <code>-Xss</code> option)
should help too. In practice however, the <code>-Xss</code> setting
doesn't have any effect on the main thread, due to <a
- href="http://bugs.sun.com/view_bug.do?bug_id=4362291">Sun Bug
+ href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4362291">Sun Bug
#4362291</a>. As a result, this solution will only work when running
ProGuard in a different thread, e.g. from its GUI.</dd>
@@ -394,7 +326,8 @@ Should ProGuard crash while processing your application:
</dl>
<p>
-<h2><a name="afterprocessing">Unexpected observations after processing</a></h2>
+<a name="afterprocessing">&nbsp;</a>
+<h2>Unexpected observations after processing</h2>
If ProGuard seems to run fine, but your processed code doesn't look right,
there might be a couple of reasons:
@@ -430,13 +363,7 @@ there might be a couple of reasons:
<p>
If you are using marker interfaces to keep other classes, the marker
interfaces themselves are probably being removed in the shrinking step.
- You should therefore always explicitly keep any marker interfaces, with
- an option like "<code>-keep interface MyMarkerInterface</code>".
- <p>
- Similarly, if you are keeping classes based on annotations, you may have to
- avoid that the annotation classes themselves are removed in the shrinking
- step. You can explicitly keep all annotation classes in your program code
- with an option like "<code>-keep @interface *</code>".<dd>
+ You should therefore always explicitly keep any marker interfaces.</dd>
<dt><a name="notobfuscated"><b>Variable names not being obfuscated</b></a></dt>
@@ -450,37 +377,8 @@ there might be a couple of reasons:
</dl>
-<h2><a name="dalvik">Problems while converting to Android Dalvik bytecode</a></h2>
-
-If ProGuard seems to run fine, but the dx tool in the Android SDK subsequently
-fails with an error:
-
-<dl>
-<dt><a name="simexception"><b>SimException: local variable type mismatch</b></a></dt>
-
-<dd>This error indicates that ProGuard's optimization step has not been able
- to maintain the correct debug information about local variables. This can
- happen if some code is optimized radically. Possible work-arounds: let the
- java compiler not produce debug information (<code>-g:none</code>), or let
- ProGuard's obfuscation step remove the debug information again
- (by <i>not</i> keeping the attributes <code>LocalVariableTable</code>
- and <code>LocalVariableTypeTable</code>
- with <a href="usage.html#keepattributes"><code>-keepattributes</code></a>),
- or otherwise just disable optimization
- (<a href="usage.html#dontoptimize"><code>-dontoptimize</code></a>).</dd>
-
-<dt><a name="conversionerror"><b>Conversion to Dalvik format failed with error 1</b></a></dt>
-
-<dd>This error may have various causes, but if dx is tripping over some code
- processed by ProGuard, you should make sure that you are using the latest
- version of ProGuard. You can just copy the ProGuard jars
- to <code>android-sdk/tools/proguard/lib</code>. If that doesn't help,
- please report the problem, preferably with the simplest example that still
- brings out the error.</dd>
-
-</dl>
-
-<h2><a name="preverifying">Problems while preverifying for Java Micro Edition</a></h2>
+<a name="preverifying">&nbsp;</a>
+<h2>Problems while preverifying for Java Micro Edition</h2>
If ProGuard seems to run fine, but the external preverifier subsequently
produces errors, it's usually for a single reason:
@@ -511,7 +409,8 @@ Note that it is no longer necessary to use an external preverifier. With the
ProGuard will preverify the class files for Java Micro Edition.
<p>
-<h2><a name="runtime">Problems at run-time</a></h2>
+<a name="runtime">&nbsp;</a>
+<h2>Problems at run-time</h2>
If ProGuard runs fine, but your processed application doesn't work, there
might be several reasons:
@@ -544,15 +443,10 @@ might be several reasons:
<dd>Your code is probably calling something like
<code>myClass.getMethod</code>, trying to find some method dynamically.
- Since ProGuard can't always detect this automatically, you have to keep
- the missing method in using the appropriate <a
+ Since ProGuard isn't detecting this (yet), you have to keep the missing
+ method in using the appropriate <a
href="usage.html#keep"><code>-keep</code></a> option, e.g. "<code>-keep
- class mypackage.MyClass { void myMethod(); }</code>".
- <p>
- More specifically, if the method reported as missing is
- <code>values</code> or <code>valueOf</code>, you probably have to keep
- some methods related to <a
- href="examples.html#enumerations">enumerations</a>.</dd>
+ class mypackage.MyClass { void myMethod(); }</code>".</dd>
<dt><a name="missingresourceexception"><b>MissingResourceException</b> or <b>NullPointerException</b></a></dt>
@@ -566,18 +460,7 @@ might be several reasons:
<p>
Furthermore, directory entries in jar files aren't copied, unless you
specify the option <a
- href="usage.html#keepdirectories"><code>-keepdirectories</code></a>.
- Note that Sun advises against calling <code>Class.getResource()</code> for
- directories (<a href="http://bugs.sun.com/view_bug.do?bug_id=4761949">Sun
- Bug #4761949</a>).</dd>
-
-<dt><a name="disappearingannotations"><b>Disappearing annotations</b></a></dt>
-
-<dd>By default, the obfuscation step removes all annotations. If your
- application relies on annotations to function properly, you should
- explicitly keep them with
- <code><a href="usage.html#keepattributes">-keepattributes</a>
- *Annotation*</code>.</dd>
+ href="usage.html#keepdirectories"><code>-keepdirectories</code></a>.</dd>
<dt><a name="invalidjarfile"><b>Invalid or corrupt jarfile</b></a></dt>
@@ -591,17 +474,6 @@ might be several reasons:
manifest file is the one that is copied (the first manifest file that is
encountered), and that the main class is kept in your configuration,</dd>
-<dt><a name="invalidjarindexexception"><b>InvalidJarIndexException: Invalid index</b></a></dt>
-
-<dd>At least one of your processed jar files contains an index file
- <code>META-INF/INDEX.LIST</code>, listing all class files in the jar.
- ProGuard by default copies files like these unchanged. ProGuard may however
- remove or rename classes, thus invalidating the file. You should filter the
- index file out of the input
- (<code>-injars in.jar(!META-INF/INDEX.LIST)</code>) or update the file
- after having applied ProGuard (<code>jar -i out.jar</code>).
- </dd>
-
<dt><a name="invalidclassexception2"><b>InvalidClassException</b>, <b>class loading error</b>, or <b>verification error</b> (in Java Micro Edition)</a></dt>
<dd>If you get such an error in Java Micro Edition, you may have forgotten to
@@ -654,7 +526,7 @@ might be several reasons:
<dd>You may have forgotten to sign your program jar <i>after</i> having
processed it with ProGuard.</dd>
-<dt><a name="classcastexception"><b>ClassCastException: class not an enum</b>, or <br /><b>IllegalArgumentException: class not an enum type</b></a></dt>
+<dt><a name="classcastexception"><b>ClassCastException: class not an enum</b>, or <br><b>IllegalArgumentException: class not an enum type</b></a></dt>
<dd>You should make sure you're preserving the special methods of enumeration
types, which the run-time environment calls by introspection. The required
@@ -676,7 +548,7 @@ might be several reasons:
<code>sun.tools.java.MethodSet.add</code> in Sun's JDK 1.2.2, which is
used for (dynamic) compilation. You should then avoid this option.</dd>
-<dt><a name="classformaterror1"><b>ClassFormatError: repetitive field name/signature</b></a></dt>
+<dt><a name="classformaterror"><b>ClassFormatError: repetitive field name/signature</b></a></dt>
<dd>You are probably processing some code that has been obfuscated before with
the <a
@@ -684,14 +556,6 @@ might be several reasons:
option. You should then use the same option again in the second processing
round.</dd>
-<dt><a name="classformaterror2"><b>ClassFormatError: Invalid index in LocalVariableTable in class file</b></a></dt>
-
-<dd>If you are keeping the <code>LocalVariableTable</code> or
- <code>LocalVariableTypeTable</code> attributes, ProGuard's optimizing step
- is sometimes unable to update them consistently. You should then let the
- obfuscation step remove these attributes or disable the optimization
- step.</dd>
-
<dt><a name="nosuchmethoderror"><b>NoSuchMethodError</b> or <b>AbstractMethodError</b></a></dt>
<dd>You should make sure you're not writing your output class files to a
@@ -719,11 +583,10 @@ might be several reasons:
</dl>
-<hr />
-<noscript><div><a target="_top" href="../index.html" class="button">Show menu</a></div></noscript>
+<hr>
<address>
-Copyright &copy; 2002-2011
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2009
+<a href="http://www.graphics.cornell.edu/~eric/">Eric Lafortune</a>.
</address>
</body>
</html>
diff --git a/docs/manual/usage.html b/docs/manual/usage.html
index d84810e..8be8d60 100644
--- a/docs/manual/usage.html
+++ b/docs/manual/usage.html
@@ -1,21 +1,10 @@
-<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!doctype html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<meta http-equiv="content-style-type" content="text/css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>ProGuard Usage</title>
-<script type="text/javascript" language="JavaScript">
-<!--
-if (window.self==window.top)
- window.top.location.replace("../index.html#"+window.location.pathname+window.location.hash);
-else {
- var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
- if (window.top.location.hash!=hash)
- window.top.location.hash=hash;
-}
-//-->
-</script>
</head>
<body>
@@ -26,53 +15,55 @@ To run ProGuard, just type:
<code><b>java -jar proguard.jar </b></code><i>options</i> ...
</p>
You can find the ProGuard jar in the <code>lib</code> directory of the
-ProGuard distribution. Alternatively, the <code>bin</code> directory contains
-some short Linux and Windows scripts containing this command. Typically, you'll
-put most options in a configuration file (say, <code>myconfig.pro</code>), and
-just call:
+ProGuard distribution. Options can also be put in one or more configuration
+files. Typically, you'll put most options in a configuration file (say,
+<code>myconfig.pro</code>), and just call:
<p class="code">
<code><b>java -jar proguard.jar @myconfig.pro</b></code>
</p>
-You can combine command line options and options from configuration files. For
+You can combine command line options and options from configuration files, for
instance:
<p class="code">
<code><b>java -jar proguard.jar @myconfig.pro -verbose</b></code>
</p>
<p>
-You can add comments in a configuration file, starting with a
-<code><b>#</b></code> character and continuing until the end of the line.
+In a configuration file, a <code><b>#</b></code> sign and all remaining
+characters on that line are ignored, allowing you to add comments.
<p>
-Extra whitespace between words and delimiters is ignored. File names with
-spaces or special characters should be quoted with single or double quotes.
+Extra whitespace between words and delimiters is ignored. To specify file
+names with spaces or special characters, words can be quoted with single or
+double quotes. Note that the quotes may need to be escaped when used on the
+command line, to avoid them being gobbled by the shell.
<p>
Options can be grouped arbitrarily in arguments on the command line and in
-lines in configuration files. This means that you can quote arbitrary sections
-of command line options, to avoid shell expansion of special characters, for
-instance.
+lines in configuration files. This means that you can quote any arbitrary
+section of command line options, to avoid shell expansion of special
+characters, for instance.
<p>
-The order of the options is generally irrelevant. For quick experiments, you
-can abbreviate them to their first unique characters.
+The order of the options is generally irrelevant. They can be abbreviated to
+their first unique characters.
<p>
The sections below provide more details:
<ul>
-<li><a href="#iooptions">Input/Output Options</a></li>
-<li><a href="#keepoptions">Keep Options</a></li>
-<li><a href="#shrinkingoptions">Shrinking Options</a></li>
-<li><a href="#optimizationoptions">Optimization Options</a></li>
-<li><a href="#obfuscationoptions">Obfuscation Options</a></li>
-<li><a href="#preverificationoptions">Preverification Options</a></li>
-<li><a href="#generaloptions">General Options</a></li>
-<li><a href="#classpath">Class Paths</a></li>
-<li><a href="#filename">File Names</a></li>
-<li><a href="#filefilters">File Filters</a></li>
-<li><a href="#filters">Filters</a></li>
-<li><a href="#keepoverview">Overview of <code>Keep</code> Options</a></li>
-<li><a href="#keepoptionmodifiers">Keep Option Modifiers</a></li>
-<li><a href="#classspecification">Class Specifications</a></li>
+<li><a href="#iooptions">Input/Output Options</a>
+<li><a href="#keepoptions">Keep Options</a>
+<li><a href="#shrinkingoptions">Shrinking Options</a>
+<li><a href="#optimizationoptions">Optimization Options</a>
+<li><a href="#obfuscationoptions">Obfuscation Options</a>
+<li><a href="#preverificationoptions">Preverification Options</a>
+<li><a href="#generaloptions">General Options</a>
+<li><a href="#classpath">Class Paths</a>
+<li><a href="#filename">File Names</a>
+<li><a href="#filefilters">File Filters</a>
+<li><a href="#filters">Filters</a>
+<li><a href="#keepoverview">Overview of <code>Keep</code> Options</a>
+<li><a href="#keepoptionmodifiers">Keep Option Modifiers</a>
+<li><a href="#classspecification">Class Specifications</a>
</ul>
-<h2><a name="iooptions">Input/Output Options</a></h2>
+<a name="iooptions">&nbsp;</a>
+<h2>Input/Output Options</h2>
<dl>
<dt><a name="at"><code><b>@</b></code></a><a href="#filename"><i>filename</i></a></dt>
@@ -144,28 +135,24 @@ The sections below provide more details:
href="examples.html#midlet">JME midlets</a>, just by specifying the
appropriate run-time jar.</dd>
-<dt><a name="skipnonpubliclibraryclasses"><code><b>-skipnonpubliclibraryclasses</b></code></a></dt>
-
-<dd>Specifies to skip non-public classes while reading library jars, to speed
- up processing and reduce memory usage of ProGuard. By default, ProGuard
- reads non-public and public library classes alike. However, non-public
- classes are often not relevant, if they don't affect the actual program
- code in the input jars. Ignoring them then speeds up ProGuard, without
- affecting the output. Unfortunately, some libraries, including recent JSE
- run-time libraries, contain non-public library classes that are extended
- by public library classes. You then can't use this option. ProGuard will
- print out warnings if it can't find classes due to this option being
- set.</dd>
-
<dt><a name="dontskipnonpubliclibraryclasses"><code><b>-dontskipnonpubliclibraryclasses</b></code></a></dt>
-<dd>Specifies not to ignore non-public library classes. As of version 4.5, this
- is the default setting.</dd>
+<dd>Specifies not to ignore non-public library classes. By default, non-public
+ library classes are skipped while parsing library jars. The classes are
+ typically not relevant during processing, since they don't affect the
+ actual program code in the input jars. Ignoring them reduces memory usage
+ and processing time. Occasionally, a badly designed library may contain a
+ non-public library class that is extended/implemented by a public library
+ class. If the latter library class in turn is extended/implemented by a
+ program class, ProGuard will complain that it can't find the non-public
+ library class, which it had ignored during parsing. This option will
+ overcome that problem, at the cost of greater memory usage and longer
+ processing time.</dd>
<dt><a name="dontskipnonpubliclibraryclassmembers"><code><b>-dontskipnonpubliclibraryclassmembers</b></code></a></dt>
<dd>Specifies not to ignore package visible library class members (fields and
- methods). By default, ProGuard skips these class members while parsing
+ methods). By default, these class members are skipped while parsing
library classes, as program classes will generally not refer to them.
Sometimes however, program classes reside in the same packages as library
classes, and they do refer to their package visible class members. In
@@ -187,11 +174,11 @@ The sections below provide more details:
<dd>Specifies the version number to be set in the processed class files. The
version number can be one of <code>1.0</code>, <code>1.1</code>,
<code>1.2</code>, <code>1.3</code>, <code>1.4</code>, <code>1.5</code> (or
- just <code>5</code>), <code>1.6</code> (or just <code>6</code>), or
- <code>1.7</code> (or just <code>7</code>). By default, the version numbers
- of the class files are left unchanged. For example, you may want to
- <a href="examples.html#upgrade">upgrade class files to Java 6</a>, by
- changing their version numbers and having them preverified.</dd>
+ just <code>5</code>), or <code>1.6</code> (or just <code>6</code>). By
+ default, the version numbers of the class files are left unchanged. For
+ example, you may want to <a href="examples.html#upgrade">upgrade class
+ files to Java 6</a>, by changing their version numbers and having them
+ preverified.</dd>
<dt><a name="forceprocessing"><code><b>-forceprocessing</b></code></a></dt>
@@ -202,7 +189,8 @@ The sections below provide more details:
</dl>
<p>
-<h2><a name="keepoptions">Keep Options</a></h2>
+<a name="keepoptions">&nbsp;</a>
+<h2>Keep Options</h2>
<dl>
<dt><a name="keep"><code><b>-keep</b></code></a>
@@ -257,11 +245,11 @@ The sections below provide more details:
<p>
Specifies class members whose names are to be preserved, if they aren't
removed in the shrinking phase. For example, you may want to preserve the
- name of the synthetic <code>class$</code> methods
- when <a href="examples.html#library">processing a library</a> compiled by
- JDK 1.2 or older, so obfuscators can detect it again when processing an
- application that uses the processed library (although ProGuard itself
- doesn't need this). Only applicable when obfuscating.</dd>
+ name of the synthetic <code>class$</code> methods when <a
+ href="examples.html#library">processing a library</a>, so obfuscators can
+ detect it again when processing an application that uses the processed
+ library (although ProGuard itself doesn't need this). Only applicable when
+ obfuscating.</dd>
<dt><a name="keepclasseswithmembernames"><code><b>-keepclasseswithmembernames</b></code></a>
<a href="#classspecification"><i>class_specification</i></a></dt>
@@ -292,7 +280,8 @@ The sections below provide more details:
</dl>
<p>
-<h2><a name="shrinkingoptions">Shrinking Options</a></h2>
+<a name="shrinkingoptions">&nbsp;</a>
+<h2>Shrinking Options</h2>
<dl>
<dt><a name="dontshrink"><code><b>-dontshrink</b></code></a></dt>
@@ -330,7 +319,8 @@ The sections below provide more details:
</dl>
<p>
-<h2><a name="optimizationoptions">Optimization Options</a></h2>
+<a name="optimizationoptions">&nbsp;</a>
+<h2>Optimization Options</h2>
<dl>
<dt><a name="dontoptimize"><code><b>-dontoptimize</b></code></a></dt>
@@ -411,13 +401,14 @@ The sections below provide more details:
<ul>
<li>Sun's JRE 1.3 may throw an <code>InternalError</code> when
encountering more than 256 <i>Miranda</i> methods (interface methods
- without implementations) in a class.</li>
+ without implementations) in a class.
</ul></dd>
</dl>
<p>
-<h2><a name="obfuscationoptions">Obfuscation Options</a></h2>
+<a name="obfuscationoptions">&nbsp;</a>
+<h2>Obfuscation Options</h2>
<dl>
<dt><a name="dontobfuscate"><code><b>-dontobfuscate</b></code></a></dt>
@@ -452,8 +443,7 @@ The sections below provide more details:
piece of code. In such cases, you should consider whether you also need
the option <a
href="#useuniqueclassmembernames"><code>-useuniqueclassmembernames</code></a>.
- Only a single mapping file is allowed. Only applicable when
- obfuscating.</dd>
+ Only applicable when obfuscating.</dd>
<dt><a name="obfuscationdictionary"><code><b>-obfuscationdictionary</b></code></a>
<a href="#filename"><i>filename</i></a></dt>
@@ -516,13 +506,13 @@ The sections below provide more details:
<ul>
<li>Sun's JDK 1.2.2 <code>javac</code> compiler produces an exception when
compiling with such a library (cfr. <a href=
- "http://bugs.sun.com/view_bug.do?bug_id=4216736">Bug #4216736</a>).
- You probably shouldn't use this option for processing libraries.</li>
+ "http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4216736">Bug
+ #4216736</a>). You probably shouldn't use this option for processing
+ libraries.
<li>Sun's JRE 1.4 and later fail to serialize objects with overloaded
- primitive fields.</li>
+ primitive fields.
<li>Sun's JRE 1.5 <code>pack200</code> tool reportedly has problems with
- overloaded class members.</li>
- <li>Google's Dalvik VM can't handle overloaded static fields.</li>
+ overloaded class members.
</ul></dd>
<dt><a name="useuniqueclassmembernames"><code><b>-useuniqueclassmembernames</b></code></a></dt>
@@ -618,24 +608,12 @@ The sections below provide more details:
name can be specified as well, referring to the source name part of this
attribute. For example, you should at least keep the
<code>Exceptions</code>, <code>InnerClasses</code>, and
- <code>Signature</code> attributes
- when <a href="examples.html#library">processing a library</a>. You should
- also keep the <code>SourceFile</code> and
- <code>LineNumberTable</code> attributes
- for <a href="examples.html#stacktrace">producing useful obfuscated stack
- traces</a>. Finally, you may want
- to <a href="examples.html#annotations">keep annotations</a> if your code
- depends on them. Only applicable when obfuscating.</dd>
-
-<dt><a name="keepparameternames"><code><b>-keepparameternames</b></code></a></dt>
-
-<dd>Specifies to keep the parameter names and types of methods that are kept.
- This option actually keeps trimmed versions of the debugging attributes
- <code>LocalVariableTable</code> and
- <code>LocalVariableTypeTable</code>. It can be useful when
- <a href="examples.html#library">processing a library</a>. Some IDEs can
- use the information to assist developers who use the library, for example
- with tool tips or autocompletion. Only applicable when obfuscating.</dd>
+ <code>Signature</code> attributes when <a
+ href="examples.html#library">processing a library</a>. As another example,
+ you should keep the <code>SourceFile</code> and
+ <code>LineNumberTable</code> attributes for <a
+ href="examples.html#stacktrace">producing useful obfuscated stack
+ traces</a>. Only applicable when obfuscating.</dd>
<dt><a name="renamesourcefileattribute"><code><b>-renamesourcefileattribute</b></code></a>
[<i>string</i>]</dt>
@@ -687,7 +665,8 @@ The sections below provide more details:
</dl>
<p>
-<h2><a name="preverificationoptions">Preverification Options</a></h2>
+<a name="preverificationoptions">&nbsp;</a>
+<h2>Preverification Options</h2>
<dl>
<dt><a name="dontpreverify"><code><b>-dontpreverify</b></code></a></dt>
@@ -711,7 +690,8 @@ The sections below provide more details:
</dl>
<p>
-<h2><a name="generaloptions">General Options</a></h2>
+<a name="generaloptions">&nbsp;</a>
+<h2>General Options</h2>
<dl>
<dt><a name="verbose"><code><b>-verbose</b></code></a></dt>
@@ -769,7 +749,8 @@ The sections below provide more details:
</dl>
<p>
-<h2><a name="classpath">Class Paths</a></h2>
+<a name="classpath">&nbsp;</a>
+<h2>Class Paths</h2>
ProGuard accepts a generalization of class paths to specify input files and
output files. A class path consists of entries, separated by the traditional
@@ -778,12 +759,12 @@ The order of the entries determines their priorities, in case of duplicates.
<p>
Each input entry can be:
<ul>
-<li>A class file or resource file,</li>
-<li>A jar file, containing any of the above,</li>
-<li>A war file, containing any of the above,</li>
-<li>An ear file, containing any of the above,</li>
-<li>A zip file, containing any of the above,</li>
-<li>A directory (structure), containing any of the above.</li>
+<li>A class file or resource file.
+<li>A jar file, containing any of the above,
+<li>A war file, containing any of the above,
+<li>An ear file, containing any of the above,
+<li>A zip file, containing any of the above,
+<li>A directory (structure), containing any of the above.
</ul>
<p>
The paths of directly specified class files and resource files is ignored, so
@@ -795,11 +776,11 @@ any additional directory prefixes inside the archives or directories.
Each output entry can be:
<ul>
<li>A jar file, in which all processed class files and resource files will be
- collected.</li>
-<li>A war file, in which any and all of the above will be collected,</li>
-<li>An ear file, in which any and all of the above will be collected,</li>
-<li>A zip file, in which any and all of the above will be collected,</li>
-<li>A directory, in which any and all of the above will be collected.</li>
+ collected.
+<li>A war file, in which any and all of the above will be collected,
+<li>An ear file, in which any and all of the above will be collected,
+<li>A zip file, in which any and all of the above will be collected,
+<li>A directory, in which any and all of the above will be collected.
</ul>
<p>
When writing output entries, ProGuard will generally package the results in a
@@ -820,12 +801,12 @@ class path entry can be followed by up to 5 types of <a
href="#filefilters">file filters</a> between parentheses, separated by
semi-colons:
<ul>
-<li>A filter for all zip names that are encountered,</li>
-<li>A filter for all ear names that are encountered,</li>
-<li>A filter for all war names that are encountered,</li>
-<li>A filter for all jar names that are encountered,</li>
+<li>A filter for all zip names that are encountered,
+<li>A filter for all ear names that are encountered,
+<li>A filter for all war names that are encountered,
+<li>A filter for all jar names that are encountered,
<li>A filter for all class file names and resource file names that are
- encountered.</li>
+ encountered.
</ul>
<p>
If fewer than 5 filters are specified, they are assumed to be the latter
@@ -859,15 +840,16 @@ possibilities. The Examples section provides a few more examples
for <a href="examples.html#filtering">filtering input and output</a>.
<p>
-<h2><a name="filename">File Names</a></h2>
+<a name="filename">&nbsp;</a>
+<h2>File Names</h2>
ProGuard accepts absolute paths and relative paths for the various file names
and directory names. A relative path is interpreted as follows:
<ul>
-<li>relative to the base directory, if set, or otherwise</li>
+<li>relative to the base directory, if set, or otherwise
<li>relative to the configuration file in which it is specified, if any, or
- otherwise</li>
-<li>relative to the working directory.</li>
+ otherwise
+<li>relative to the working directory.
</ul>
<p>
The names can contain Java system properties delimited by '<b>&lt;</b>' and
@@ -890,7 +872,8 @@ For example, on the command line, you could use an option like <code>'-injars
"my program.jar":"/your directory/your program.jar"'</code>.
<p>
-<h2><a name="filefilters">File Filters</a></h2>
+<a name="filefilters">&nbsp;</a>
+<h2>File Filters</h2>
Like general <a href="#filters">filters</a>, a file filter is a
comma-separated list of file names that can contain wildcards. Only files with
@@ -922,7 +905,8 @@ For example, "<code>!**.gif,images/**</code>" matches all files in the
The Examples section provides a few more examples for <a
href="examples.html#filtering">filtering input and output</a>.
-<h2><a name="filters">Filters</a></h2>
+<a name="filters">&nbsp;</a>
+<h2>Filters</h2>
ProGuard offers options with filters for many different aspects of the
configuration: names of files, directories, classes, packages, attributes,
@@ -960,7 +944,8 @@ For example, "<code>!foobar,*bar</code>" matches all names ending with
<code>bar</code>, except <code>foobar</code>.
<p>
-<h2><a name="keepoverview">Overview of <code>Keep</code> Options</a></h2>
+<a name="keepoverview">&nbsp;</a>
+<h2>Overview of <code>Keep</code> Options</h2>
The various <code>-keep</code> options for shrinking and obfuscation may seem
a bit confusing at first, but there's actually a pattern behind them. The
@@ -1006,7 +991,7 @@ are not removed in the shrinking step, and not renamed in the obfuscation step.
<p>
<table>
<tr><td valign="top">
-<img src="attention.gif" width="64" height="64"alt="attention" />
+<img src="attention.gif" width="64" height="64"alt="attention">
</td><td>
Always remember:
<ul>
@@ -1020,7 +1005,8 @@ Always remember:
</table>
<p>
-<h2><a name="keepoptionmodifiers">Keep Option Modifiers</a></h2>
+<a name="keepoptionmodifiers">&nbsp;</a>
+<h2>Keep Option Modifiers</h2>
<dl>
<dt><a name="allowshrinking"><code><b>allowshrinking</b></code></a></dt>
@@ -1049,7 +1035,8 @@ Always remember:
</dl>
<p>
-<h2><a name="classspecification">Class Specifications</a></h2>
+<a name="classspecification">&nbsp;</a>
+<h2>Class Specifications</h2>
A class specification is a template of classes and class members (fields and
methods). It is used in the various <code>-keep</code> options and in the
@@ -1084,15 +1071,15 @@ of the specification that belong together. The indentation tries to clarify
the intended meaning, but white-space is irrelevant in actual configuration
files.
<p>
-<ul class="spacious">
+<ul>
<li>The <code><b>class</b></code> keyword refers to any interface or class.
The <code><b>interface</b></code> keyword restricts matches to interface
classes. The <code><b>enum</b></code> keyword restricts matches to
enumeration classes. Preceding the <code><b>interface</b></code> or
<code><b>enum</b></code> keywords by a <code><b>!</b></code> restricts
- matches to classes that are not interfaces or enumerations,
- respectively.</li>
+ matches to classes that are not interfaces or enumerations, respectively.
+ <p>
<li>Every <i>classname</i> must be fully qualified, e.g.
<code>java.lang.String</code>. Class names may be specified as regular
@@ -1133,19 +1120,22 @@ files.
should be used with moderation.
<p>
For convenience and for backward compatibility, the class name
- <code><b>*</b></code> refers to any class, irrespective of its package.</li>
+ <code><b>*</b></code> refers to any class, irrespective of its package.
+ <p>
<li>The <code><b>extends</b></code> and <code><b>implements</b></code>
specifications are typically used to restrict classes with wildcards. They
are currently equivalent, specifying that only classes extending or
implementing the given class qualify. Note that the given class itself is
not included in this set. If required, it should be specified in a
- separate option.</li>
+ separate option.
+ <p>
<li>The <code><b>@</b></code> specifications can be used to restrict classes
and class members to the ones that are annotated with the specified
annotation types. An <i>annotationtype</i> is specified just like a
- <i>classname</i>.</li>
+ <i>classname</i>.
+ <p>
<li>Fields and methods are specified much like in Java, except that method
argument lists don't contain argument names (just like in other tools
@@ -1208,11 +1198,13 @@ files.
<code>***</code> wildcards will match array types of any dimension. For
example, "<code>** get*()</code>" matches "<code>java.lang.Object
getObject()</code>", but not "<code>float getFloat()</code>", nor
- "<code>java.lang.Object[] getObjects()</code>".</li>
+ "<code>java.lang.Object[] getObjects()</code>".
+ <p>
<li>Constructors can also be specified using their short class names (without
package) or using their full class names. As in the Java language, the
- constructor specification has an argument list, but no return type.</li>
+ constructor specification has an argument list, but no return type.
+ <p>
<li>The class access modifiers and class member access modifiers are typically
used to restrict wildcarded classes and class members. They specify that
@@ -1226,18 +1218,14 @@ files.
which case at least one of them has to be set (e.g. at least
<code>public</code>
<i>or</i> <code>protected</code>).
- <p>
- ProGuard supports the additional modifiers <code><b>synthetic</b></code>,
- <code><b>bridge</b></code>, and <code><b>varargs</b></code>, which may be
- set by compilers.</li>
</ul>
+<p>
-<hr />
-<noscript><div><a target="_top" href="../index.html" class="button">Show menu</a></div></noscript>
+<hr>
<address>
-Copyright &copy; 2002-2011
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2009
+<a href="http://www.graphics.cornell.edu/~eric/">Eric Lafortune</a>.
</address>
</body>
</html>
diff --git a/docs/manual/wtk.html b/docs/manual/wtk.html
index 196b9ca..b8c70b5 100644
--- a/docs/manual/wtk.html
+++ b/docs/manual/wtk.html
@@ -1,27 +1,16 @@
-<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!doctype html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<meta http-equiv="content-style-type" content="text/css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>ProGuard JME Wireless Toolkit Integration</title>
-<script type="text/javascript" language="JavaScript">
-<!--
-if (window.self==window.top)
- window.top.location.replace("../index.html#"+window.location.pathname+window.location.hash);
-else {
- var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
- if (window.top.location.hash!=hash)
- window.top.location.hash=hash;
-}
-//-->
-</script>
</head>
<body>
<h2>JME Wireless Toolkit Integration</h2>
-<b>ProGuard</b> can be seamlessly integrated in Oracle's Wireless Toolkit (WTK)
+<b>ProGuard</b> can be seamlessly integrated in Sun's Wireless Toolkit (WTK)
for Java Micro Edition (JME).
<p>
@@ -60,11 +49,10 @@ Should you ever need to customize your ProGuard configuration for the JME WTK,
you can adapt the configuration file <code>proguard/wtk/default.pro</code>
that's inside the <code>proguard.jar</code>.
-<hr />
-<noscript><div><a target="_top" href="../index.html" class="button">Show menu</a></div></noscript>
+<hr>
<address>
-Copyright &copy; 2002-2011
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2009
+<a href="http://www.graphics.cornell.edu/~eric/">Eric Lafortune</a>.
</address>
</body>
</html>
diff --git a/docs/quality.html b/docs/quality.html
index a8bbf05..29889e3 100644
--- a/docs/quality.html
+++ b/docs/quality.html
@@ -1,21 +1,10 @@
-<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!doctype html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<meta http-equiv="content-style-type" content="text/css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>ProGuard Quality</title>
-<script type="text/javascript" language="JavaScript">
-<!--
-if (window.self==window.top)
- window.top.location.replace("index.html#"+window.location.pathname+window.location.hash);
-else {
- var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
- if (window.top.location.hash!=hash)
- window.top.location.hash=hash;
-}
-//-->
-</script>
</head>
<body>
@@ -42,15 +31,14 @@ full-screen size.
<p>
In addition, <b>ProGuard</b> is tested against a constantly growing test suite
-(more than 900 tests at this time of writing). These small programs contain a
+(more than 500 tests at this time of writing). These small programs contain a
wide range of common and uncommon constructs, in order to detect any regression
problems as soon as possible.
-<hr />
-<noscript><div><a target="_top" href="index.html" class="button">Show menu</a></div></noscript>
+<hr>
<address>
-Copyright &copy; 2002-2011
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2009
+<a href="http://www.graphics.cornell.edu/~eric/">Eric Lafortune</a>.
</address>
</body>
</html>
diff --git a/docs/results.html b/docs/results.html
index ca833ac..480cd4f 100644
--- a/docs/results.html
+++ b/docs/results.html
@@ -1,22 +1,10 @@
-<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!doctype html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<meta http-equiv="content-style-type" content="text/css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>ProGuard Results</title>
-<script type="text/javascript" language="JavaScript">
-<!--
-if (window.self==window.top)
- window.top.location.replace("index.html#"+window.location.pathname+window.location.hash);
-else {
- var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
- if (window.top.location.hash!=hash)
- window.top.location.hash=hash;
-}
-//-->
-</script>
-<title>ProGuard Results</title>
</head>
<body>
@@ -43,7 +31,7 @@ presents some typical results:
</tr>
<tr>
-<td><a target="other" href="http://www.oracle.com/technetwork/java/javame/">Worm</a>, a sample midlet from Oracle's JME</td>
+<td><a target="other" href="http://java.sun.com/j2me/">Worm</a>, a sample midlet from Sun's JME</td>
<td align="center">10.3 K</td>
<td align="center">9.8 K</td>
<td align="center">9.6 K</td>
@@ -87,7 +75,7 @@ presents some typical results:
</tr>
<tr>
-<td><a target="other" href="http://java.sun.com/javase/6/">the run-time classes</a> from Oracle's Java 6</td>
+<td><a target="other" href="http://java.sun.com/javase/6/">the run-time classes</a> from Sun's Java 6</td>
<td align="center">53 M</td>
<td align="center">23 M</td>
<td align="center">22 M</td>
@@ -98,7 +86,7 @@ presents some typical results:
</tr>
<tr>
-<td><a target="other" href="http://tomcat.apache.org/">Tomcat</a>, the Apache servlet container</td>
+<td><a target="other" href="http://jakarta.apache.org/tomcat/index.html">Tomcat</a>, the Apache servlet container</td>
<td align="center">1.1 M</td>
<td align="center">466 K</td>
<td align="center">426 K</td>
@@ -109,7 +97,7 @@ presents some typical results:
</tr>
<tr>
-<td><a target="other" href="http://javancss.codehaus.org/">JavaNCSS</a>, a Java source metrics tool</td>
+<td><a target="other" href="http://www.kclee.com/clemens/java/javancss/">JavaNCSS</a>, a Java source metrics tool</td>
<td align="center">632 K</td>
<td align="center">242 K</td>
<td align="center">212 K</td>
@@ -133,8 +121,7 @@ presents some typical results:
</table>
<p>
Results were measured with ProGuard 4.0 on a 2.6 GHz Pentium 4 with 512 MB
-of memory, using Sun JDK 1.5.0 in Fedora Core 3 Linux. All of this technology
-and software has evolved since, but the gist of the results remains the same.
+of memory, using Sun JDK 1.5.0 in Fedora Core 3 Linux.
<p>
The program sizes include companion libraries. The shrinking step produces the
best results for programs that use only small parts of their libraries. The
@@ -158,12 +145,10 @@ minutes.
Memory usage (the amount of physical memory used by ProGuard while processing)
is governed by the basic java virtual machine and by the total size of the
library jars and program jars.
-
-<hr />
-<noscript><div><a target="_top" href="index.html" class="button">Show menu</a></div></noscript>
+<hr>
<address>
-Copyright &copy; 2002-2011
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2009
+<a href="http://www.graphics.cornell.edu/~eric/">Eric Lafortune</a>.
</address>
</body>
diff --git a/docs/saikoalogo.png b/docs/saikoalogo.png
deleted file mode 100644
index 5b34172..0000000
--- a/docs/saikoalogo.png
+++ /dev/null
Binary files differ
diff --git a/docs/sanawarelogo.png b/docs/sanawarelogo.png
new file mode 100644
index 0000000..bf7218b
--- /dev/null
+++ b/docs/sanawarelogo.png
Binary files differ
diff --git a/docs/screenshots.html b/docs/screenshots.html
index 64805a9..8718839 100644
--- a/docs/screenshots.html
+++ b/docs/screenshots.html
@@ -1,21 +1,10 @@
-<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!doctype html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<meta http-equiv="content-style-type" content="text/css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>ProGuard Screenshots</title>
-<script type="text/javascript" language="JavaScript">
-<!--
-if (window.self==window.top)
- window.top.location.replace("index.html#"+window.location.pathname+window.location.hash);
-else {
- var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
- if (window.top.location.hash!=hash)
- window.top.location.hash=hash;
-}
-//-->
-</script>
</head>
<body>
@@ -24,7 +13,7 @@ else {
<table><tr><td>
<a href="screenshot_gui1.gif" target="other">
<img src="screenshots_gui_small.gif" width="320" height="223" align="right"
- alt="GUI screenshot" usemap="#guimap" /></a>
+ alt="GUI screenshot" usemap="#guimap"></a>
<map id="guimap" name="guimap">
<area shape="rect" coords="2,7,46,16" alt="ProGuard" href="screenshot_gui1.gif" target="other">
@@ -47,21 +36,21 @@ tabs.
<tr><td>
<a href="screenshot_console.gif" target="other">
<img src="screenshot_console_small.gif" width="320" height="268" align="left"
- alt="Console screenshot" /></a>
+ alt="Console screenshot"></a>
Of course, real developers don't need all this point-and-click fluff. They
-write short configuration files using their favorite text editors and invoke
+write a short configuration file using their favorite text editor and invoke
<b>ProGuard</b> from the command-line.
<p>
You can click on the image to see the full-size version.
</td></tr></table>
+<p>
-<hr />
-<noscript><div><a target="_top" href="index.html" class="button">Show menu</a></div></noscript>
+<hr>
<address>
-Copyright &copy; 2002-2011
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2009
+<a href="http://www.graphics.cornell.edu/~eric/">Eric Lafortune</a>.
</address>
</body>
</html>
diff --git a/docs/sections.html b/docs/sections.html
index 622277a..d955d33 100644
--- a/docs/sections.html
+++ b/docs/sections.html
@@ -1,4 +1,4 @@
-<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!doctype html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
@@ -37,28 +37,26 @@ document.write("<img src=\"");
document.write(document.location.hostname == "proguard.sourceforge.net" ?
"http://sourceforge.net/sflogo.php?group_id=54750&amp;type=1" :
"sflogo.png");
-document.write("\" width=\"88\" height=\"31\" alt=\"SourceForge\" />");
+document.write("\" width=\"88\" height=\"31\" alt=\"SourceForge\">");
+if (document.location.hostname == "proguard.sourceforge.net") {
+ document.write("<script type=\"text/javascript\" src=\"http://sourceforge.net/apps/piwik/proguard/piwik.js\"></scri"+"pt>");
+ document.write("<script type=\"text/javascript\">piwik_log(\"\", 1, \"http://sourceforge.net/apps/piwik/proguard/piwik.php\");</scri"+"pt>");
+}
//-->
</script>
<noscript>
-<img src="sflogo.png" width="88" height="31" alt="SourceForge" />
+<img src="sflogo.png" width="88" height="31" alt="SourceForge">
</noscript>
</a>
<p>
-<a href="http://www.saikoa.com/" target="_top">
-<img src="saikoalogo.png" width="88" height="19" alt="Saikoa" /></a>
+<a href="http://www.luciad.com/" target="other">
+<img src="luciadlogo.png" width="88" height="24" alt="Luciad"></a>
+<p>
+<a href="http://www.javadocking.com/" target="other">
+<img src="sanawarelogo.png" width="88" height="24" alt="Sanaware"></a>
</center>
-<script type="text/javascript">
-base = "http://sourceforge.net/apps/piwik/proguard/";
-if (document.location.hostname == "proguard.sourceforge.net")
- document.write(unescape("%3Cscript src='"+base+"piwik.js' type='text/javascript'%3E%3C/script%3E"));
-</script><script type="text/javascript">
-if (document.location.hostname == "proguard.sourceforge.net")
- piwik_log('', 1, base+"piwik.php");
-</script>
-
</body>
</html>
diff --git a/docs/style.css b/docs/style.css
index dd8418d..c9798db 100644
--- a/docs/style.css
+++ b/docs/style.css
@@ -52,11 +52,6 @@ td
padding: 8px;
}
-ul.spacious li
-{
- padding: 8px;
-}
-
a
{
text-decoration: none;
@@ -67,21 +62,13 @@ img
border: none;
}
-a.button {
- color: #000000;
- text-decoration: none;
- background: #E0E0E0;
- border: 1px outset #FFFFFF;
- float: right;
-}
-
/* Settings for the introductory paragraph. */
p.intro
{
background: #EEEEFF;
padding: 10px;
- border: 1px solid #000000;
+ border: solid #000000 1px
}
/* Settings for the title frame. */
diff --git a/docs/testimonials.html b/docs/testimonials.html
index d37ddcd..6971617 100644
--- a/docs/testimonials.html
+++ b/docs/testimonials.html
@@ -1,21 +1,10 @@
-<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!doctype html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<meta http-equiv="content-style-type" content="text/css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>ProGuard Testimonials</title>
-<script type="text/javascript" language="JavaScript">
-<!--
-if (window.self==window.top)
- window.top.location.replace("index.html#"+window.location.pathname+window.location.hash);
-else {
- var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
- if (window.top.location.hash!=hash)
- window.top.location.hash=hash;
-}
-//-->
-</script>
</head>
<body>
@@ -25,11 +14,11 @@ And now for some shameless self-glorification and name-dropping...
<p>
<b>ProGuard</b> is probably the most popular java shrinker, optimizer, and
obfuscator world-wide. It is being used by developers at companies and
-organizations like IBM, HP, Siemens, Nokia, Google, and NATO. It is the
-default tool in many development environments like Oracle's Wireless Toolkit,
-Netbeans, EclipseME, Google's Android SDK, and more. Although the quotes below
-probably don't represent official views of any kind, encouragements like these
-do keep me happy.
+organizations like Sun, IBM, HP, Siemens, Nokia, Google, and NATO. It is the
+default tool in many development environments like Sun's Wireless Toolkit,
+Netbeans, EclipseME, and more. Although the quotes below probably don't
+represent official views of any kind, encouragements like these do keep me
+happy.
<p>
<center><table class="note">
@@ -37,9 +26,9 @@ do keep me happy.
ProGuard is <b>the</b> ultimate java obfuscator!
</cite></p>
<p class="author">P.S, IBM</p></td>
-<td class="shadow8"><img src="drop2.gif" width="8" height="100" /></td></tr><tr>
-<td class="shadow400"><img src="drop1.gif" width="400" height="8" /></td>
-<td class="shadow8"><img src="drop3.gif" width="8" height="8" /></td>
+<td class="shadow8"><img src="drop2.gif" width="8" height="100"></td></tr><tr>
+<td class="shadow400"><img src="drop1.gif" width="400" height="8"></td>
+<td class="shadow8"><img src="drop3.gif" width="8" height="8"></td>
</tr></table></center>
<p>
@@ -49,9 +38,9 @@ Also:
ProGuard is pure quality - powerful and trouble-free.
</cite></p>
<p class="author">M.B., Statestep</p></td>
-<td class="shadow8"><img src="drop2.gif" width="8" height="100" /></td></tr><tr>
-<td class="shadow400"><img src="drop1.gif" width="400" height="8" /></td>
-<td class="shadow8"><img src="drop3.gif" width="8" height="8" /></td>
+<td class="shadow8"><img src="drop2.gif" width="8" height="100"></td></tr><tr>
+<td class="shadow400"><img src="drop1.gif" width="400" height="8"></td>
+<td class="shadow8"><img src="drop3.gif" width="8" height="8"></td>
</tr></table></center>
<p>
@@ -61,9 +50,9 @@ And:
It is the simplest and most robust obfuscator we have ever used.
</cite></p>
<p class="author">I.I., Hewlett-Packard</p></td>
-<td class="shadow8"><img src="drop2.gif" width="8" height="100" /></td></tr><tr>
-<td class="shadow400"><img src="drop1.gif" width="400" height="8" /></td>
-<td class="shadow8"><img src="drop3.gif" width="8" height="8" /></td>
+<td class="shadow8"><img src="drop2.gif" width="8" height="100"></td></tr><tr>
+<td class="shadow400"><img src="drop1.gif" width="400" height="8"></td>
+<td class="shadow8"><img src="drop3.gif" width="8" height="8"></td>
</tr></table></center>
<p>
@@ -73,9 +62,9 @@ And indeed:
ProGuard rules. Much easier to use than the commercial alternatives.
</cite></p>
<p class="author">B.G., Quiotix Corp.</p></td>
-<td class="shadow8"><img src="drop2.gif" width="8" height="100" /></td></tr><tr>
-<td class="shadow400"><img src="drop1.gif" width="400" height="8" /></td>
-<td class="shadow8"><img src="drop3.gif" width="8" height="8" /></td>
+<td class="shadow8"><img src="drop2.gif" width="8" height="100"></td></tr><tr>
+<td class="shadow400"><img src="drop1.gif" width="400" height="8"></td>
+<td class="shadow8"><img src="drop3.gif" width="8" height="8"></td>
</tr></table></center>
<p>
@@ -88,9 +77,9 @@ obfuscators and shrinkers, ProGuard stands out as the simplest, most robust,
and accurate shrinker of them all.
</cite></p>
<p class="author">D.J., Joot</p></td>
-<td class="shadow8"><img src="drop2.gif" width="8" height="100" /></td></tr><tr>
-<td class="shadow400"><img src="drop1.gif" width="400" height="8" /></td>
-<td class="shadow8"><img src="drop3.gif" width="8" height="8" /></td>
+<td class="shadow8"><img src="drop2.gif" width="8" height="100"></td></tr><tr>
+<td class="shadow400"><img src="drop1.gif" width="400" height="8"></td>
+<td class="shadow8"><img src="drop3.gif" width="8" height="8"></td>
</tr></table></center>
<p>
@@ -104,9 +93,9 @@ powerful configuration options make it an excellent addition to your MIDlet
development toolbox.
</cite></p>
<p class="author">J.K., Sun</p></td>
-<td class="shadow8"><img src="drop2.gif" width="8" height="100" /></td></tr><tr>
-<td class="shadow400"><img src="drop1.gif" width="400" height="8" /></td>
-<td class="shadow8"><img src="drop3.gif" width="8" height="8" /></td>
+<td class="shadow8"><img src="drop2.gif" width="8" height="100"></td></tr><tr>
+<td class="shadow400"><img src="drop1.gif" width="400" height="8"></td>
+<td class="shadow8"><img src="drop3.gif" width="8" height="8"></td>
</tr></table></center>
<p>
@@ -117,16 +106,16 @@ And, of course, the price is stunning:
You could've been rich.
</cite></p>
<p class="author">My mother</p></td>
-<td class="shadow8"><img src="drop2.gif" width="8" height="100" /></td></tr><tr>
-<td class="shadow400"><img src="drop1.gif" width="400" height="8" /></td>
-<td class="shadow8"><img src="drop3.gif" width="8" height="8" /></td>
+<td class="shadow8"><img src="drop2.gif" width="8" height="100"></td></tr><tr>
+<td class="shadow400"><img src="drop1.gif" width="400" height="8"></td>
+<td class="shadow8"><img src="drop3.gif" width="8" height="8"></td>
</tr></table></center>
+<p>
-<hr />
-<noscript><div><a target="_top" href="index.html" class="button">Show menu</a></div></noscript>
+<hr>
<address>
-Copyright &copy; 2002-2011
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2009
+<a href="http://www.graphics.cornell.edu/~eric/">Eric Lafortune</a>.
</address>
</body>
diff --git a/docs/title.html b/docs/title.html
index 50838b1..33171b5 100644
--- a/docs/title.html
+++ b/docs/title.html
@@ -1,4 +1,4 @@
-<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!doctype html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
@@ -9,8 +9,8 @@
<body class="title">
<div class="title">
-<h1><img src="title.gif" width="154" height="29" alt="ProGuard" /></h1>
-<div>Version 4.7</div>
+<h1><img src="title.gif" width="154" height="29" alt="ProGuard"></h1>
+<div>Version 4.4</div>
</div>
</body>