Added proguard 4.7 files
please note that proguard is not yet implmented refs #17
33
public/proguard/README
Normal file
@@ -0,0 +1,33 @@
|
||||
ProGuard, Java class file shrinker, optimizer, obfuscator, and preverifier
|
||||
==========================================================================
|
||||
|
||||
This distribution contains the following directories:
|
||||
|
||||
- bin : simple wrapper scripts to run ProGuard, its GUI, and ReTrace
|
||||
- lib : the main jars, compiled and ready to use with "java -jar ...."
|
||||
- docs : the complete documentation, licenses, etc. in html format
|
||||
- examples : some example configuration files
|
||||
- src : the source code
|
||||
- build : various alternative build scripts
|
||||
|
||||
|
||||
The best place to start is docs/index.html
|
||||
|
||||
|
||||
Example
|
||||
=======
|
||||
|
||||
If you want to give ProGuard a spin right away, try processing the ProGuard
|
||||
jar itself:
|
||||
|
||||
cd examples
|
||||
java -jar ../lib/proguard.jar @proguard.pro
|
||||
|
||||
The resulting proguard_out.jar contains the same application, but it's a lot
|
||||
smaller.
|
||||
|
||||
Enjoy!
|
||||
|
||||
http://proguard.sourceforge.net/
|
||||
|
||||
Copyright (c) 2002-2011 Eric Lafortune (eric@graphics.cornell.edu)
|
||||
1
public/proguard/VERSION
Normal file
@@ -0,0 +1 @@
|
||||
4.7
|
||||
14
public/proguard/bin/proguard.bat
Normal file
@@ -0,0 +1,14 @@
|
||||
@ECHO OFF
|
||||
|
||||
REM Start-up script for ProGuard -- free class file shrinker, optimizer,
|
||||
REM obfuscator, and preverifier for Java bytecode.
|
||||
REM
|
||||
REM Note: when passing file names containing spaces to this script,
|
||||
REM you'll have to add escaped quotes around them, e.g.
|
||||
REM "\"C:/My Directory/My File.txt\""
|
||||
|
||||
IF EXIST "%PROGUARD_HOME%" GOTO home
|
||||
SET PROGUARD_HOME=..
|
||||
:home
|
||||
|
||||
java -jar "%PROGUARD_HOME%"\lib\proguard.jar %*
|
||||
12
public/proguard/bin/proguard.sh
Executable file
@@ -0,0 +1,12 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Start-up script for ProGuard -- free class file shrinker, optimizer,
|
||||
# obfuscator, and preverifier for Java bytecode.
|
||||
#
|
||||
# Note: when passing file names containing spaces to this script,
|
||||
# you'll have to add escaped quotes around them, e.g.
|
||||
# "\"/My Directory/My File.txt\""
|
||||
|
||||
PROGUARD_HOME=`dirname "$0"`/..
|
||||
|
||||
java -jar $PROGUARD_HOME/lib/proguard.jar "$@"
|
||||
14
public/proguard/bin/proguardgui.bat
Normal file
@@ -0,0 +1,14 @@
|
||||
@ECHO OFF
|
||||
|
||||
REM Start-up script for the GUI of ProGuard -- free class file shrinker,
|
||||
REM optimizer, obfuscator, and preverifier for Java bytecode.
|
||||
REM
|
||||
REM Note: when passing file names containing spaces to this script,
|
||||
REM you'll have to add escaped quotes around them, e.g.
|
||||
REM "\"C:/My Directory/My File.txt\""
|
||||
|
||||
IF EXIST "%PROGUARD_HOME%" GOTO home
|
||||
SET PROGUARD_HOME=..
|
||||
:home
|
||||
|
||||
java -jar "%PROGUARD_HOME%"\lib\proguardgui.jar %*
|
||||
15
public/proguard/bin/proguardgui.sh
Executable file
@@ -0,0 +1,15 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Start-up script for the GUI of ProGuard -- free class file shrinker,
|
||||
# optimizer, obfuscator, and preverifier for Java bytecode.
|
||||
#
|
||||
# Note: when passing file names containing spaces to this script,
|
||||
# you'll have to add escaped quotes around them, e.g.
|
||||
# "\"/My Directory/My File.txt\""
|
||||
|
||||
PROGUARD_HOME=`dirname "$0"`/..
|
||||
|
||||
# On Linux, Java 1.6.0_24 and higher hang when starting the GUI:
|
||||
# http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7027598
|
||||
# We're using the -D option as a workaround.
|
||||
java -DsuppressSwingDropSupport=true -jar $PROGUARD_HOME/lib/proguardgui.jar "$@"
|
||||
14
public/proguard/bin/retrace.bat
Normal file
@@ -0,0 +1,14 @@
|
||||
@ECHO OFF
|
||||
|
||||
REM Start-up script for Retrace -- companion tool for ProGuard, free class file
|
||||
REM shrinker, optimizer, obfuscator, and preverifier for Java bytecode.
|
||||
REM
|
||||
REM Note: when passing file names containing spaces to this script,
|
||||
REM you'll have to add escaped quotes around them, e.g.
|
||||
REM "\"C:/My Directory/My File.txt\""
|
||||
|
||||
IF EXIST "%PROGUARD_HOME%" GOTO home
|
||||
SET PROGUARD_HOME=..
|
||||
:home
|
||||
|
||||
java -jar "%PROGUARD_HOME%"\lib\retrace.jar %*
|
||||
12
public/proguard/bin/retrace.sh
Executable file
@@ -0,0 +1,12 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Start-up script for Retrace -- companion tool for ProGuard, free class file
|
||||
# shrinker, optimizer, obfuscator, and preverifier for Java bytecode.
|
||||
#
|
||||
# Note: when passing file names containing spaces to this script,
|
||||
# you'll have to add escaped quotes around them, e.g.
|
||||
# "\"/My Directory/My File.txt\""
|
||||
|
||||
PROGUARD_HOME=`dirname "$0"`/..
|
||||
|
||||
java -jar $PROGUARD_HOME/lib/retrace.jar "$@"
|
||||
253
public/proguard/docs/FAQ.html
Normal file
@@ -0,0 +1,253 @@
|
||||
<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//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>
|
||||
|
||||
<h2>Frequently Asked Questions</h2>
|
||||
|
||||
<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="#optimization">What kind of optimizations does <b>ProGuard</b>
|
||||
support?</a></li>
|
||||
<li><a href="#commercial">Can I use <b>ProGuard</b> to process my commercial
|
||||
application?</a></li>
|
||||
<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>
|
||||
<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>
|
||||
<li><a href="#incremental">Does <b>ProGuard</b> support incremental
|
||||
obfuscation?</a></li>
|
||||
<li><a href="#keywords">Can <b>ProGuard</b> obfuscate using reserved
|
||||
keywords?</a></li>
|
||||
<li><a href="#stacktrace">Can <b>ProGuard</b> reconstruct obfuscated stack
|
||||
traces?</a></li>
|
||||
</ol>
|
||||
|
||||
<h3><a name="shrinking">What is shrinking?</a></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
|
||||
contain a lot of unused code, especially if it includes program libraries.
|
||||
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>
|
||||
|
||||
By default, compiled bytecode still contains a lot of debugging information:
|
||||
source file names, line numbers, field names, method names, argument names,
|
||||
variable names, etc. This information makes it straightforward to decompile
|
||||
the bytecode and reverse-engineer entire programs. Sometimes, this is not
|
||||
desirable. Obfuscators such as <b>ProGuard</b> can remove the debugging
|
||||
information and replace all names by meaningless character sequences, making
|
||||
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>
|
||||
|
||||
When loading class files, the class loader performs some sophisticated
|
||||
verification of the byte code. This analysis makes sure the code can't
|
||||
accidentally or intentionally break out of the sandbox of the virtual machine.
|
||||
Java Micro Edition and Java 6 introduced split verification. This means that
|
||||
the JME preverifier and the Java 6 compiler add preverification information to
|
||||
the class files (StackMap and StackMapTable attributes, respectively), in order
|
||||
to simplify the actual verification step for the class loader. Class files can
|
||||
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>
|
||||
|
||||
Apart from removing unused classes, fields, and methods in the shrinking step,
|
||||
<b>ProGuard</b> can also perform optimizations at the bytecode level, inside
|
||||
and across methods. Thanks to techniques like control flow analysis, data flow
|
||||
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>Perform over 200 peephole optimizations, like replacing ...*2 by
|
||||
...<<1.</li>
|
||||
<li>Optionally remove logging code.</li>
|
||||
</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
|
||||
benefit more than advanced virtual machines with sophisticated JIT compilers.
|
||||
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>
|
||||
</ul>
|
||||
|
||||
<h3><a name="commercial">Can I use <b>ProGuard</b> to process my commercial application?</a></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>
|
||||
|
||||
Yes, <b>ProGuard</b> supports all JDKs from 1.1 up to and including 7.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.
|
||||
|
||||
<h3><a name="jme">Does <b>ProGuard</b> work with Java Micro Edition?</a></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,
|
||||
including Java Micro Edition. <b>ProGuard</b> then also performs the required
|
||||
preverification, producing more compact results than the traditional external
|
||||
preverifier.
|
||||
<p>
|
||||
<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>
|
||||
|
||||
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>
|
||||
|
||||
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
|
||||
quite a few optimizations, but preprocessing the jar files with
|
||||
<b>ProGuard</b> can generally still reduce the final code size by a few
|
||||
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>
|
||||
|
||||
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>
|
||||
|
||||
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>
|
||||
|
||||
Yes. <b>ProGuard</b> automatically handles constructs like
|
||||
<code>Class.forName("SomeClass")</code> and <code>SomeClass.class</code>. The
|
||||
referenced classes are preserved in the shrinking phase, and the string
|
||||
arguments are properly replaced in the obfuscation phase.
|
||||
<p>
|
||||
With variable string arguments, it's generally not possible to determine their
|
||||
possible values. They might be read from a configuration file, for instance.
|
||||
However, <b>ProGuard</b> will note a number of constructs like
|
||||
"<code>(SomeClass)Class.forName(variable).newInstance()</code>". These might
|
||||
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>
|
||||
|
||||
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>
|
||||
|
||||
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>
|
||||
|
||||
Not explicitly. Control flow obfuscation injects additional branches into the
|
||||
bytecode, in an attempt to fool decompilers. <b>ProGuard</b> does not do this,
|
||||
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>
|
||||
|
||||
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>
|
||||
|
||||
Yes. You can specify your own obfuscation dictionary, such as a list of
|
||||
reserved key words, identifiers with foreign characters, random source files,
|
||||
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>
|
||||
|
||||
Yes. <b>ProGuard</b> comes with a companion tool, <b>ReTrace</b>, that can
|
||||
'de-obfuscate' stack traces produced by obfuscated applications. The
|
||||
reconstruction is based on the mapping file that <b>ProGuard</b> can write
|
||||
out. If line numbers have been obfuscated away, a list of alternative method
|
||||
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>
|
||||
<address>
|
||||
Copyright © 2002-2011
|
||||
<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
|
||||
</address>
|
||||
</body>
|
||||
</html>
|
||||
406
public/proguard/docs/GPL.html
Normal file
@@ -0,0 +1,406 @@
|
||||
<!DOCTYPE html PUBLIC "-//IETF//DTD HTML 2.0//EN">
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<TITLE>GNU General Public License</TITLE>
|
||||
</HEAD>
|
||||
<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#1F00FF" ALINK="#FF0000" VLINK="#9900DD">
|
||||
<H1>GNU General Public License</H1>
|
||||
<H2>Table of Contents</H2>
|
||||
<UL>
|
||||
|
||||
<LI><A NAME="TOC1" HREF="#SEC1">GNU GENERAL PUBLIC LICENSE</A>
|
||||
<UL>
|
||||
<LI><A NAME="TOC2" HREF="#SEC2">Preamble</A>
|
||||
<LI><A NAME="TOC3" HREF="#SEC3">TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</A>
|
||||
|
||||
</UL>
|
||||
</UL>
|
||||
|
||||
<P>
|
||||
|
||||
<HR>
|
||||
|
||||
<P>
|
||||
|
||||
|
||||
|
||||
<H2><A NAME="SEC1" HREF="#TOC1">GNU GENERAL PUBLIC LICENSE</A></H2>
|
||||
<P>
|
||||
Version 2, June 1991
|
||||
|
||||
</P>
|
||||
|
||||
<PRE>
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
</PRE>
|
||||
|
||||
|
||||
|
||||
<H2><A NAME="SEC2" HREF="#TOC2">Preamble</A></H2>
|
||||
|
||||
<P>
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Library General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
</P>
|
||||
<P>
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
</P>
|
||||
<P>
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
</P>
|
||||
<P>
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
</P>
|
||||
<P>
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
</P>
|
||||
<P>
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
</P>
|
||||
<P>
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
</P>
|
||||
<P>
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
</P>
|
||||
|
||||
|
||||
<H2><A NAME="SEC3" HREF="#TOC3">TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</A></H2>
|
||||
|
||||
|
||||
<P>
|
||||
|
||||
<STRONG>0.</STRONG>
|
||||
This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
<P>
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
<P>
|
||||
|
||||
<STRONG>1.</STRONG>
|
||||
You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
<P>
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
<P>
|
||||
|
||||
<STRONG>2.</STRONG>
|
||||
You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
<P>
|
||||
|
||||
<UL>
|
||||
|
||||
<LI><STRONG>a)</STRONG>
|
||||
You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
<P>
|
||||
<LI><STRONG>b)</STRONG>
|
||||
You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
<P>
|
||||
<LI><STRONG>c)</STRONG>
|
||||
If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
</UL>
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
<P>
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
<P>
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
<P>
|
||||
|
||||
<STRONG>3.</STRONG>
|
||||
You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
|
||||
<!-- we use this doubled UL to get the sub-sections indented, -->
|
||||
<!-- while making the bullets as unobvious as possible. -->
|
||||
<UL>
|
||||
|
||||
<LI><STRONG>a)</STRONG>
|
||||
Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
<P>
|
||||
<LI><STRONG>b)</STRONG>
|
||||
Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
<P>
|
||||
<LI><STRONG>c)</STRONG>
|
||||
Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
</UL>
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
<P>
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
<P>
|
||||
|
||||
<STRONG>4.</STRONG>
|
||||
You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
<P>
|
||||
|
||||
<STRONG>5.</STRONG>
|
||||
You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
<P>
|
||||
|
||||
<STRONG>6.</STRONG>
|
||||
Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
<P>
|
||||
|
||||
<STRONG>7.</STRONG>
|
||||
If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
<P>
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
<P>
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
<P>
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
<P>
|
||||
|
||||
<STRONG>8.</STRONG>
|
||||
If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
<P>
|
||||
|
||||
<STRONG>9.</STRONG>
|
||||
The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
<P>
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
<P>
|
||||
|
||||
|
||||
<STRONG>10.</STRONG>
|
||||
If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
|
||||
|
||||
<P><STRONG>NO WARRANTY</STRONG></P>
|
||||
|
||||
<P>
|
||||
|
||||
<STRONG>11.</STRONG>
|
||||
BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
<P>
|
||||
|
||||
<STRONG>12.</STRONG>
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
<P>
|
||||
|
||||
|
||||
<H2>END OF TERMS AND CONDITIONS</H2>
|
||||
</BODY>
|
||||
</HTML>
|
||||
56
public/proguard/docs/GPL_exception.html
Normal file
@@ -0,0 +1,56 @@
|
||||
<!DOCTYPE html PUBLIC "-//IETF//DTD HTML 2.0//EN">
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<TITLE>Special Exception to the GNU General Public License</TITLE>
|
||||
</HEAD>
|
||||
<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#1F00FF" ALINK="#FF0000" VLINK="#9900DD">
|
||||
<H1>Special Exception to the GNU General Public License</H1>
|
||||
|
||||
<P>
|
||||
Copyright © 2002-2011 Eric Lafortune
|
||||
</P>
|
||||
|
||||
<P>
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
Foundation; either version 2 of the License, or (at your option) any later
|
||||
version.
|
||||
</P>
|
||||
|
||||
<P>
|
||||
This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||
</P>
|
||||
|
||||
<P>
|
||||
You should have received a copy of the GNU General Public License along with
|
||||
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
||||
Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
</P>
|
||||
|
||||
<P>
|
||||
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>
|
||||
</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
|
||||
these programs. If you modify this file, you may extend this exception to your
|
||||
version of the file, but you are not obligated to do so. If you do not wish to
|
||||
do so, delete this exception statement from your version.
|
||||
</P>
|
||||
|
||||
</BODY>
|
||||
</HTML>
|
||||
76
public/proguard/docs/acknowledgements.html
Normal file
@@ -0,0 +1,76 @@
|
||||
<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//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>
|
||||
|
||||
<h2>Acknowledgements</h2>
|
||||
|
||||
The first versions of <b>ProGuard</b> grew out of <b>RetroGuard</b>, which its
|
||||
author Mark Welsh kindly made available under the GNU Lesser General Public
|
||||
License. <b>RetroGuard</b> is a very nice piece of code, but it only performed
|
||||
obfuscation. I started from the class file parsing code and wrote my own
|
||||
shrinker, optimizer, obfuscator, and preverifier. As of version 4.0, all of the
|
||||
original code has been rewritten, so the most obvious remaining similarity are
|
||||
the program names.
|
||||
<p>
|
||||
|
||||
Dirk Schnelle has contributed and maintained the first versions of the Ant
|
||||
task. I have rewritten the implementation for version 3.0, but the XML schema
|
||||
is still based on his work.
|
||||
<p>
|
||||
|
||||
Since its first public release, many people have expressed their enthusiasm and
|
||||
have chimed in with interesting ideas, bug reports, and bug fixes: Thorsten
|
||||
Heit, Oliver Retzl, Jonathan Knudsen, Tarcisio Camara, Bob Drury, Dave Jarvis,
|
||||
Marc Chapman, Dave Morehouse, Richard Osbaldeston, Peter Hawkins, Mark
|
||||
Sherington, David Sitsky, James Manning, Ptolemy Oberin, Frank-Michael Moser,
|
||||
QZ Shines, Thomas Singer, Michele Puccini, Roman Bednarek, Natalia Pujol,
|
||||
Daniel Sjöblom, Jan Filipsky, Charles Smith, Gerrit Telkamp, Noel
|
||||
Grandin, Torbjörn Sö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,
|
||||
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.
|
||||
<p>
|
||||
|
||||
<a href="http://sourceforge.net/projects/proguard/"
|
||||
target="other">SourceForge</a> is 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.
|
||||
<p>
|
||||
|
||||
And finally, I'm a great fan of Sanaware's <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>
|
||||
<address>
|
||||
Copyright © 2002-2011
|
||||
<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
|
||||
</address>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
699
public/proguard/docs/alternatives.html
Normal file
@@ -0,0 +1,699 @@
|
||||
<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//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>
|
||||
|
||||
<h2>Alternatives</h2>
|
||||
|
||||
There are quite a few Java class file shrinkers, optimizers, obfuscators, and
|
||||
preverifiers out there. Users of <b>ProGuard</b> tell me it easily compares
|
||||
with the best of them. However, you may want to check that out yourself.
|
||||
<p>
|
||||
This is a list of the programs of which I'm aware. Obviously, I've never
|
||||
personally tested all of them. Many programs, even commercial ones, have been
|
||||
abandoned. Please drop me a note if you know of any other shrinkers,
|
||||
optimizers, obfuscators, or preverifiers, or if some information provided
|
||||
below is incorrect.
|
||||
<p>
|
||||
|
||||
<table>
|
||||
|
||||
<tr>
|
||||
<th>Author/Company</th>
|
||||
<th>Program</th>
|
||||
<th>Shrink.</th>
|
||||
<th>Optim.</th>
|
||||
<th>Obfusc.</th>
|
||||
<th>Preverif.</th>
|
||||
<th>License</th>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><a target="other" href="http://www.lafortune.eu/">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>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>Free (GPL)</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>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>Free (BSD)</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>Free (no source)</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>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>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ø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>Free (Apache)</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><a target="other" rel="nofollow" href="http://www.ucdetector.org/">Jö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>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>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>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>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>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>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>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>Free (GPL)</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>Free (no source)</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><a target="other" rel="nofollow" href="http://github.com/v6ak">Vít Šestá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>
|
||||
</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>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>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>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>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>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>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>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>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>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>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>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>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>Commercial</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>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>(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>(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>(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>(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>(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>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>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>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>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>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>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>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>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>Commercial (disappeared?)</td>
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
<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>
|
||||
<address>
|
||||
Copyright © 2002-2011
|
||||
<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
|
||||
</address>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
BIN
public/proguard/docs/checkmark.gif
Normal file
|
After Width: | Height: | Size: 63 B |
623
public/proguard/docs/downloads.html
Normal file
@@ -0,0 +1,623 @@
|
||||
|
||||
<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//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>
|
||||
|
||||
<h2>Downloads</h2>
|
||||
|
||||
<b>ProGuard</b> is distributed under the terms of the GNU General Public
|
||||
License. Please consult the <a href="license.html">license page</a> for more
|
||||
details.
|
||||
<p>
|
||||
<b>ProGuard</b> is written in Java, so it requires a Java Runtime Environment
|
||||
(JRE 1.4 or higher).
|
||||
<p>
|
||||
You can download the latest release (containing the program jar, the
|
||||
documentation you're reading now, examples, and the source code) from this
|
||||
location:
|
||||
<p>
|
||||
<center><a href="http://sourceforge.net/project/showfiles.php?group_id=54750"
|
||||
target="other">Download section</a> (at <a
|
||||
href="http://sourceforge.net/projects/proguard/"
|
||||
target="other">SourceForge</a>)</center>
|
||||
<p>
|
||||
|
||||
If you're still working with an older version of <b>ProGuard</b>, check out
|
||||
the summary of changes below, to see if you're missing something essential.
|
||||
Better look at the up-to-date <a
|
||||
href="http://proguard.sourceforge.net/downloads.html">on-line version</a> if
|
||||
you're reading a local copy of this page.
|
||||
<p>
|
||||
The download section may also contain updates with sub-minor version numbers.
|
||||
These versions are typically released shortly after their parent versions, for
|
||||
applying emergency fixes. Please make sure to look at those if you are
|
||||
encountering any problems with recent releases.
|
||||
<p>
|
||||
Finally, there may be beta versions of upcoming releases. They may be of
|
||||
interest too, because they typically contain any less urgent bug fixes
|
||||
collected since the previous release.
|
||||
<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.
|
||||
<li>Added option <code>-optimizations</code> for fine-grained configuration of
|
||||
optimizations.
|
||||
<li>Added option <code>-adaptclassstrings</code> for adapting string constants
|
||||
that correspond to obfuscated classes.
|
||||
<li>Added option <code>-keeppackagenames</code> for keeping specified package
|
||||
names from being obfuscated.
|
||||
<li>Added option <code>-keepdirectories</code> for keeping specified directory
|
||||
entries in output jars.
|
||||
<li>Extended options <code>-dontnote</code> and <code>-dontwarn</code> for
|
||||
fine-grained configuration of notes and warnings.
|
||||
<li>Added option <code>-regex</code> in ReTrace, for specifying alternative
|
||||
regular expressions to parse stack traces.
|
||||
<li>Extended renaming of resource files based on obfuscation.
|
||||
<li>Improved inlining of constant parameters and removal of unused parameters.
|
||||
<li>Avoiding bug in IBM's JVM for JSE, in optimization step.
|
||||
<li>Avoiding ArrayIndexOutOfBoundsException in optimization step.
|
||||
<li>Fixed configuration with annotations that are not preserved themselves.
|
||||
<li>Fixed preverification of invocations of super constructors with arguments
|
||||
containing ternary operators.
|
||||
<li>Fixed processing of unreachable exception handlers.
|
||||
<li>Fixed merging of exception classes.
|
||||
<li>Fixed repeated method inlining.
|
||||
<li>Fixed inlining of finally blocks surrounded by large try blocks, compiled
|
||||
with JDK 1.4 or earlier.
|
||||
<li>Fixed optimization of complex finally blocks, compiled with JDK 1.4 or
|
||||
earlier.
|
||||
<li>Fixed obfuscation of anonymous class names, if <code>EnclosingMethod</code>
|
||||
attributes are being kept.
|
||||
<li>Fixed obfuscation of inner class names in generic types.
|
||||
<li>Fixed decoding of UTF-8 strings containing special characters.
|
||||
<li>Fixed copying of debug information and annotations when merging classes.
|
||||
<li>Fixed writing out of unknown attributes.
|
||||
<li>Fixed updating manifest files with split lines.
|
||||
<li>Updated documentation and examples.
|
||||
</ul>
|
||||
|
||||
<h3><div>Dec 2008</div> Version 4.3</h3>
|
||||
<ul>
|
||||
<li>Added class merging.
|
||||
<li>Added static single assignment analysis.
|
||||
<li>Added support for annotation and enumeration class types in configuration.
|
||||
<li>Refined shrinking of fields in case of unusual
|
||||
<code>-keepclassmembers</code> options.
|
||||
<li>Added simplification of tail recursion calls.
|
||||
<li>Added new peephole optimizations.
|
||||
<li>Fixed optimization of unused variable initializations causing negative
|
||||
stack sizes.
|
||||
<li>Fixed optimization of unusual initialization code causing
|
||||
NullPointerExceptions.
|
||||
<li>Fixed optimization of half-used long and double parameters.
|
||||
<li>Fixed processing of complex generics signatures.
|
||||
<li>Working around suspected java compiler bug with parameter annotations on
|
||||
constructors of non-static inner classes.
|
||||
<li>Fixed obfuscation of classes with inner classes whose names are preserved.
|
||||
<li>Fixed access of protected methods in repackaged classes.
|
||||
<li>Added options <code>-classobfuscationdictionary</code> and
|
||||
<code>-packageobfuscationdictionary</code>.
|
||||
<li>Adapting more types of resource file names based on obfuscation.
|
||||
<li>Extended warnings about incorrect dependencies.
|
||||
<li>Added start-up scripts and build scripts.
|
||||
<li>Updated documentation and examples.
|
||||
</ul>
|
||||
|
||||
<h3><div>Mar 2008</div> Version 4.2</h3>
|
||||
<ul>
|
||||
<li>Refined data flow analysis in optimization step.
|
||||
<li>Fixed handling of exceptions when inlining subroutines.
|
||||
<li>Fixed inlining of incompatible code constructs between different java
|
||||
versions.
|
||||
<li>Fixed computation of local variable frame size.
|
||||
<li>Fixed optimization of infinite loops.
|
||||
<li>Fixed optimization of subroutine invocations.
|
||||
<li>Fixed optimization of floating point remainder computations.
|
||||
<li>Fixed removal of unused parameters in method descriptors containing arrays
|
||||
of longs or doubles.
|
||||
<li>Added undocumented java system properties
|
||||
<code>maximum.inlined.code.length</code> (default is 8) and
|
||||
<code>maximum.resulting.code.length</code> (defaults are 8000 for JSE and
|
||||
2000 for JME), for expert users who read release notes.
|
||||
<li>Fixed processing of generic types in Signature attributes in shrinking and
|
||||
optimization steps.
|
||||
<li>Fixed processing of inner class names in Signature attributes in obfuscation
|
||||
step.
|
||||
<li>Improved adapting resource file names following obfuscated class names.
|
||||
<li>Fixed interpretation of package names in GUI.
|
||||
<li>Fixed default settings for Xlets in GUI.
|
||||
<li>Updated documentation and examples.
|
||||
</ul>
|
||||
|
||||
<h3><div>Dec 2007</div> Version 4.1</h3>
|
||||
<ul>
|
||||
<li>Fixed shrinking of default annotation element values.
|
||||
<li>Fixed optimization of invocations of methods in same class that are
|
||||
accessed through extensions.
|
||||
<li>Fixed optimization of invocations of synchronized methods without other
|
||||
side-effects.
|
||||
<li>Fixed optimization of some non-returning subroutines.
|
||||
<li>Fixed handling of local variable debug information when inlining methods.
|
||||
<li>Avoiding StackOverflowErrors during optimization of complex methods.
|
||||
<li>Fixed obfuscation of potentially ambiguous non-primitive constants in
|
||||
interfaces.
|
||||
<li>Fixed preverification of some code constructs involving String, Class, and
|
||||
exception types.
|
||||
<li>The Ant task now allows empty <code><injars></code> and
|
||||
<code><libraryjars></code> elements.
|
||||
<li>Updated documentation and examples.
|
||||
</ul>
|
||||
|
||||
<h3><div>Sep 2007</div> Version 4.0</h3>
|
||||
<ul>
|
||||
<li>Added preverifier for Java 6 and Java Micro Edition, with new options
|
||||
<code>-microedition</code> and <code>-dontpreverify</code>.
|
||||
<li>Added new option <code>-target</code> to modify java version of processed
|
||||
class files.
|
||||
<li>Made <code>-keep</code> options more orthogonal and flexible, with option
|
||||
modifiers <code>allowshrinking</code>, <code>allowoptimization</code>, and
|
||||
<code>allowobfuscation</code>.
|
||||
<li>Added new wildcards for class member descriptors: "<code>***</code>",
|
||||
matching any type, and "<code>...</code>", matching any number of
|
||||
arguments.
|
||||
<li>Added support for configuration by means of annotations.
|
||||
<li>Improved shrinking of unused annotations.
|
||||
<li>Added check on modification times of input and output, to avoid unnecessary
|
||||
processing, with new option <code>-forceprocessing</code>.
|
||||
<li>Added new options <code>-flattenpackagehierarchy</code> and
|
||||
<code>-repackageclasses</code> (replacing <code>-defaultpackage</code>) to
|
||||
control obfuscation of package names.
|
||||
<li>Added new options <code>-adaptresourcefilenames</code> and
|
||||
<code>-adaptresourcefilecontents</code>, with file filters, to update
|
||||
resource files corresponding to obfuscated class names.
|
||||
<li>Added detection of dynamically accessed fields and methods.
|
||||
<li>Now treating <code>Exceptions</code> attributes as optional.
|
||||
<li>Now respecting naming rule for nested class names
|
||||
(<code>EnclosingClass$InnerClass</code>) in obfuscation step, if
|
||||
<code>InnerClasses</code> attributes or <code>EnclosingMethod</code>
|
||||
attributes are being kept.
|
||||
<li>Added new inter-procedural optimizations: method inlining and propagation
|
||||
of constant fields, constant arguments, and constant return values.
|
||||
<li>Added optimized local variable allocation.
|
||||
<li>Added more than 250 new peephole optimizations.
|
||||
<li>Improved making classes and class members public or protected.
|
||||
<li>Now printing notes on suspiciously unkept classes in parameters of
|
||||
specified methods.
|
||||
<li>Now printing notes for class names that don't seem to be fully qualified.
|
||||
<li>Added support for uppercase filename extensions.
|
||||
<li>Added tool tips to the GUI.
|
||||
<li>Rewritten class file I/O code.
|
||||
<li>Updated documentation and examples.
|
||||
</ul>
|
||||
Upgrade considerations:
|
||||
<ul>
|
||||
|
||||
<li>Since ProGuard now treats the <code>Exceptions</code> attribute as
|
||||
optional, you may have to specify <code>-keepattributes Exceptions</code>,
|
||||
notably when processing code that is to be used as a library.
|
||||
|
||||
<li>ProGuard now preverifies code for Java Micro Edition, if you specify the
|
||||
option <code>-microedition</code>. You then no longer need to process the
|
||||
code with an external preverifier.
|
||||
|
||||
<li>You should preferably specify <code>-repackageclasses</code> instead of the
|
||||
old option name <code>-defaultpackage</code>.
|
||||
</ul>
|
||||
|
||||
<h3><div>Dec 2007</div> Version 3.11</h3>
|
||||
<ul>
|
||||
<li>Fixed optimization of invocations of methods in same class that are
|
||||
accessed through extensions.
|
||||
<li>Fixed optimization of invocations of synchronized methods without other
|
||||
side-effects.
|
||||
<li>Updated documentation and examples.
|
||||
</ul>
|
||||
|
||||
<h3><div>Aug 2007</div> Version 3.10</h3>
|
||||
<ul>
|
||||
<li>Now handling mixed-case input class names when
|
||||
<code>-dontusemixedcaseclassnames</code> is specified.
|
||||
<li>Fixed optimization of synchronization on classes, as compiled by Eclipse
|
||||
and Jikes.
|
||||
<li>Fixed optimization of switch statements with unreachable cases.
|
||||
<li>Avoiding merging subsequent identically named files.
|
||||
<li>Updated documentation and examples.
|
||||
</ul>
|
||||
|
||||
<h3><div>Jun 2007</div> Version 3.9</h3>
|
||||
<ul>
|
||||
<li>Fixed processing of .class constructs in Java 6.
|
||||
<li>Fixed repeated processing of .class constructs.
|
||||
<li>Fixed possible division by 0 in optimization step.
|
||||
<li>Fixed handling of variable instructions with variable indices larger than
|
||||
255.
|
||||
<li>Updated documentation and examples.
|
||||
</ul>
|
||||
|
||||
<h3><div>Mar 2007</div> Version 3.8</h3>
|
||||
<ul>
|
||||
<li>Fixed optimization of parameters used as local variables.
|
||||
<li>Fixed obfuscation with conflicting class member names.
|
||||
<li>Fixed incremental obfuscation with incomplete mapping file for library jars.
|
||||
<li>Updated documentation and examples.
|
||||
</ul>
|
||||
|
||||
<h3><div>Dec 2006</div> Version 3.7</h3>
|
||||
<ul>
|
||||
<li>Now accepting Java 6 class files.
|
||||
<li>Fixed shrinking of partially used annotations.
|
||||
<li>Improved incremental obfuscation, with new option
|
||||
<code>-useuniqueclassmembernames</code>.
|
||||
<li>Printing more information in case of conflicting configuration and input.
|
||||
<li>Fixed optimization of repeated array length instruction.
|
||||
<li>Fixed optimization of subsequent try/catch/finally blocks with return
|
||||
statements.
|
||||
<li>Fixed optimization of complex stack operations.
|
||||
<li>Fixed optimization of simple infinite loops.
|
||||
<li>Fixed optimization of expressions with constant doubles.
|
||||
<li>Tuned optimization to improve size reduction after preverification.
|
||||
<li>Fixed overflows of offsets in long code blocks.
|
||||
<li>Now allowing class names containing dashes.
|
||||
<li>Updated documentation and examples.
|
||||
</ul>
|
||||
|
||||
<h3><div>May 2006</div> Version 3.6</h3>
|
||||
<ul>
|
||||
<li>No longer automatically keeping classes in parameters of specified methods
|
||||
from obfuscation and optimization (introduced in version 3.4).
|
||||
<li>Fixed inlining of interfaces that are used in .class constructs.
|
||||
<li>Fixed removal of busy-waiting loops reading volatile fields.
|
||||
<li>Fixed optimization of comparisons of known integers.
|
||||
<li>Fixed optimization of known branches.
|
||||
<li>Fixed optimization of method calls on arrays of interfaces.
|
||||
<li>Fixed optimization of method calls without side-effects.
|
||||
<li>Fixed optimization of nested try/catch/finally blocks with return
|
||||
statements.
|
||||
<li>Fixed initialization of library classes that only appear in descriptors.
|
||||
<li>Fixed matching of primitive type wildcards in configuration.
|
||||
<li>Fixed the boilerplate specification for enumerations in the GUI.
|
||||
<li>Updated documentation and examples.
|
||||
</ul>
|
||||
|
||||
<h3><div>Jan 2006</div> Version 3.5</h3>
|
||||
<ul>
|
||||
<li>Fixed obfuscation of class members with complex visibility.
|
||||
<li>Fixed optimization bugs causing stack verification errors.
|
||||
<li>Fixed optimization bug causing overridden methods to be finalized.
|
||||
<li>Fixed optimization bug causing abstract method errors for retro-fitted
|
||||
library methods.
|
||||
<li>Fixed optimization bug evaluating code with constant long values.
|
||||
<li>Fixed bug in updating of optional local variable table attributes and local
|
||||
variable type table attributes after optimization.
|
||||
<li>Fixed interpretation of comma-separated class names without wildcards.
|
||||
<li>Updated documentation and examples.
|
||||
</ul>
|
||||
|
||||
<h3><div>Oct 2005</div> Version 3.4</h3>
|
||||
<ul>
|
||||
<li>Extended optimizations: removing duplicate code within methods.
|
||||
<li>Extended regular expressions for class names to comma-separated lists.
|
||||
<li>Now automatically keeping classes in descriptors of kept class members.
|
||||
<li>Added verbose statistics for optimizations.
|
||||
<li>Added boilerplate Number optimizations in GUI.
|
||||
<li>Fixed <code>Class.forName</code> detection.
|
||||
<li>Fixed incremental obfuscation bug.
|
||||
<li>Fixed optimization bug causing stack verification errors.
|
||||
<li>Fixed optimization bugs related to removal of unused parameters.
|
||||
<li>Fixed exception when optimizing code with many local variables.
|
||||
<li>Fixed exception when saving configuration with initializers in GUI.
|
||||
<li>Updated documentation and examples.
|
||||
</ul>
|
||||
|
||||
<h3><div>Jun 2005</div> Version 3.3</h3>
|
||||
<ul>
|
||||
<li>Extended optimizations: making methods private and static when possible,
|
||||
making classes static when possible, removing unused parameters.
|
||||
<li>Made file names relative to the configuration files in which they are
|
||||
specified. Added <code>-basedirectory</code> option.
|
||||
<li>Added <code>-whyareyoukeeping</code> option to get details on why given
|
||||
classes and class members are being kept.
|
||||
<li>Added warnings for misplaced class files.
|
||||
<li>Improved printing of notes for <code>Class.forName</code> constructs.
|
||||
<li>Implemented '<code>assumenosideeffects</code>' nested element in Ant task.
|
||||
<li>Improved processing of annotations.
|
||||
<li>Fixed reading and writing of parameter annotations.
|
||||
<li>Fixed various optimization bugs.
|
||||
<li>Fixed wildcards not matching '-' character.
|
||||
<li>Fixed wildcard bug and checkbox bugs in GUI.
|
||||
<li>Setting file chooser defaults in GUI.
|
||||
<li>Leaving room for growBox in GUI on Mac OS X.
|
||||
<li>Properly closing configuration files.
|
||||
<li>Updated documentation and examples.
|
||||
</ul>
|
||||
|
||||
<h3><div>Dec 2004</div> Version 3.2</h3>
|
||||
<ul>
|
||||
<li>Fixed JDK5.0 processing bugs.
|
||||
<li>Fixed optimization bugs.
|
||||
<li>Fixed relative paths in Ant task.
|
||||
<li>Improved speed of shrinking step.
|
||||
<li>Updated documentation and examples.
|
||||
</ul>
|
||||
|
||||
<h3><div>Nov 2004</div> Version 3.1</h3>
|
||||
<ul>
|
||||
<li>Improved obfuscation and shrinking of private class members.
|
||||
<li>Added inlining of interfaces with single implementations.
|
||||
<li>Added option to specify obfuscation dictionary.
|
||||
<li>Added option to read package visible library class members.
|
||||
<li>Extended support for JDK5.0 attributes.
|
||||
<li>Fixed various optimization bugs.
|
||||
<li>Modified Ant task to accept paths instead of filesets.
|
||||
<li>Fixed two Ant task bugs.
|
||||
<li>Updated documentation and examples.
|
||||
</ul>
|
||||
|
||||
<h3><div>Aug 2004</div> Version 3.0</h3>
|
||||
<ul>
|
||||
<li>Added bytecode optimization step, between shrinking step and obfuscation
|
||||
step.
|
||||
<li>Generalized filtered recursive reading and writing of jars, wars, ears,
|
||||
zips, and directories.
|
||||
<li>Added support for grouping input and output jars, wars, ears, zips, and
|
||||
directories.
|
||||
<li>Added support for applying mapping files to library classes.
|
||||
<li>Removed <code>-resourcejars</code> option. Resources should now be read
|
||||
using regular <code>-injars</code> options, using filters if necessary.
|
||||
<li>Rewrote Ant task. Input and output modification dates are not checked at
|
||||
the moment. Minor changes in XML schema:
|
||||
<ul>
|
||||
<li>Filters now specified using attributes.
|
||||
<li>'<code>outjars</code>' now nested element instead of attribute.
|
||||
<li>'<code>type</code>' attribute of <code><method></code> element no
|
||||
longer defaults to '<code>void</code>'.
|
||||
<li><code><</code> and <code>></code> characters now have to be
|
||||
encoded in embedded configurations.
|
||||
<li><code><proguardconfiguration></code> task no longer accepts
|
||||
attributes.
|
||||
</ul>
|
||||
<li>Updated J2ME WTK plugin, now customizable through configuration file.
|
||||
<li>Updated GUI.
|
||||
<li>Fixed various processing bugs.
|
||||
<li>Fixed ReTrace parsing bugs.
|
||||
<li>Improved jar compression.
|
||||
<li>Updated documentation and examples.
|
||||
</ul>
|
||||
|
||||
<h3><div>Mar 2004</div> Version 2.1</h3>
|
||||
<ul>
|
||||
<li>Added support for JDK1.5 classes.
|
||||
<li>Added additional wildcard for matching primitive types.
|
||||
<li>Added possibility to switch off notes about duplicate class definitions.
|
||||
<li>Fixed use of multiple filters on output jars.
|
||||
<li>Fixed option to keep all attributes.
|
||||
<li>Fixed various Ant task bugs.
|
||||
<li>Updated documentation and examples.
|
||||
</ul>
|
||||
|
||||
<h3><div>Dec 2003</div> Version 2.0</h3>
|
||||
<ul>
|
||||
<li>Added a graphical user interface for ProGuard and ReTrace.
|
||||
<li>Added <code>-applymapping</code> option for incremental obfuscation.
|
||||
<li>Added support for filtering input and output files.
|
||||
<li>Added support for the J++ <code>SourceDir</code> attribute.
|
||||
<li>Improved detection of <code>.class</code> constructs.
|
||||
<li>Improved handling of misplaced manifest files.
|
||||
<li>Improved implementation of ReTrace.
|
||||
<li>Worked around String UTF-8 encoding bug affecting foreign characters.
|
||||
<li>Fixed exception when ignoring warnings.
|
||||
<li>Fixed various Ant task bugs.
|
||||
<li>Updated documentation and examples.
|
||||
</ul>
|
||||
|
||||
<h3><div>Aug 2003</div> Version 1.7</h3>
|
||||
<ul>
|
||||
<li>Fixed various Ant task bugs.
|
||||
<li>Fixed ClassCastException due to explicitly used abstract classes with
|
||||
implicitly used interfaces targeted at JRE1.2 (the default in JDK1.4).
|
||||
<li>Fixed <code>-defaultpackage</code> bug for protected classes and class
|
||||
members.
|
||||
<li>Fixed ReTrace bug when retracing without line number tables.
|
||||
<li>Worked around zip package problems with duplicate out entries and rogue
|
||||
manifest files.
|
||||
<li>Added work-around for handling malformed legacy interface class files.
|
||||
<li>Updated documentation and examples.
|
||||
</ul>
|
||||
|
||||
<h3><div>May 2003</div> Version 1.6</h3>
|
||||
<ul>
|
||||
<li>Added support for Ant.
|
||||
<li>Added support for the J2ME Wireless Toolkit.
|
||||
<li>Added support for reading and writing directory hierarchies.
|
||||
<li>Added option for specifying resource jars and directories.
|
||||
<li>Added support for wildcards in class member specifications.
|
||||
<li>Improved handling of the <code>-defaultpackage</code> option.
|
||||
<li>Improved stack trace parsing in ReTrace tool.
|
||||
<li>Fixed processing of libraries containing public as well as non-public
|
||||
extensions of non-public classes.
|
||||
<li>Fixed examples for processing libraries, midlets, and serializable code.
|
||||
<li>Updated documentation and examples.
|
||||
</ul>
|
||||
|
||||
<h3><div>Jan 2003</div> Version 1.5</h3>
|
||||
<ul>
|
||||
<li>Fixed processing of retrofitted library interfaces.
|
||||
<li>Fixed processing of <code>.class</code> constructs in internal classes
|
||||
targeted at JRE1.2 (the default in JDK1.4).
|
||||
<li>Fixed <code>-dump</code> option when <code>-outjar</code> option is not
|
||||
present.
|
||||
<li>Updated documentation and examples.
|
||||
</ul>
|
||||
|
||||
<h3><div>Nov 2002</div> Version 1.4</h3>
|
||||
<ul>
|
||||
<li>Now copying resource files over from the input jars to the output jar.
|
||||
<li>Added option to obfuscate using lower-case class names only.
|
||||
<li>Added better option for obfuscating native methods.
|
||||
<li>Added option not to ignore non-public library classes.
|
||||
<li>Added automatic <code>.class</code> detection for classes compiled with
|
||||
Jikes.
|
||||
<li>Updated documentation and examples.
|
||||
</ul>
|
||||
|
||||
<h3><div>Sep 2002</div> Version 1.3</h3>
|
||||
<ul>
|
||||
<li>Added support for wildcards in class names.
|
||||
<li>Added tool to de-obfuscate stack traces.
|
||||
<li>Added options to print processing information to files.
|
||||
<li>Added option to rename source file attributes.
|
||||
<li>Fixed processing of implicitly used interfaces targeted at JRE1.2 (the
|
||||
default in JDK1.4)
|
||||
<li>Fixed processing of configurations with negated access modifiers.
|
||||
<li>Fixed duplicate class entry bug.
|
||||
<li>Updated documentation and examples.
|
||||
</ul>
|
||||
|
||||
<h3><div>Aug 2002</div> Version 1.2</h3>
|
||||
<ul>
|
||||
<li>Improved speed.
|
||||
<li>Fixed processing of classes targeted at JRE1.2 (the default in JDK1.4)
|
||||
with references to their own subclasses.
|
||||
<li>Fixed processing of static initializers in J2ME MIDP applications.
|
||||
<li>Fixed processing of retrofitted interfaces (again).
|
||||
<li>Added more flexible handling of white space in configuration.
|
||||
<li>Updated documentation.
|
||||
</ul>
|
||||
|
||||
<h3><div>Jul 2002</div> Version 1.1</h3>
|
||||
<ul>
|
||||
<li>Added automatic detection of <code>Class.forName("MyClass")</code>,
|
||||
<code>MyClass.class</code>, and
|
||||
<code>(MyClass)Class.forName(variable).newInstance()</code> constructs.
|
||||
This greatly simplifies configuration.
|
||||
<li>Added options to keep class names and class member names without affecting
|
||||
any shrinking. They are mostly useful for native methods and serializable
|
||||
classes.
|
||||
<li>Fixed processing of retrofitted interfaces.
|
||||
<li>Added handling of missing/invalid manifest file in input jar.
|
||||
<li>Updated documentation and examples.
|
||||
</ul>
|
||||
|
||||
<h3><div>Jun 2002</div> Version 1.0</h3>
|
||||
<ul>
|
||||
<li>First public release, based on class parsing code from Mark Welsh's
|
||||
<b>RetroGuard</b>.
|
||||
</ul>
|
||||
|
||||
<hr />
|
||||
<noscript><div><a target="_top" href="index.html" class="button">Show menu</a></div></noscript>
|
||||
<address>
|
||||
Copyright © 2002-2011
|
||||
<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
|
||||
</address>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
BIN
public/proguard/docs/drop1.gif
Normal file
|
After Width: | Height: | Size: 803 B |
BIN
public/proguard/docs/drop2.gif
Normal file
|
After Width: | Height: | Size: 620 B |
BIN
public/proguard/docs/drop3.gif
Normal file
|
After Width: | Height: | Size: 175 B |
BIN
public/proguard/docs/favicon.ico
Normal file
|
After Width: | Height: | Size: 7.2 KiB |
120
public/proguard/docs/feedback.html
Normal file
@@ -0,0 +1,120 @@
|
||||
<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
|
||||
<meta http-equiv="content-script-type" content="text/javascript">
|
||||
<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>
|
||||
|
||||
<h2>Feedback</h2>
|
||||
|
||||
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:
|
||||
<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"
|
||||
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>
|
||||
|
||||
<li>The <a href="https://sourceforge.net/projects/proguard/forums/forum/182455"
|
||||
target="other">open discussion forum</a> (at SourceForge) offers a place
|
||||
to share your thoughts and discuss new ideas.</li>
|
||||
|
||||
<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>
|
||||
|
||||
<li>The <a
|
||||
|
||||
href="http://sourceforge.net/tracker/?atid=474707&group_id=54750&func=browse"
|
||||
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>
|
||||
|
||||
<li>The <a href="https://sourceforge.net/projects/proguard/files/"
|
||||
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>
|
||||
|
||||
<li>For anything that doesn't fall in the above categories, you can mail me
|
||||
directly at
|
||||
|
||||
<script type="text/javascript" language="JavaScript">
|
||||
<!--
|
||||
document.write("<a href=\"ma");
|
||||
document.write("ilto:");
|
||||
document.write("lafortune");
|
||||
document.write("@");
|
||||
document.write("users.sourceforge.net\">");
|
||||
document.write("lafortune");
|
||||
document.write("@");
|
||||
document.write("users.sourceforge.net");
|
||||
document.write("</a>");
|
||||
document.write(" <em>or</em> at ");
|
||||
document.write("<a href=\"ma");
|
||||
document.write("ilto:");
|
||||
document.write("eric");
|
||||
document.write("@");
|
||||
document.write("graphics.cornell.edu\">");
|
||||
document.write("eric");
|
||||
document.write("@");
|
||||
document.write("graphics.cornell.edu");
|
||||
document.write("</a>");
|
||||
//-->
|
||||
</script>
|
||||
<noscript>
|
||||
< lafortune @ users . sourceforge . net >
|
||||
<em>or</em> at
|
||||
< eric @ graphics . cornell . edu > (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
|
||||
like seeing any constructive comments.
|
||||
<p>
|
||||
|
||||
<b>ProGuard</b> isn't a typical open source project, in the sense that I am
|
||||
<em>not</em> looking for code contributions. Developing on my own allows me to
|
||||
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>
|
||||
<address>
|
||||
Copyright © 2002-2011
|
||||
<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
|
||||
</address>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
92
public/proguard/docs/index.html
Normal file
@@ -0,0 +1,92 @@
|
||||
<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
|
||||
<meta http-equiv="content-script-type" content="text/javascript">
|
||||
<meta http-equiv="content-style-type" content="text/css">
|
||||
<meta name="author" content="Eric Lafortune">
|
||||
<meta name="description" content="ProGuard: java shrinker, optimizer, obfuscator, and preverifier">
|
||||
<meta name="keywords" content="java obfuscator, optimizer, shrinker, preverfier">
|
||||
<link rel="stylesheet" type="text/css" href="style.css">
|
||||
<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 />
|
||||
|
||||
<frameset
|
||||
cols="120,*"
|
||||
framespacing="0"
|
||||
frameborder="no">
|
||||
|
||||
<frame
|
||||
id="sections"
|
||||
name="sections"
|
||||
src="sections.html"
|
||||
scrolling="no"
|
||||
marginwidth="0"
|
||||
marginheight="0"
|
||||
noresize />
|
||||
|
||||
<frame
|
||||
id="main"
|
||||
name="main"
|
||||
src="main.html"
|
||||
scrolling="auto"
|
||||
marginwidth="10"
|
||||
marginheight="10"
|
||||
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.
|
||||
</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 />
|
||||
<address>
|
||||
Copyright © 2002-2011
|
||||
<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
|
||||
</address>
|
||||
</body>
|
||||
</noframes>
|
||||
</html>
|
||||
60
public/proguard/docs/license.html
Normal file
@@ -0,0 +1,60 @@
|
||||
<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//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>
|
||||
|
||||
<h2>License</h2>
|
||||
|
||||
<b>ProGuard</b> is free. You can use it freely for processing your
|
||||
applications, commercial or not. Your code obviously remains yours after
|
||||
having been processed, and its license can remain the same.
|
||||
<p>
|
||||
|
||||
<b>ProGuard</b> itself is copyrighted, but its distribution license provides
|
||||
you with some rights for modifying and redistributing its code and its
|
||||
documentation. More specifically, <b>ProGuard</b> is distributed under the
|
||||
terms of the <a href="GPL.html">GNU General Public License</a> (GPL), version
|
||||
2, as published by the <a href="http://www.fsf.org/" target="other">Free
|
||||
Software Foundation</a> (FSF). In short, this means that you may freely
|
||||
redistribute the program, modified or as is, on the condition that you make
|
||||
the complete source code available as well. If you develop a program that is
|
||||
linked with
|
||||
<b>ProGuard</b>, the program as a whole has to be distributed at no charge
|
||||
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.
|
||||
|
||||
<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>
|
||||
<address>
|
||||
Copyright © 2002-2011
|
||||
<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
|
||||
</address>
|
||||
</body>
|
||||
</html>
|
||||
102
public/proguard/docs/main.html
Normal file
@@ -0,0 +1,102 @@
|
||||
<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
|
||||
<meta http-equiv="content-style-type" content="text/css">
|
||||
<meta name="author" content="Eric Lafortune">
|
||||
<meta name="description" content="ProGuard: java shrinker, optimizer, obfuscator, and preverifier">
|
||||
<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>
|
||||
|
||||
<h2>Main</h2>
|
||||
|
||||
<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.
|
||||
</p>
|
||||
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>
|
||||
|
||||
<li>Making programs and libraries harder to reverse-engineer.</li>
|
||||
|
||||
<li>Listing dead code, so it can be removed from the source code.</li>
|
||||
|
||||
<li>Retargeting and preverifying existing class files for Java 6, to take full
|
||||
advantage of Java 6's faster class loading.</li>
|
||||
|
||||
</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
|
||||
powerful configuration style.
|
||||
<p>
|
||||
<b>ProGuard</b> is fast. It only takes seconds to process programs and
|
||||
libraries of several megabytes. The results section presents actual figures
|
||||
for a number of applications.
|
||||
<p>
|
||||
<b>ProGuard</b> is a command-line tool with an optional graphical user
|
||||
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>.
|
||||
</p>
|
||||
The following sections provide more detailed information:
|
||||
<ul>
|
||||
<li><a href="main.html">Main</a>: this overview page.</li>
|
||||
<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>
|
||||
<li><a href="manual/index.html">Manual</a>: the complete <b>ProGuard</b> user
|
||||
manual, with examples and troubleshooting tips.</li>
|
||||
<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>
|
||||
<li><a href="testimonials.html">Testimonials</a>: what users think of
|
||||
<b>ProGuard</b>.</li>
|
||||
<li><a href="license.html">License</a>: <b>ProGuard</b> is free, under a GPL
|
||||
license.</li>
|
||||
<li><a href="downloads.html">Downloads</a>: download the <b>ProGuard</b>
|
||||
package yourself.</li>
|
||||
<li><a href="feedback.html">Feedback</a>: tell me about your experiences, or
|
||||
learn from others on our forums.</li>
|
||||
<li><a href="acknowledgements.html">Acknowledgements</a>: people who have been
|
||||
helpful.</li>
|
||||
<li><a href="alternatives.html">Alternatives</a>: other Java obfuscators,
|
||||
optimizers, and shrinkers.</li>
|
||||
</ul>
|
||||
|
||||
<hr />
|
||||
<noscript><div><a target="_top" href="index.html" class="button">Show menu</a></div></noscript>
|
||||
<address>
|
||||
Copyright © 2002-2011
|
||||
<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
|
||||
</address>
|
||||
</body>
|
||||
</html>
|
||||
634
public/proguard/docs/manual/ant.html
Normal file
@@ -0,0 +1,634 @@
|
||||
<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//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>
|
||||
|
||||
<h2>Ant Task</h2>
|
||||
|
||||
<b>ProGuard</b> can be run as a task in the Java-based build tool Ant (version
|
||||
1.6.0 or higher).
|
||||
<p>
|
||||
|
||||
Before you can use the <code>proguard</code> task, you have to tell Ant about
|
||||
this new task. The easiest way is to add the following line to your
|
||||
<code>build.xml</code> file:
|
||||
<p>
|
||||
|
||||
<pre>
|
||||
<taskdef resource="proguard/ant/task.properties"
|
||||
classpath="/usr/local/java/proguard/lib/proguard.jar" />
|
||||
</pre>
|
||||
<p>
|
||||
|
||||
Please make sure the class path is set correctly for your system.
|
||||
<p>
|
||||
|
||||
There are three ways to configure the ProGuard task: using an external
|
||||
configuration file, using embedded ProGuard configuration options, or using
|
||||
the equivalent XML configuration tags. These three ways can be combined,
|
||||
depending on practical circumstances and personal preference.
|
||||
<p>
|
||||
|
||||
<h3>1. An external ProGuard configuration file</h3>
|
||||
|
||||
The simplest way to use the ProGuard task in an Ant build file is to keep your
|
||||
ProGuard configuration file, and include it from Ant. You can include your
|
||||
ProGuard configuration file by setting
|
||||
the <a href="#configuration_attribute"><code>configuration</code></a>
|
||||
attribute of your
|
||||
<code>proguard</code> task. Your ant build file will then look like this:
|
||||
<p>
|
||||
|
||||
<pre>
|
||||
<taskdef resource="proguard/ant/task.properties"
|
||||
classpath="/usr/local/java/proguard/lib/proguard.jar" />
|
||||
<proguard configuration="myconfigfile.pro"/>
|
||||
</pre>
|
||||
<p>
|
||||
|
||||
This is a convenient option if you prefer ProGuard's configuration style over
|
||||
XML, if you want to keep your build file small, or if you have to share your
|
||||
configuration with developers who don't use Ant.
|
||||
<p>
|
||||
|
||||
<h3>2. Embedded ProGuard configuration options</h3>
|
||||
|
||||
Instead of keeping an external ProGuard configuration file, you can also copy
|
||||
the contents of the file into the nested text of the <code>proguard</code> task
|
||||
(the PCDATA area). Your Ant build file will then look like this:
|
||||
<p>
|
||||
|
||||
<pre>
|
||||
<taskdef resource="proguard/ant/task.properties"
|
||||
classpath="/usr/local/java/proguard/lib/proguard.jar" />
|
||||
<proguard>
|
||||
-libraryjars ${java.home}/lib/rt.jar
|
||||
-injars in.jar
|
||||
-outjars out.jar
|
||||
|
||||
-keepclasseswithmembers public class * {
|
||||
public static void main(java.lang.String[]);
|
||||
}
|
||||
</proguard>
|
||||
</pre>
|
||||
<p>
|
||||
|
||||
Some minor syntactical changes are required in order to conform with the XML
|
||||
standard.
|
||||
<p>
|
||||
|
||||
Firstly, the <code>#</code> character cannot be used for comments in an XML
|
||||
file. Comments must be enclosed by an opening <code><!--</code> and a
|
||||
closing <code>--></code>. All occurrences of the <code>#</code> character
|
||||
can be removed.
|
||||
<p>
|
||||
|
||||
Secondly, the use of <code><</code> and <code>></code> characters would
|
||||
upset the structure of the XML build file. Environment variables are now
|
||||
enclosed by an opening <code>${</code> and a closing <code>}</code>. This
|
||||
syntax also allows you to use Ant properties within the ProGuard
|
||||
configuration. Other occurrences of <code><</code> and <code>></code>
|
||||
have to be encoded as <code>&lt;</code> and <code>&gt;</code>.
|
||||
<p>
|
||||
|
||||
<h3>3. XML configuration tags</h3>
|
||||
|
||||
If you really prefer a full-blown XML configuration, you can replace the
|
||||
ProGuard configuration options by XML configuration tags. The resulting
|
||||
configuration will be equivalent, but much more verbose and difficult to read,
|
||||
as XML goes. The remainder of this page presents the supported tags. For a
|
||||
more extensive discussion of their meaning, please consult the traditional <a
|
||||
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>
|
||||
|
||||
The <code><b><proguard></b></code> task and the
|
||||
<code><b><proguardconfiguration></b></code> task can have the following
|
||||
attributes (only for <code><proguard></code>) and nested
|
||||
elements:
|
||||
|
||||
<dl>
|
||||
|
||||
<dt><a name="configuration_attribute"><code><b>configuration</b></code></a>
|
||||
= "<i>filename</i>"</dt>
|
||||
<dd>Read and merge options from the given ProGuard-style configuration
|
||||
file. Note: for reading XML-style configurations, use the <a
|
||||
href="#configuration_element"><code>configuration</code></a>
|
||||
<i>element</i>.</dd>
|
||||
|
||||
<dt><a href="usage.html#skipnonpubliclibraryclasses"><code><b>skipnonpubliclibraryclasses</b></code></a>
|
||||
= "<i>boolean</i>"
|
||||
(default = false)</dt>
|
||||
<dd>Ignore non-public library classes.</dd>
|
||||
|
||||
<dt><a href="usage.html#dontskipnonpubliclibraryclassmembers"><code><b>skipnonpubliclibraryclassmembers</b></code></a>
|
||||
= "<i>boolean</i>"
|
||||
(default = true)</dt>
|
||||
<dd>Ignore package visible library class members.</dd>
|
||||
|
||||
<dt><a href="usage.html#target"><code><b>target</b></code></a>
|
||||
= "<i>version</i>"
|
||||
(default = none)</dt>
|
||||
<dd>Set the given version number in the processed classes.</dd>
|
||||
|
||||
<dt><a href="usage.html#forceprocessing"><code><b>forceprocessing</b></code></a>
|
||||
= "<i>boolean</i>"
|
||||
(default = false)</dt>
|
||||
<dd>Process the input, even if the output seems up to date.</dd>
|
||||
|
||||
<dt><a href="usage.html#printseeds"><code><b>printseeds</b></code></a>
|
||||
= "<i>boolean or filename</i>"
|
||||
(default = false)</dt>
|
||||
<dd>List classes and class members matched by the various <code>keep</code>
|
||||
commands, to the standard output or to the given file.</dd>
|
||||
|
||||
<dt><a href="usage.html#dontshrink"><code><b>shrink</b></code></a>
|
||||
= "<i>boolean</i>"
|
||||
(default = true)</dt>
|
||||
<dd>Shrink the input class files.</dd>
|
||||
|
||||
<dt><a href="usage.html#printusage"><code><b>printusage</b></code></a>
|
||||
= "<i>boolean or filename</i>"
|
||||
(default = false)</dt>
|
||||
<dd>List dead code of the input class files, to the standard output or to the
|
||||
given file.</dd>
|
||||
|
||||
<dt><a href="usage.html#dontoptimize"><code><b>optimize</b></code></a>
|
||||
= "<i>boolean</i>"
|
||||
(default = true)</dt>
|
||||
<dd>Optimize the input class files.</dd>
|
||||
|
||||
<dt><a href="usage.html#optimizationpasses"><code><b>optimizationpasses</b></code></a>
|
||||
= "<i>n</i>"
|
||||
(default = 1)</dt>
|
||||
<dd>The number of optimization passes to be performed.</dd>
|
||||
|
||||
<dt><a href="usage.html#allowaccessmodification"><code><b>allowaccessmodification</b></code></a>
|
||||
= "<i>boolean</i>"
|
||||
(default = false)</dt>
|
||||
<dd>Allow the access modifiers of classes and class members to be modified,
|
||||
while optimizing.</dd>
|
||||
|
||||
<dt><a href="usage.html#mergeinterfacesaggressively"><code><b>mergeinterfacesaggressively</b></code></a>
|
||||
= "<i>boolean</i>"
|
||||
(default = false)</dt>
|
||||
<dd>Allow any interfaces to be merged, while optimizing.</dd>
|
||||
|
||||
<dt><a href="usage.html#dontobfuscate"><code><b>obfuscate</b></code></a>
|
||||
= "<i>boolean</i>"
|
||||
(default = true)</dt>
|
||||
<dd>Obfuscate the input class files.</dd>
|
||||
|
||||
<dt><a href="usage.html#printmapping"><code><b>printmapping</b></code></a>
|
||||
= "<i>boolean or filename</i>"
|
||||
(default = false)</dt>
|
||||
<dd>Print the mapping from old names to new names for classes and class members
|
||||
that have been renamed, to the standard output or to the given file.</dd>
|
||||
|
||||
<dt><a href="usage.html#applymapping"><code><b>applymapping</b></code></a>
|
||||
= "<i>filename</i>"
|
||||
(default = none)</dt>
|
||||
<dd>Reuse the given mapping, for incremental obfuscation.</dd>
|
||||
|
||||
<dt><a href="usage.html#obfuscationdictionary"><code><b>obfuscationdictionary</b></code></a>
|
||||
= "<i>filename</i>"
|
||||
(default = none)</dt>
|
||||
<dd>Use the words in the given text file as obfuscated field names and method
|
||||
names.</dd>
|
||||
|
||||
<dt><a href="usage.html#classobfuscationdictionary"><code><b>classobfuscationdictionary</b></code></a>
|
||||
= "<i>filename</i>"
|
||||
(default = none)</dt>
|
||||
<dd>Use the words in the given text file as obfuscated class names.</dd>
|
||||
|
||||
<dt><a href="usage.html#packageobfuscationdictionary"><code><b>packageobfuscationdictionary</b></code></a>
|
||||
= "<i>filename</i>"
|
||||
(default = none)</dt>
|
||||
<dd>Use the words in the given text file as obfuscated package names.</dd>
|
||||
|
||||
<dt><a href="usage.html#overloadaggressively"><code><b>overloadaggressively</b></code></a>
|
||||
= "<i>boolean</i>"
|
||||
(default = false)</dt>
|
||||
<dd>Apply aggressive overloading while obfuscating.</dd>
|
||||
|
||||
<dt><a href="usage.html#useuniqueclassmembernames"><code><b>useuniqueclassmembernames</b></code></a>
|
||||
= "<i>boolean</i>"
|
||||
(default = false)</dt>
|
||||
<dd>Ensure uniform obfuscated class member names for subsequent incremental
|
||||
obfuscation.</dd>
|
||||
|
||||
<dt><a href="usage.html#dontusemixedcaseclassnames"><code><b>usemixedcaseclassnames</b></code></a>
|
||||
= "<i>boolean</i>"
|
||||
(default = true)</dt>
|
||||
<dd>Generate mixed-case class names while obfuscating.</dd>
|
||||
|
||||
<dt><a href="usage.html#flattenpackagehierarchy"><code><b>flattenpackagehierarchy</b></code></a>
|
||||
= "<i>package_name</i>"
|
||||
(default = none)</dt>
|
||||
<dd>Repackage all packages that are renamed into the single given parent
|
||||
package.</dd>
|
||||
|
||||
<dt><a href="usage.html#repackageclasses"><code><b>repackageclasses</b></code></a>
|
||||
= "<i>package_name</i>"
|
||||
(default = none)</dt>
|
||||
<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>
|
||||
<dd>Put the given constant string in the <code>SourceFile</code>
|
||||
attributes.</dd>
|
||||
|
||||
<dt><a href="usage.html#dontpreverify"><code><b>preverify</b></code></a>
|
||||
= "<i>boolean</i>"
|
||||
(default = true)</dt>
|
||||
<dd>Preverify the processed class files if they are targeted at Java Micro
|
||||
Edition or at Java 6 or higher.</dd>
|
||||
|
||||
<dt><a href="usage.html#microedition"><code><b>microedition</b></code></a>
|
||||
= "<i>boolean</i>"
|
||||
(default = false)</dt>
|
||||
<dd>Targets the processed class files at Java Micro Edition.</dd>
|
||||
|
||||
<dt><a href="usage.html#verbose"><code><b>verbose</b></code></a>
|
||||
= "<i>boolean</i>"
|
||||
(default = false)</dt>
|
||||
<dd>Write out some more information during processing.</dd>
|
||||
|
||||
<dt><a href="usage.html#dontnote"><code><b>note</b></code></a>
|
||||
= "<i>boolean</i>"
|
||||
(default = true)</dt>
|
||||
<dd>Print notes about potential mistakes or omissions in the configuration.
|
||||
Use the nested element <a href="#dontnote">dontnote</a> for more
|
||||
fine-grained control.</dd>
|
||||
|
||||
<dt><a href="usage.html#dontwarn"><code><b>warn</b></code></a>
|
||||
= "<i>boolean</i>"
|
||||
(default = true)</dt>
|
||||
<dd>Print warnings about unresolved references. Use the nested
|
||||
element <a href="#dontwarn">dontwarn</a> for more fine-grained
|
||||
control. <i>Only use this option if you know what you're doing!</i></dd>
|
||||
|
||||
<dt><a href="usage.html#ignorewarnings"><code><b>ignorewarnings</b></code></a>
|
||||
= "<i>boolean</i>"
|
||||
(default = false)</dt>
|
||||
<dd>Print warnings about unresolved references, but continue processing
|
||||
anyhow. <i>Only use this option if you know what you're doing!</i></dd>
|
||||
|
||||
<dt><a href="usage.html#printconfiguration"><code><b>printconfiguration</b></code></a>
|
||||
= "<i>boolean or filename</i>"
|
||||
(default = false)</dt>
|
||||
<dd>Write out the entire configuration in traditional ProGuard style, to the
|
||||
standard output or to the given file. Useful to replace unreadable
|
||||
XML configurations.</dd>
|
||||
|
||||
<dt><a href="usage.html#dump"><code><b>dump</b></code></a>
|
||||
= "<i>boolean or filename</i>"
|
||||
(default = false)</dt>
|
||||
<dd>Write out the internal structure of the processed class files, to the
|
||||
standard output or to the given file.</dd>
|
||||
|
||||
<dt><a href="usage.html#injars"><code><b><injar</b></code></a>
|
||||
<a href="#classpath"><i>class_path</i></a>
|
||||
<code><b>/></b></code></dt>
|
||||
<dd>Specifies the program jars (or wars, ears, zips, or directories).</dd>
|
||||
|
||||
<dt><a href="usage.html#outjars"><code><b><outjar</b></code></a>
|
||||
<a href="#classpath"><i>class_path</i></a>
|
||||
<code><b>/></b></code></dt>
|
||||
<dd>Specifies the name of the output jars (or wars, ears, zips, or
|
||||
directories).</dd>
|
||||
|
||||
<dt><a href="usage.html#libraryjars"><code><b><libraryjar</b></code></a>
|
||||
<a href="#classpath"><i>class_path</i></a>
|
||||
<code><b>/></b></code></dt>
|
||||
<dd>Specifies the library jars (or wars, ears, zips, or directories).</dd>
|
||||
|
||||
<dt><a href="usage.html#keepdirectories"><code><b><keepdirectory name = </b></code></a>"<i>directory_name</i>"
|
||||
<code><b>/></b></code><br/>
|
||||
<a href="usage.html#keepdirectories"><code><b><keepdirectories filter = </b></code></a>"<a href="usage.html#filefilters"><i>directory_filter</i></a>"
|
||||
<code><b>/></b></code></dt>
|
||||
<dd>Keep the specified directories in the output jars (or wars, ears, zips, or
|
||||
directories).</dd>
|
||||
|
||||
<dt><a href="usage.html#keep"><code><b><keep</b></code></a>
|
||||
<a href="#keepmodifier"><i>modifiers</i></a>
|
||||
<a href="#classspecification"><i>class_specification</i></a>
|
||||
<code><b>></b></code>
|
||||
<a href="#classmemberspecification"><i>class_member_specifications</i></a>
|
||||
<code><b></keep></b></code></dt>
|
||||
<dd>Preserve the specified classes <i>and</i> class members.</dd>
|
||||
|
||||
<dt><a href="usage.html#keepclassmembers"><code><b><keepclassmembers</b></code></a>
|
||||
<a href="#keepmodifier"><i>modifiers</i></a>
|
||||
<a href="#classspecification"><i>class_specification</i></a>
|
||||
<code><b>></b></code>
|
||||
<a href="#classmemberspecification"><i>class_member_specifications</i></a>
|
||||
<code><b></keepclassmembers></b></code></dt>
|
||||
<dd>Preserve the specified class members, if their classes are preserved as
|
||||
well.</dd>
|
||||
|
||||
<dt><a href="usage.html#keepclasseswithmembers"><code><b><keepclasseswithmembers</b></code></a>
|
||||
<a href="#keepmodifier"><i>modifiers</i></a>
|
||||
<a href="#classspecification"><i>class_specification</i></a>
|
||||
<code><b>></b></code>
|
||||
<a href="#classmemberspecification"><i>class_member_specifications</i></a>
|
||||
<code><b></keepclasseswithmembers></b></code></dt>
|
||||
<dd>Preserve the specified classes <i>and</i> class members, if all of the
|
||||
specified class members are present.</dd>
|
||||
|
||||
<dt><a href="usage.html#keepnames"><code><b><keepnames</b></code></a>
|
||||
<a href="#classspecification"><i>class_specification</i></a>
|
||||
<code><b>></b></code>
|
||||
<a href="#classmemberspecification"><i>class_member_specifications</i></a>
|
||||
<code><b></keepnames></b></code></dt>
|
||||
<dd>Preserve the names of the specified classes <i>and</i> class members (if
|
||||
they aren't removed in the shrinking step).</dd>
|
||||
|
||||
<dt><a href="usage.html#keepclassmembernames"><code><b><keepclassmembernames</b></code></a>
|
||||
<a href="#classspecification"><i>class_specification</i></a>
|
||||
<code><b>></b></code>
|
||||
<a href="#classmemberspecification"><i>class_member_specifications</i></a>
|
||||
<code><b></keepclassmembernames></b></code></dt>
|
||||
<dd>Preserve the names of the specified class members (if they aren't removed
|
||||
in the shrinking step).</dd>
|
||||
|
||||
<dt><a href="usage.html#keepclasseswithmembernames"><code><b><keepclasseswithmembernames</b></code></a>
|
||||
<a href="#classspecification"><i>class_specification</i></a>
|
||||
<code><b>></b></code>
|
||||
<a href="#classmemberspecification"><i>class_member_specifications</i></a>
|
||||
<code><b></keepclasseswithmembernames></b></code></dt>
|
||||
<dd>Preserve the names of the specified classes <i>and</i> class members, if
|
||||
all of the specified class members are present (after the shrinking
|
||||
step).</dd>
|
||||
|
||||
<dt><a href="usage.html#whyareyoukeeping"><code><b><whyareyoukeeping</b></code></a>
|
||||
<a href="#classspecification"><i>class_specification</i></a>
|
||||
<code><b>></b></code>
|
||||
<a href="#classmemberspecification"><i>class_member_specifications</i></a>
|
||||
<code><b></whyareyoukeeping></b></code></dt>
|
||||
<dd>Print details on why the given classes and class members are being kept in
|
||||
the shrinking step.</dd>
|
||||
|
||||
<dt><a href="usage.html#assumenosideeffects"><code><b><assumenosideeffects</b></code></a>
|
||||
<a href="#classspecification"><i>class_specification</i></a>
|
||||
<code><b>></b></code>
|
||||
<a href="#classmemberspecification"><i>class_member_specifications</i></a>
|
||||
<code><b></assumenosideeffects></b></code></dt>
|
||||
<dd>Assume that the specified methods don't have any side effects, while
|
||||
optimizing. <i>Only use this option if you know what you're
|
||||
doing!</i></dd>
|
||||
|
||||
<dt><a href="usage.html#optimizations"><code><b><optimization name = </b></code></a>"<a href="optimizations.html"><i>optimization_name</i></a>"
|
||||
<code><b>/></b></code><br/>
|
||||
<a href="usage.html#optimizations"><code><b><optimizations filter = </b></code></a>""<a href="optimizations.html"><i>optimization_filter</i></a>"
|
||||
<code><b>/></b></code></dt>
|
||||
<dd>Perform only the specified optimizations.</dd>
|
||||
|
||||
<dt><a href="usage.html#keeppackagenames"><code><b><keeppackagename name = </b></code></a>"<i>package_name</i>"
|
||||
<code><b>/></b></code><br/>
|
||||
<a href="usage.html#keeppackagenames"><code><b><keeppackagenames filter = </b></code></a>"<a href="usage.html#filters"><i>package_filter</i></a>"
|
||||
<code><b>/></b></code></dt>
|
||||
<dd>Keep the specified package names from being obfuscated. If no name is
|
||||
given, all package names are preserved.</dd>
|
||||
|
||||
<dt><a href="usage.html#keepattributes"><code><b><keepattribute name = </b></code></a>"<i>attribute_name</i>"
|
||||
<code><b>/></b></code><br/>
|
||||
<a href="usage.html#keepattributes"><code><b><keepattributes filter = </b></code></a>"<a href="usage.html#filters"><i>attribute_filter</i></a>"
|
||||
<code><b>/></b></code></dt>
|
||||
<dd>Preserve the specified optional Java bytecode attributes, with optional
|
||||
wildcards. If no name is given, all attributes are preserved.</dd>
|
||||
|
||||
<dt><a href="usage.html#adaptclassstrings"><code><b><adaptclassstrings filter = </b></code></a>"<a href="usage.html#filters"><i>class_filter</i></a>"
|
||||
<code><b>/></b></code></dt>
|
||||
<dd>Adapt string constants in the specified classes, based on the obfuscated
|
||||
names of any corresponding classes.</dd>
|
||||
|
||||
<dt><a href="usage.html#adaptresourcefilenames"><code><b><adaptresourcefilenames filter = </b></code></a>"<a href="usage.html#filefilters"><i>file_filter</i></a>"
|
||||
<code><b>/></b></code></dt>
|
||||
<dd>Rename the specified resource files, based on the obfuscated names of the
|
||||
corresponding class files.</dd>
|
||||
|
||||
<dt><a href="usage.html#adaptresourcefilecontents"><code><b><adaptresourcefilecontents filter = </b></code></a>"<a href="usage.html#filefilters"><i>file_filter</i></a>"
|
||||
<code><b>/></b></code></dt>
|
||||
<dd>Update the contents of the specified resource files, based on the
|
||||
obfuscated names of the processed classes.</dd>
|
||||
|
||||
<dt><a name="dontnote" />
|
||||
<a href="usage.html#dontnote"><code><b><dontnote filter = </b></code></a>"<a href="usage.html#filters"><i>class_filter</i></a>"
|
||||
<code><b>/></b></code></dt>
|
||||
<dd>Don't print notes about classes matching the specified class name
|
||||
filter.</dd>
|
||||
|
||||
<dt><a name="dontwarn" />
|
||||
<a href="usage.html#dontwarn"><code><b><dontwarn filter = </b></code></a>"<a href="usage.html#filters"><i>class_filter</i></a>"
|
||||
<code><b>/></b></code></dt>
|
||||
<dd>Don't print warnings about classes matching the specified class name
|
||||
filter. <i>Only use this option if you know what you're doing!</i></dd>
|
||||
|
||||
<dt><a name="configuration_element"><code><b><configuration refid = </b></code></a>"<i>ref_id</i>"
|
||||
<code><b>/></b></code></dt>
|
||||
<dd>Includes the configuration specified in the
|
||||
<code><proguardconfiguration></code> task (or
|
||||
<code><proguard></code> task) with the attribute <code>id</code> =
|
||||
"<i>ref_id</i>". Note that only the nested elements of this configuration
|
||||
are considered, not the attributes. Also note: for reading ProGuard-style
|
||||
configuration files, use the <a
|
||||
href="#configuration_attribute"><code>configuration</code></a>
|
||||
<i>attribute</i>.</dd>
|
||||
|
||||
</dl>
|
||||
|
||||
<h2><a name="classpath">Class Path Attributes and Nested Elements</a></h2>
|
||||
|
||||
The jar tags are path tags, so they can have any of the path attributes (or
|
||||
nested elements). The most common attributes are:
|
||||
|
||||
<dl>
|
||||
|
||||
<dt><code><b>path</b></code> = "<i>path</i>"</dt>
|
||||
<dd>The names of the jars (or wars, ears, zips, or directories), separated by
|
||||
the path separator.</dd>
|
||||
|
||||
<dt><code><b>location</b></code> = "<i>name</i>" (or <code><b>file</b></code>
|
||||
= "<i>name</i>", or <code><b>dir</b></code> = "<i>name</i>", or
|
||||
<code><b>name</b></code> = "<i>name</i>")</dt>
|
||||
<dd>Alternatively, the name of a single jar (or war, ear, zip, or
|
||||
directory).</dd>
|
||||
|
||||
<dt><code><b>refid</b></code> = "<i>ref_id</i>"</dt>
|
||||
<dd>Alternatively, a reference to the path or file set with the attribute
|
||||
<code>id</code> = "<i>ref_id</i>".</dd>
|
||||
|
||||
</dl>
|
||||
|
||||
In addition, the jar tags can have ProGuard-style filter attributes:
|
||||
|
||||
<dl>
|
||||
|
||||
<dt><code><b>filter</b></code> =
|
||||
"<a href="usage.html#filefilters"><i>file_filter</i></a>"</dt>
|
||||
<dd>An optional filter for all class file names and resource file names that
|
||||
are encountered.</dd>
|
||||
|
||||
<dt><code><b>jarfilter</b></code> =
|
||||
"<a href="usage.html#filefilters"><i>file_filter</i></a>"</dt>
|
||||
<dd>An optional filter for all jar names that are encountered.</dd>
|
||||
|
||||
<dt><code><b>warfilter</b></code> =
|
||||
"<a href="usage.html#filefilters"><i>file_filter</i></a>"</dt>
|
||||
<dd>An optional filter for all war names that are encountered.</dd>
|
||||
|
||||
<dt><code><b>earfilter</b></code> =
|
||||
"<a href="usage.html#filefilters"><i>file_filter</i></a>"</dt>
|
||||
<dd>An optional filter for all ear names that are encountered.</dd>
|
||||
|
||||
<dt><code><b>zipfilter</b></code> =
|
||||
"<a href="usage.html#filefilters"><i>file_filter</i></a>"</dt>
|
||||
<dd>An optional filter for all zip names that are encountered.</dd>
|
||||
|
||||
</dl>
|
||||
|
||||
<h2><a name="keepmodifier">Keep Modifier Attributes</a></h2>
|
||||
|
||||
The keep tags can have the following <i>modifier</i> attributes:
|
||||
|
||||
<dl>
|
||||
|
||||
<dt><a href="usage.html#allowshrinking"><code><b>allowshrinking</b></code></a>
|
||||
= "<i>boolean</i>"
|
||||
(default = false)</dt>
|
||||
<dd>Specifies whether the entry points specified in the keep tag may be
|
||||
shrunk.</dd>
|
||||
|
||||
<dt><a href="usage.html#allowoptimization"><code><b>allowoptimization</b></code></a>
|
||||
= "<i>boolean</i>"
|
||||
(default = false)</dt>
|
||||
<dd>Specifies whether the entry points specified in the keep tag may be
|
||||
optimized.</dd>
|
||||
|
||||
<dt><a href="usage.html#allowobfuscation"><code><b>allowobfuscation</b></code></a>
|
||||
= "<i>boolean</i>"
|
||||
(default = false)</dt>
|
||||
<dd>Specifies whether the entry points specified in the keep tag may be
|
||||
obfuscated.</dd>
|
||||
|
||||
</dl>
|
||||
|
||||
<h2><a name="classspecification">Class Specification Attributes and Nested Elements</a></h2>
|
||||
|
||||
The keep tags can have the following <i>class_specification</i> attributes and
|
||||
<i>class_member_specifications</i> nested elements:
|
||||
|
||||
<dl>
|
||||
|
||||
<dt><code><b>access</b></code> = "<i>access_modifiers</i>"</dt>
|
||||
<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>
|
||||
|
||||
<dt><code><b>name</b></code> = "<i>class_name</i>"</dt>
|
||||
<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>
|
||||
|
||||
<dt><code><b>implements</b></code> = "<i>class_name</i>"</dt>
|
||||
<dd>The optional fully qualified name of the class the specified classes
|
||||
must implement, with optional wildcards.</dd>
|
||||
|
||||
<dt><code><b><field</b></code>
|
||||
<a href="#classmemberspecification"><i>class_member_specification</i></a>
|
||||
<code><b>/></b></code></dt>
|
||||
<dd>Specifies a field.</dd>
|
||||
|
||||
<dt><code><b><method</b></code>
|
||||
<a href="#classmemberspecification"><i>class_member_specification</i></a>
|
||||
<code><b>/></b></code></dt>
|
||||
<dd>Specifies a method.</dd>
|
||||
|
||||
<dt><code><b><constructor</b></code>
|
||||
<a href="#classmemberspecification"><i>class_member_specification</i></a>
|
||||
<code><b>/></b></code></dt>
|
||||
<dd>Specifies a constructor.</dd>
|
||||
|
||||
</dl>
|
||||
|
||||
<h2><a name="classmemberspecification">Class Member Specification Attributes</a></h2>
|
||||
|
||||
The class member tags can have the following <i>class_member_specification</i>
|
||||
attributes:
|
||||
|
||||
<dl>
|
||||
|
||||
<dt><code><b>access</b></code> = "<i>access_modifiers</i>"</dt>
|
||||
<dd>The optional access modifiers of the class. Any space-separated list of
|
||||
"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
|
||||
which the <code>parameters</code> attribute is specified.</dd>
|
||||
|
||||
<dt><code><b>name</b></code> = "<i>name</i>"</dt>
|
||||
<dd>The optional name of the class member, with optional wildcards. Not
|
||||
applicable for constructors.</dd>
|
||||
|
||||
<dt><code><b>parameters</b></code> = "<i>parameters</i>"</dt>
|
||||
<dd>The optional comma-separated list of fully qualified method parameters,
|
||||
with optional wildcards. Not applicable for fields, but required for
|
||||
constructors, and for methods for which the <code>type</code> attribute is
|
||||
specified.</dd>
|
||||
|
||||
</dl>
|
||||
|
||||
<hr />
|
||||
<noscript><div><a target="_top" href="../index.html" class="button">Show menu</a></div></noscript>
|
||||
<address>
|
||||
Copyright © 2002-2011
|
||||
<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
|
||||
</address>
|
||||
</body>
|
||||
</html>
|
||||
BIN
public/proguard/docs/manual/attention.gif
Normal file
|
After Width: | Height: | Size: 896 B |
1504
public/proguard/docs/manual/examples.html
Normal file
479
public/proguard/docs/manual/gui.html
Normal file
@@ -0,0 +1,479 @@
|
||||
<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//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>
|
||||
|
||||
<h2>Graphical User Interface</h2>
|
||||
|
||||
You can find the ProGuard GUI jar in the <code>lib</code> directory of the
|
||||
ProGuard distribution. To run the ProGuard graphical user interface, just type:
|
||||
<p class="code">
|
||||
<code><b>java -jar proguardgui.jar</b> [-nosplash] </code>[<i>configuration_file</i>]
|
||||
</p>
|
||||
The GUI will pop up in a window. With the <code>-nosplash</code> option, you
|
||||
can switch off the short opening animation. If you have specified a ProGuard
|
||||
configuration file, it will be loaded. The GUI works like a wizard. You can
|
||||
edit the configuration and execute ProGuard through a few tabs:
|
||||
<p>
|
||||
|
||||
<table cellspacing="5" cellpadding="5">
|
||||
<tr><td class="button"><a href="#proguard">ProGuard</a></td>
|
||||
<td>Optionally load an existing configuration file.</td></tr>
|
||||
<tr><td class="button"><a href="#inputoutput">Input/Output</a></td>
|
||||
<td>Specify the program jars and library jars.</td></tr>
|
||||
<tr><td class="button"><a href="#shrinking">Shrinking</a></td>
|
||||
<td>Specify the shrinking options.</td></tr>
|
||||
<tr><td class="button"><a href="#obfuscation">Obfuscation</a></td>
|
||||
<td>Specify the obfuscation options.</td></tr>
|
||||
<tr><td class="button"><a href="#optimization">Optimization</a></td>
|
||||
<td>Specify the optimization options.</td></tr>
|
||||
<tr><td class="button"><a href="#information">Information</a></td>
|
||||
<td>Specify some options to get information.</td></tr>
|
||||
<tr><td class="button"><a href="#process">Process</a></td>
|
||||
<td>View and save the resulting configuration, and run ProGuard.</td></tr>
|
||||
</table>
|
||||
<p>
|
||||
|
||||
In addition, there is a tab to execute ReTrace interactively:
|
||||
<p>
|
||||
|
||||
<table cellspacing="5" cellpadding="5">
|
||||
<tr><td class="button"><a href="#retrace">ReTrace</a></td>
|
||||
<td>Set up and run ReTrace, to de-obfuscate stack traces.</td></tr>
|
||||
</table>
|
||||
<p>
|
||||
|
||||
You can freely toggle between the tabs by means of the buttons on the
|
||||
left-hand side of the window, or by means of the <b>Previous</b> and
|
||||
<b>Next</b> buttons at the bottom of the tabs. Tool tips briefly explain the
|
||||
purpose of the numerous options and text fields, although a basic
|
||||
understanding of the shrinking/optimization/obfuscation/preverification
|
||||
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>
|
||||
|
||||
The <i>ProGuard</i> tab presents a welcome message and one important button at
|
||||
the bottom:
|
||||
<p>
|
||||
|
||||
<table cellspacing="5" cellpadding="5">
|
||||
<tr><td class="button">Load configuration...</td>
|
||||
<td>opens a file chooser to load an existing ProGuard configuration
|
||||
file.</td></tr>
|
||||
</table>
|
||||
<p>
|
||||
|
||||
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>
|
||||
|
||||
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
|
||||
wars, ears, zips, or directories).
|
||||
|
||||
<ul>
|
||||
<li>The list of program jars contains input entries and output entries. Input
|
||||
entries contain the class files and resource files to be processed. Output
|
||||
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>
|
||||
|
||||
<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>
|
||||
</ul>
|
||||
<p>
|
||||
|
||||
Each of these lists can be edited by means of a couple of buttons on the
|
||||
right-hand side:
|
||||
<p>
|
||||
|
||||
<table cellspacing="5" cellpadding="5">
|
||||
<tr><td class="button">Add input...</td> <td>opens a file chooser to add an
|
||||
input entry to the list of program jars.</td></tr>
|
||||
<tr><td class="button">Add output...</td> <td>opens a file chooser to add an
|
||||
output entry to the list of program jars.</td></tr>
|
||||
<tr><td class="button">Add...</td>
|
||||
<td>opens a file chooser to add an entry to the list of library
|
||||
jars.</td></tr>
|
||||
<tr><td class="button">Edit...</td>
|
||||
<td>opens a file chooser to edit the selected entry in the list.</td></tr>
|
||||
<tr><td class="button">Filter...</td>
|
||||
<td>opens a text entry field to add or edit the filters of the selected
|
||||
entries in the list.</td></tr>
|
||||
<tr><td class="button">Remove</td>
|
||||
<td>removes the selected entries from the list.</td></tr>
|
||||
<tr><td class="button">Move up</td>
|
||||
<td>moves the selected entries one position up the list.</td></tr>
|
||||
<tr><td class="button">Move down</td>
|
||||
<td>moves the selected entries one position down the list.</td></tr>
|
||||
<tr><td class="button">Move to libraries</td>
|
||||
<td>moves the selected entries in the list of program jars to the list of
|
||||
library jars.</td></tr>
|
||||
<tr><td class="button">Move to program</td>
|
||||
<td>moves the selected entries in the list of library jars to the list of
|
||||
program jars.</td></tr>
|
||||
</table>
|
||||
<p>
|
||||
|
||||
Filters allow to filter files based on their names. One can specify filters
|
||||
for class file names and resource file names, for jar file names, for war file
|
||||
names, for ear file names, and for zip file names. Multiple entries in the
|
||||
program list only make sense when combined with filters; each output file is
|
||||
written to the first entry with a matching filter.
|
||||
<p>
|
||||
|
||||
Input entries that are currently not readable are colored red.
|
||||
<p>
|
||||
|
||||
The order of the entries in each list may matter, as the first occurrence of
|
||||
any duplicate entries gets precedence, just as in conventional class paths.
|
||||
<p>
|
||||
|
||||
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>
|
||||
</ul>
|
||||
<p>
|
||||
|
||||
<h2><a name="shrinking">The Shrinking Tab</a></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
|
||||
class members (fields and methods) that must be protected from shrinking (and
|
||||
implicitly from obfuscation as well).
|
||||
<p>
|
||||
|
||||
The fixed lists contain predefined entries that are typically useful for many
|
||||
applications. Each of these entries can be toggled by means of a check box.
|
||||
The text field following each entry allows to constrain the applicable classes
|
||||
by means of a comma-separated list of wildcarded, fully-qualified class
|
||||
names. The default is "*", which means that all input classes of the
|
||||
corresponding type are considered.
|
||||
<p>
|
||||
|
||||
For example, checking the <b>Applications</b> entry and filling in
|
||||
"myapplications.**" after it would mean: keep all classes that have main
|
||||
methods in the "myapplications" package and all of its subpackages.
|
||||
<p>
|
||||
|
||||
The variable list at the bottom allows to define additional entries
|
||||
yourself. The list can be edited by means of a couple of buttons on the
|
||||
right-hand side:
|
||||
<p>
|
||||
|
||||
<table cellspacing="5" cellpadding="5">
|
||||
<tr><td class="button">Add...</td>
|
||||
<td>opens a window to add a new entry to the list.</td></tr>
|
||||
<tr><td class="button">Edit...</td>
|
||||
<td>opens a window to edit the selected entry in the list.</td></tr>
|
||||
<tr><td class="button">Remove</td>
|
||||
<td>removes the selected entries from the list.</td></tr>
|
||||
<tr><td class="button">Move up</td>
|
||||
<td>moves the selected entries one position up the list.</td></tr>
|
||||
<tr><td class="button">Move down</td>
|
||||
<td>moves the selected entries one position down the list.</td></tr>
|
||||
</table>
|
||||
<p>
|
||||
|
||||
The interface windows allow to specify classes, fields, and methods. They
|
||||
contain text fields and check boxes to constrain these items. They have
|
||||
<b>Ok</b> and <b>Cancel</b> buttons to apply or to cancel the operation.
|
||||
<p>
|
||||
|
||||
For example, your application may be creating some classes dynamically using
|
||||
<code>Class.forName</code>. You should then specify them here, so they are kept
|
||||
by their original names. Press the <b>Add...</b> button to open the class
|
||||
window. Fill out the fully-qualified class name in the <b>Code</b> text field,
|
||||
and press the <b>Ok</b> button. Repeat this for all required classes. Wildcards
|
||||
can be helpful to specify a large number of related classes in one go. If you
|
||||
want to specify all implementations of a certain interface, fill out the
|
||||
fully qualified interface name in the <b>Extends/implements class</b> instead.
|
||||
<p>
|
||||
|
||||
For more advanced settings, it is advisable to become familiar with ProGuard's
|
||||
configuration options through the <a href="usage.html">Usage section</a> and
|
||||
the <a href="examples.html">Examples section</a>. We'll suffice with a brief
|
||||
overview of the three dialogs provided by the GUI.
|
||||
<p>
|
||||
|
||||
The <i>keep class</i> dialog appears when adding or editing new special keep
|
||||
entries. It has text fields and selections for specifying and constraining
|
||||
classes and class members to keep. The <b>Advanced options</b> / <b>Basic
|
||||
options</b> button at the bottom of the dialog allows to toggle showing the
|
||||
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>
|
||||
|
||||
<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>
|
||||
|
||||
<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>
|
||||
|
||||
<li>The <b>Access</b> selections allows to specify constraints on the class or
|
||||
classes, based on their access modifiers.</li>
|
||||
|
||||
<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>
|
||||
|
||||
<li>The <b>Class</b> text field takes the fully-qualified name of the class or
|
||||
classes. The class name can contain wildcards.</li>
|
||||
|
||||
<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>
|
||||
|
||||
<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>
|
||||
|
||||
<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>
|
||||
</ul>
|
||||
<p>
|
||||
|
||||
The <i>keep field</i> dialog appears when adding or editing fields within the
|
||||
above dialog. It has text fields and selections for specifying and
|
||||
constraining fields to keep. Again, the <b>Advanced options</b> / <b>Basic
|
||||
options</b> button at the bottom of the dialog allows to toggle showing the
|
||||
advanced options.
|
||||
|
||||
<ul>
|
||||
<li>The <b>Access</b> selections allows to specify constraints on the field or
|
||||
fields, based on their access modifiers.</li>
|
||||
|
||||
<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>
|
||||
|
||||
<li>The <b>Return type</b> text field takes the fully-qualified type of the
|
||||
field or fields. The type can contain wildcards.</li>
|
||||
|
||||
<li>The <b>Name</b> text field takes the name of the field or fields. The field
|
||||
name can contain wildcards.</li>
|
||||
</ul>
|
||||
<p>
|
||||
|
||||
Similarly, the <i>keep method</i> dialog appears when adding or editing
|
||||
methods within the keep class dialog. It has text fields and selections for
|
||||
specifying and constraining methods to keep. Again, the <b>Advanced
|
||||
options</b> / <b>Basic options</b> button at the bottom of the dialog allows
|
||||
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>
|
||||
|
||||
<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>
|
||||
|
||||
<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>Name</b> text field takes the name of the method or methods. The
|
||||
method name can contain wildcards.</li>
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</ul>
|
||||
<p>
|
||||
|
||||
<h2><a name="obfuscation">The Obfuscation Tab</a></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
|
||||
class members (fields and methods) that must be protected from obfuscation
|
||||
(but not necessarily from shrinking).
|
||||
<p>
|
||||
|
||||
The lists are manipulated in the same way as in the <a
|
||||
href="#shrinking">Shrinking Tab</a>.
|
||||
<p>
|
||||
|
||||
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>
|
||||
</ul>
|
||||
<p>
|
||||
|
||||
<h2><a name="optimization">The Optimization Tab</a></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
|
||||
method calls that can be removed if ProGuard can determine that their results
|
||||
are not being used.
|
||||
<p>
|
||||
|
||||
The lists are manipulated in much the same way as in the <a
|
||||
href="#shrinking">Shrinking Tab</a>.
|
||||
<p>
|
||||
|
||||
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>
|
||||
</ul>
|
||||
<p>
|
||||
|
||||
<h2><a name="information">The Information Tab</a></h2>
|
||||
|
||||
The <i>Information</i> tab presents a number of options for preverification
|
||||
and targeting, and for the information that ProGuard returns when processing
|
||||
your code. The bottom list allows you to query ProGuard about why given
|
||||
classes and class members are being kept in the shrinking step.
|
||||
<p>
|
||||
|
||||
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>
|
||||
</ul>
|
||||
<p>
|
||||
|
||||
<h2><a name="process">The Process Tab</a></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
|
||||
bottom:
|
||||
<p>
|
||||
|
||||
<table cellspacing="5" cellpadding="5">
|
||||
<tr><td class="button">View configuration</td>
|
||||
<td>displays the current ProGuard configuration in the console.</td></tr>
|
||||
<tr><td class="button">Save configuration...</td>
|
||||
<td>opens a file chooser to save the current ProGuard
|
||||
configuration.</td></tr>
|
||||
<tr><td class="button">Process!</td>
|
||||
<td>executes ProGuard with the current configuration.</td></tr>
|
||||
</table>
|
||||
<p>
|
||||
|
||||
<h2><a name="retrace">The ReTrace Tab</a></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
|
||||
stack trace:
|
||||
|
||||
<ul>
|
||||
<li>The <b>Verbose</b> check box in the settings panel allows to toggle between
|
||||
normal mode and verbose mode.</li>
|
||||
|
||||
<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>
|
||||
|
||||
<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>
|
||||
</ul>
|
||||
|
||||
There are two buttons at the bottom:
|
||||
<p>
|
||||
|
||||
<table cellspacing="5" cellpadding="5">
|
||||
<tr><td class="button">Load stack trace...</td>
|
||||
<td>opens a file chooser to load an obfuscated stack trace.</td></tr>
|
||||
<tr><td class="button">ReTrace!</td>
|
||||
<td>executes ReTrace with the current settings.</td></tr>
|
||||
</table>
|
||||
|
||||
<hr />
|
||||
<noscript><div><a target="_top" href="../index.html" class="button">Show menu</a></div></noscript>
|
||||
<address>
|
||||
Copyright © 2002-2011
|
||||
<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
|
||||
</address>
|
||||
</body>
|
||||
</html>
|
||||
51
public/proguard/docs/manual/index.html
Normal file
@@ -0,0 +1,51 @@
|
||||
<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//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>
|
||||
</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>
|
||||
</ol>
|
||||
|
||||
<hr />
|
||||
<noscript><div><a target="_top" href="../index.html" class="button">Show menu</a></div></noscript>
|
||||
<address>
|
||||
Copyright © 2002-2011
|
||||
<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
|
||||
</address>
|
||||
</body>
|
||||
</html>
|
||||
173
public/proguard/docs/manual/introduction.html
Normal file
@@ -0,0 +1,173 @@
|
||||
<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//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>
|
||||
|
||||
<h2>Introduction</h2>
|
||||
|
||||
<b>ProGuard</b> is a Java class file shrinker, optimizer, obfuscator, and
|
||||
preverifier. The shrinking step detects and removes unused classes, fields,
|
||||
methods, and attributes. The optimization step analyzes and optimizes the
|
||||
bytecode of the methods. The obfuscation step renames the remaining classes,
|
||||
fields, and methods using short meaningless names. These first steps make the
|
||||
code base smaller, more efficient, and harder to reverse-engineer. The final
|
||||
preverification step adds preverification information to the classes, which is
|
||||
required for Java Micro Edition or which improves the start-up time for Java
|
||||
6.
|
||||
<p>
|
||||
Each of these steps is optional. For instance, ProGuard can also be used to
|
||||
just list dead code in an application, or to preverify class files for
|
||||
efficient use in Java 6.
|
||||
<p>
|
||||
|
||||
<table class="diagram" align="center">
|
||||
|
||||
<tr>
|
||||
<td rowspan="4" class="lightblock">Input jars</td>
|
||||
<td colspan="8" class="transparentblock"></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td rowspan="2" class="transparentblock"></td>
|
||||
<td rowspan="3" class="lightblock">Shrunk code</td>
|
||||
<td colspan="6" class="transparentblock"></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td class="transparentblock"></td>
|
||||
<td rowspan="2" class="lightblock">Optim. code</td>
|
||||
<td colspan="3" class="transparentblock"></td>
|
||||
<td rowspan="2" class="lightblock">Output jars</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td class="transparentblock">- shrink →</td>
|
||||
<td class="transparentblock">- optimize →</td>
|
||||
<td class="transparentblock">- obfuscate →</td>
|
||||
<td class="lightblock">Obfusc. code</td>
|
||||
<td class="transparentblock">- preverify →</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td class="darkblock">Library jars</td>
|
||||
<td colspan="7" class="transparentblock">------------------------------- (unchanged) -------------------------------→</td>
|
||||
<td class="darkblock">Library jars</td>
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
<p>
|
||||
|
||||
ProGuard typically reads the <b>input jars</b> (or wars, ears, zips, or
|
||||
directories). It then shrinks, optimizes, obfuscates, and preverifies them.
|
||||
Optionally, multiple optimization passes can be performed, each typically
|
||||
followed by another shrinking step. ProGuard writes the processed results to
|
||||
one or more <b>output jars</b> (or wars, ears, zips, or directories). The
|
||||
input may contain resource files, whose names and contents can optionally be
|
||||
updated to reflect the obfuscated class names.
|
||||
<p>
|
||||
ProGuard requires the <b>library jars</b> (or wars, ears, zips, or
|
||||
directories) of the input jars to be specified. These are essentially the
|
||||
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>
|
||||
|
||||
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,
|
||||
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>
|
||||
|
||||
<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>
|
||||
|
||||
<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>
|
||||
|
||||
<li>The <b>preverification step</b> is the only step that doesn't have to know
|
||||
the entry points.</li>
|
||||
</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.
|
||||
<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>
|
||||
</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.
|
||||
<p>
|
||||
Furthermore, ProGuard will offer some suggestions if keeping some classes or
|
||||
class members appears necessary. For example, ProGuard will note constructs
|
||||
like "<code>(SomeClass)Class.forName(variable).newInstance()</code>". These
|
||||
might be an indication that the class or interface <code>SomeClass</code>
|
||||
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
|
||||
may require trial and error, especially without the necessary information
|
||||
about the internals of the code.
|
||||
|
||||
<hr />
|
||||
<noscript><div><a target="_top" href="../index.html" class="button">Show menu</a></div></noscript>
|
||||
<address>
|
||||
Copyright © 2002-2011
|
||||
<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
|
||||
</address>
|
||||
</body>
|
||||
</html>
|
||||
69
public/proguard/docs/manual/limitations.html
Normal file
@@ -0,0 +1,69 @@
|
||||
<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//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>
|
||||
|
||||
<h2>Limitations</h2>
|
||||
|
||||
When using ProGuard, you should be aware of a few technical issues, all of
|
||||
which are easily avoided or resolved:
|
||||
<p>
|
||||
<ul class="spacious">
|
||||
|
||||
<li>For best results, ProGuard's optimization algorithms assume that the
|
||||
processed code never <b>intentionally throws NullPointerExceptions</b> or
|
||||
ArrayIndexOutOfBoundsExceptions, or even OutOfMemoryErrors or
|
||||
StackOverflowErrors, in order to achieve something useful. For instance,
|
||||
it may remove a method call <code>myObject.myMethod()</code> if that call
|
||||
wouldn't have any effect. It ignores the possibility that
|
||||
<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>
|
||||
|
||||
<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>
|
||||
|
||||
<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>
|
||||
|
||||
</ul>
|
||||
|
||||
<hr />
|
||||
<noscript><div><a target="_top" href="../index.html" class="button">Show menu</a></div></noscript>
|
||||
<address>
|
||||
Copyright © 2002-2011
|
||||
<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
|
||||
</address>
|
||||
</body>
|
||||
</html>
|
||||
172
public/proguard/docs/manual/optimizations.html
Normal file
@@ -0,0 +1,172 @@
|
||||
<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//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>
|
||||
|
||||
<h2>Optimizations</h2>
|
||||
|
||||
The optimization step of ProGuard can be switched off with the
|
||||
<a href="usage.html#dontoptimize"><code>-dontoptimize</code></a> option. For
|
||||
more fine-grained control over individual optimizations, experts can use the
|
||||
<a href="usage.html#optimizations"><code>-optimizations</code></a> option,
|
||||
with a filter based on the optimization names listed below. The filter works
|
||||
like any <a href="usage.html#filters">filter</a> in ProGuard.
|
||||
<p>
|
||||
|
||||
The following wildcards are supported:
|
||||
|
||||
<table cellspacing="10">
|
||||
<tr><td valign="top"><code><b>?</b></code></td>
|
||||
<td>matches any single character in an optimization name.</td></tr>
|
||||
<tr><td valign="top"><code><b>*</b></code></td>
|
||||
<td>matches any part of an optimization name.</td></tr>
|
||||
</table>
|
||||
|
||||
An optimization that is preceded by an exclamation mark '<b>!</b>' is
|
||||
<i>excluded</i> from further attempts to match with <i>subsequent</i>
|
||||
optimization names in the filter. Make sure to specify filters correctly,
|
||||
since they are not checked for potential typos.
|
||||
<p>
|
||||
|
||||
For example,
|
||||
"<code>code/simplification/variable,code/simplification/arithmetic</code>"
|
||||
only performs the two specified peephole optimizations.
|
||||
<p>
|
||||
|
||||
For example, "<code>!method/propagation/*</code>" performs all optimizations,
|
||||
except the ones that propagate values between methods.
|
||||
<p>
|
||||
|
||||
For example,
|
||||
"<code>!code/simplification/advanced,code/simplification/*</code>" only
|
||||
performs all peephole optimizations.
|
||||
<p>
|
||||
Some optimizations necessarily imply other optimizations. These are then
|
||||
indicated. Note that the list is likely to change over time, as optimizations
|
||||
are added and reorganized.
|
||||
<p>
|
||||
|
||||
<dl>
|
||||
<dt><code><b>class/marking/final</b></code></dt>
|
||||
<dd>Marks classes as final, whenever possible.</dd>
|
||||
|
||||
<dt><code><b>class/merging/vertical</b></code></dt>
|
||||
<dd>Merges classes vertically in the class hierarchy, whenever possible.</dd>
|
||||
|
||||
<dt><code><b>class/merging/horizontal</b></code></dt>
|
||||
<dd>Merges classes horizontally in the class hierarchy, whenever possible.</dd>
|
||||
|
||||
<dt><div>(⇒ <code>code/removal/advanced</code>)</div>
|
||||
<code><b>field/removal/writeonly</b></code></dt>
|
||||
<dd>Removes write-only fields.</dd>
|
||||
|
||||
<dt><code><b>field/marking/private</b></code></dt>
|
||||
<dd>Marks fields as private, whenever possible.</dd>
|
||||
|
||||
<dt><div>(⇒ <code>code/simplification/advanced</code>)</div>
|
||||
<code><b>field/propagation/value</b></code></dt>
|
||||
<dd>Propagates the values of fields across methods.</dd>
|
||||
|
||||
<dt><code><b>method/marking/private</b></code></dt>
|
||||
<dd>Marks methods as private, whenever possible (<i>devirtualization</i>).</dd>
|
||||
|
||||
<dt><div>(⇒ <code>code/removal/advanced</code>)</div>
|
||||
<code><b>method/marking/static</b></code></dt>
|
||||
<dd>Marks methods as static, whenever possible (<i>devirtualization</i>).</dd>
|
||||
|
||||
<dt><code><b>method/marking/final</b></code></dt>
|
||||
<dd>Marks methods as final, whenever possible.</dd>
|
||||
|
||||
<dt><div>(⇒ <code>code/removal/advanced</code>)</div>
|
||||
<code><b>method/removal/parameter</b></code></dt>
|
||||
<dd>Removes unused method parameters.</dd>
|
||||
|
||||
<dt><div>(⇒ <code>code/simplification/advanced</code>)</div>
|
||||
<code><b>method/propagation/parameter</b></code></dt>
|
||||
<dd>Propagates the values of method parameters from method invocations to
|
||||
the invoked methods.</dd>
|
||||
|
||||
<dt><div>(⇒ <code>code/simplification/advanced</code>)</div>
|
||||
<code><b>method/propagation/returnvalue</b></code></dt>
|
||||
<dd>Propagates the values of method return values from methods to their
|
||||
invocations.</dd>
|
||||
|
||||
<dt><code><b>method/inlining/short</b></code></dt>
|
||||
<dd>Inlines short methods.</dd>
|
||||
|
||||
<dt><code><b>method/inlining/unique</b></code></dt>
|
||||
<dd>Inlines methods that are only called once.</dd>
|
||||
|
||||
<dt><code><b>method/inlining/tailrecursion</b></code></dt>
|
||||
<dd>Simplifies tail recursion calls, whenever possible.</dd>
|
||||
|
||||
<dt><code><b>code/merging</b></code></dt>
|
||||
<dd>Merges identical blocks of code by modifying branch targets.</dd>
|
||||
|
||||
<dt><code><b>code/simplification/variable</b></code></dt>
|
||||
<dd>Performs peephole optimizations for variable loading and storing.</dd>
|
||||
|
||||
<dt><code><b>code/simplification/arithmetic</b></code></dt>
|
||||
<dd>Performs peephole optimizations for arithmetic instructions.</dd>
|
||||
|
||||
<dt><code><b>code/simplification/cast</b></code></dt>
|
||||
<dd>Performs peephole optimizations for casting operations.</dd>
|
||||
|
||||
<dt><code><b>code/simplification/field</b></code></dt>
|
||||
<dd>Performs peephole optimizations for field loading and storing.</dd>
|
||||
|
||||
<dt><div>(⇒ <code>code/removal/simple</code>)</div>
|
||||
<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
|
||||
analysis.</dd>
|
||||
|
||||
<dt><div>(⇒ <code>code/removal/exception</code>)</div>
|
||||
<code><b>code/removal/advanced</b></code></dt>
|
||||
<dd>Removes dead code based on control flow analysis and data flow
|
||||
analysis.</dd>
|
||||
|
||||
<dt><div>(⇒ <code>code/removal/exception</code>)</div>
|
||||
<code><b>code/removal/simple</b></code></dt>
|
||||
<dd>Removes dead code based on a simple control flow analysis.</dd>
|
||||
|
||||
<dt><code><b>code/removal/variable</b></code></dt>
|
||||
<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>
|
||||
|
||||
<dt><code><b>code/allocation/variable</b></code></dt>
|
||||
<dd>Optimizes variable allocation on the local variable frame.</dd>
|
||||
</dl>
|
||||
|
||||
<hr />
|
||||
<noscript><div><a target="_top" href="../index.html" class="button">Show menu</a></div></noscript>
|
||||
<address>
|
||||
Copyright © 2002-2011
|
||||
<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
|
||||
</address>
|
||||
</body>
|
||||
</html>
|
||||
486
public/proguard/docs/manual/refcard.html
Normal file
@@ -0,0 +1,486 @@
|
||||
<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//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>
|
||||
|
||||
<h1>ProGuard Reference Card</h1>
|
||||
|
||||
<h2>Usage</h2>
|
||||
|
||||
<code><b>java -jar proguard.jar </b></code><i>options</i> ...
|
||||
<p>
|
||||
Typically:
|
||||
<p>
|
||||
<code><b>java -jar proguard.jar @myconfig.pro</b></code>
|
||||
<p>
|
||||
|
||||
<h2>Options</h2>
|
||||
|
||||
<table cellspacing="10">
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#at"><code><b>@</b></code></a><a href="usage.html#filename"><i>filename</i></a></td>
|
||||
|
||||
<td>Short for '<code>-include</code> <i>filename</i>'.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#include"><code><b>-include</b></code></a>
|
||||
<a href="usage.html#filename"><i>filename</i></a></td>
|
||||
|
||||
<td>Read configuration options from the given file.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#basedirectory"><code><b>-basedirectory</b></code></a>
|
||||
<a href="usage.html#filename"><i>directoryname</i></a></td>
|
||||
|
||||
<td>Specifies the base directory for subsequent relative file names.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#injars"><code><b>-injars</b></code></a>
|
||||
<a href="usage.html#classpath"><i>class_path</i></a></td>
|
||||
<td>Specifies the program jars (or wars, ears, zips, or directories).</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#outjars"><code><b>-outjars</b></code></a>
|
||||
<a href="usage.html#classpath"><i>class_path</i></a></td>
|
||||
<td>Specifies the name of the output jars (or wars, ears, zips, or
|
||||
directories).</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#libraryjars"><code><b>-libraryjars</b></code></a>
|
||||
<a href="usage.html#classpath"><i>class_path</i></a></td>
|
||||
<td>Specifies the library jars (or wars, ears, zips, or directories).</td>
|
||||
</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>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#dontskipnonpubliclibraryclassmembers"><code><b>-dontskipnonpubliclibraryclassmembers</b></code></a></td>
|
||||
<td>Don't ignore package visible library class members.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#keepdirectories"><code><b>-keepdirectories</b></code></a>
|
||||
[<a href="usage.html#filters"><i>directory_filter</i></a>]</td>
|
||||
<td>Keep the specified directories in the output jars (or wars, ears, zips, or
|
||||
directories).</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#target"><code><b>-target</b></code></a>
|
||||
<i>version</i></td>
|
||||
<td>Set the given version number in the processed classes.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#forceprocessing"><code><b>-forceprocessing</b></code></a></td>
|
||||
<td>Process the input, even if the output seems up to date.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#keep"><code><b>-keep</b></code></a>
|
||||
[<a href="usage.html#keepoptionmodifiers">,<i>modifier</i></a>,...]
|
||||
<a href="usage.html#classspecification"><i>class_specification</i></a></td>
|
||||
<td>Preserve the specified classes <i>and</i> class members.</td>
|
||||
|
||||
</tr>
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#keepclassmembers"><code><b>-keepclassmembers</b></code></a>
|
||||
[<a href="usage.html#keepoptionmodifiers">,<i>modifier</i></a>,...]
|
||||
<a href="usage.html#classspecification"><i>class_specification</i></a></td>
|
||||
<td>Preserve the specified class members, if their classes are preserved as
|
||||
well.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#keepclasseswithmembers"><code><b>-keepclasseswithmembers</b></code></a>
|
||||
[<a href="usage.html#keepoptionmodifiers">,<i>modifier</i></a>,...]
|
||||
<a href="usage.html#classspecification"><i>class_specification</i></a></td>
|
||||
<td>Preserve the specified classes <i>and</i> class members, if all of the
|
||||
specified class members are present.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#keepnames"><code><b>-keepnames</b></code></a>
|
||||
<a href="usage.html#classspecification"><i>class_specification</i></a></td>
|
||||
<td>Preserve the names of the specified classes <i>and</i> class members (if
|
||||
they aren't removed in the shrinking step).</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#keepclassmembernames"><code><b>-keepclassmembernames</b></code></a>
|
||||
<a href="usage.html#classspecification"><i>class_specification</i></a></td>
|
||||
<td>Preserve the names of the specified class members (if they aren't removed
|
||||
in the shrinking step).</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#keepclasseswithmembernames"><code><b>-keepclasseswithmembernames</b></code></a>
|
||||
<a href="usage.html#classspecification"><i>class_specification</i></a></td>
|
||||
<td>Preserve the names of the specified classes <i>and</i> class members, if
|
||||
all of the specified class members are present (after the shrinking
|
||||
step).</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#printseeds"><code><b>-printseeds</b></code></a>
|
||||
[<a href="usage.html#filename"><i>filename</i></a>]</td>
|
||||
<td>List classes and class members matched by the various <code>-keep</code>
|
||||
options, to the standard output or to the given file.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#dontshrink"><code><b>-dontshrink</b></code></a></td>
|
||||
<td>Don't shrink the input class files.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#printusage"><code><b>-printusage</b></code></a>
|
||||
[<a href="usage.html#filename"><i>filename</i></a>]</td>
|
||||
<td>List dead code of the input class files, to the standard output or to the
|
||||
given file.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#whyareyoukeeping"><code><b>-whyareyoukeeping</b></code></a>
|
||||
<a href="usage.html#classspecification"><i>class_specification</i></a></td>
|
||||
<td>Print details on why the given classes and class members are being kept in
|
||||
the shrinking step.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#dontoptimize"><code><b>-dontoptimize</b></code></a></td>
|
||||
<td>Don't optimize the input class files.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#optimizations"><code><b>-optimizations</b></code></a>
|
||||
<a href="optimizations.html"><i>optimization_filter</i></a></td>
|
||||
<td>The optimizations to be enabled and disabled.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#optimizationpasses"><code><b>-optimizationpasses</b></code></a>
|
||||
<i>n</i></td>
|
||||
<td>The number of optimization passes to be performed.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#assumenosideeffects"><code><b>-assumenosideeffects</b></code></a>
|
||||
<a href="usage.html#classspecification"><i>class_specification</i></a></td>
|
||||
<td>Assume that the specified methods don't have any side effects, while
|
||||
optimizing.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#allowaccessmodification"><code><b>-allowaccessmodification</b></code></a></td>
|
||||
<td>Allow the access modifiers of classes and class members to be modified,
|
||||
while optimizing.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#mergeinterfacesaggressively"><code><b>-mergeinterfacesaggressively</b></code></a></td>
|
||||
<td>Allow any interfaces to be merged, while optimizing.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#dontobfuscate"><code><b>-dontobfuscate</b></code></a></td>
|
||||
<td>Don't obfuscate the input class files.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#printmapping"><code><b>-printmapping</b></code></a>
|
||||
[<a href="usage.html#filename"><i>filename</i></a>]</td>
|
||||
<td>Print the mapping from old names to new names for classes and class members
|
||||
that have been renamed, to the standard output or to the given file.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#applymapping"><code><b>-applymapping</b></code></a>
|
||||
<a href="usage.html#filename"><i>filename</i></a></td>
|
||||
<td>Reuse the given mapping, for incremental obfuscation.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#obfuscationdictionary"><code><b>-obfuscationdictionary</b></code></a>
|
||||
<a href="usage.html#filename"><i>filename</i></a></td>
|
||||
<td>Use the words in the given text file as obfuscated field names and method names.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#classobfuscationdictionary"><code><b>-classobfuscationdictionary</b></code></a>
|
||||
<a href="usage.html#filename"><i>filename</i></a></td>
|
||||
<td>Use the words in the given text file as obfuscated class names.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#packageobfuscationdictionary"><code><b>-packageobfuscationdictionary</b></code></a>
|
||||
<a href="usage.html#filename"><i>filename</i></a></td>
|
||||
<td>Use the words in the given text file as obfuscated package names.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#overloadaggressively"><code><b>-overloadaggressively</b></code></a></td>
|
||||
<td>Apply aggressive overloading while obfuscating.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#useuniqueclassmembernames"><code><b>-useuniqueclassmembernames</b></code></a></td>
|
||||
<td>Ensure uniform obfuscated class member names for subsequent incremental
|
||||
obfuscation.</td> </tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#dontusemixedcaseclassnames"><code><b>-dontusemixedcaseclassnames</b></code></a></td>
|
||||
<td>Don't generate mixed-case class names while obfuscating.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#keeppackagenames"><code><b>-keeppackagenames</b></code></a>
|
||||
[<i><a href="usage.html#filters">package_filter</a></i>]</td>
|
||||
<td>Keep the specified package names from being obfuscated.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#flattenpackagehierarchy"><code><b>-flattenpackagehierarchy</b></code></a>
|
||||
[<i>package_name</i>]</td>
|
||||
<td>Repackage all packages that are renamed into the single given parent
|
||||
package.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#repackageclasses"><code><b>-repackageclasses</b></code></a>
|
||||
[<i>package_name</i>]</td>
|
||||
<td>Repackage all class files that are renamed into the single given
|
||||
package.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#keepattributes"><code><b>-keepattributes</b></code></a>
|
||||
[<i><a href="usage.html#filters">attribute_filter</a></i>]</td>
|
||||
<td>Preserve the given optional attributes; typically
|
||||
<code>Exceptions</code>, <code>InnerClasses</code>,
|
||||
<code>Signature</code>, <code>Deprecated</code>,
|
||||
<code>SourceFile</code>, <code>SourceDir</code>,
|
||||
<code>LineNumberTable</code>,
|
||||
<code>LocalVariableTable</code>, <code>LocalVariableTypeTable</code>,
|
||||
<code>Synthetic</code>, <code>EnclosingMethod</code>, and
|
||||
<code>*Annotation*</code>.</td>
|
||||
</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>
|
||||
attributes.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#adaptclassstrings"><code><b>-adaptclassstrings</b></code></a>
|
||||
[<a href="usage.html#filters"><i>class_filter</i></a>]</td>
|
||||
<td>Adapt string constants in the specified classes, based on the obfuscated
|
||||
names of any corresponding classes.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#adaptresourcefilenames"><code><b>-adaptresourcefilenames</b></code></a>
|
||||
[<a href="usage.html#filefilters"><i>file_filter</i></a>]</td>
|
||||
<td>Rename the specified resource files, based on the obfuscated names of the
|
||||
corresponding class files.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#adaptresourcefilecontents"><code><b>-adaptresourcefilecontents</b></code></a>
|
||||
[<a href="usage.html#filefilters"><i>file_filter</i></a>]</td>
|
||||
<td>Update the contents of the specified resource files, based on the
|
||||
obfuscated names of the processed classes.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#dontpreverify"><code><b>-dontpreverify</b></code></a></td>
|
||||
<td>Don't preverify the processed class files.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#microedition"><code><b>-microedition</b></code></a></td>
|
||||
<td>Target the processed class files at Java Micro Edition.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#verbose"><code><b>-verbose</b></code></a></td>
|
||||
<td>Write out some more information during processing.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#dontnote"><code><b>-dontnote</b></code></a>
|
||||
[<a href="usage.html#filters"><i>class_filter</i></a>]</td>
|
||||
<td>Don't print notes about potential mistakes or omissions in the
|
||||
configuration.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#dontwarn"><code><b>-dontwarn</b></code></a>
|
||||
[<a href="usage.html#filters"><i>class_filter</i></a>]</td>
|
||||
<td>Don't warn about unresolved references at all.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#ignorewarnings"><code><b>-ignorewarnings</b></code></a></td>
|
||||
<td>Print warnings about unresolved references, but continue processing
|
||||
anyhow.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#printconfiguration"><code><b>-printconfiguration</b></code></a>
|
||||
[<a href="usage.html#filename"><i>filename</i></a>]</td>
|
||||
<td>Write out the internal structure of the processed class files, to the
|
||||
standard output or to the given file.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#dump"><code><b>-dump</b></code></a>
|
||||
[<a href="usage.html#filename"><i>filename</i></a>]</td>
|
||||
<td>Write out the entire configuration in traditional ProGuard style, to the
|
||||
standard output or to the given file.</td>
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
<p>
|
||||
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>
|
||||
<li><i>filename</i> can contain Java system properties delimited by
|
||||
'<b><</b>' and '<b>></b>'.</li>
|
||||
<li>If <i>filename</i> contains special characters, the entire name
|
||||
should be quoted with single or double quotes.</li>
|
||||
</ul>
|
||||
<p>
|
||||
|
||||
<h2>Overview of <code>Keep</code> Options</h2>
|
||||
|
||||
<table cellpadding="5">
|
||||
|
||||
<tr>
|
||||
<th>Keep</th>
|
||||
<td>From being removed or renamed</td>
|
||||
<td>From being renamed</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Classes and class members</td>
|
||||
<td bgcolor="#E0E0E0"><a href="usage.html#keep"><code>-keep</code></a></td>
|
||||
<td bgcolor="#E0E0E0"><a href="usage.html#keepnames"><code>-keepnames</code></a></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Class members only</td>
|
||||
<td bgcolor="#E0E0E0"><a href="usage.html#keepclassmembers"><code>-keepclassmembers</code></a></td>
|
||||
<td bgcolor="#E0E0E0"><a href="usage.html#keepclassmembernames"><code>-keepclassmembernames</code></a></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Classes and class members, if class members present</td>
|
||||
<td bgcolor="#E0E0E0"><a href="usage.html#keepclasseswithmembers"><code>-keepclasseswithmembers</code></a></td>
|
||||
<td bgcolor="#E0E0E0"><a href="usage.html#keepclasseswithmembernames"><code>-keepclasseswithmembernames</code></a></td>
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
<p>
|
||||
|
||||
<h2>Keep Option Modifiers</h2>
|
||||
|
||||
<table cellspacing="10">
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#allowshrinking"><code><b>allowshrinking</b></code></a></td>
|
||||
<td>The entry points specified in the keep tag may be shrunk.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#allowoptimization"><code><b>allowoptimization</b></code></a></td>
|
||||
<td>The entry points specified in the keep tag may be optimized.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top"><a href="usage.html#allowobfuscation"><code><b>allowobfuscation</b></code></a></td>
|
||||
<td>The entry points specified in the keep tag may be obfuscated.</td>
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
<p>
|
||||
|
||||
<h2>Class Specifications</h2>
|
||||
|
||||
<pre>
|
||||
[<b>@</b><i>annotationtype</i>] [[<b>!</b>]<b>public</b>|<b>final</b>|<b>abstract</b> ...] [<b>!</b>]<b>interface</b>|<b>class</b> <i>classname</i>
|
||||
[<b>extends</b>|<b>implements</b> [<b>@</b><i>annotationtype</i>] <i>classname</i>]
|
||||
[<b>{</b>
|
||||
[<b>@</b><i>annotationtype</i>] [[<b>!</b>]<b>public</b>|<b>private</b>|<b>protected</b>|<b>static</b>|<b>volatile</b>|<b>transient</b> ...] <b><fields></b> |
|
||||
(<i>fieldtype fieldname</i>)<b>;</b>
|
||||
[<b>@</b><i>annotationtype</i>] [[<b>!</b>]<b>public</b>|<b>private</b>|<b>protected</b>|<b>static</b>|<b>synchronized</b>|<b>native</b>|<b>abstract</b>|<b>strictfp</b> ...] <b><methods></b> |
|
||||
<b><init>(</b><i>argumenttype,...</i><b>)</b> |
|
||||
<i>classname</i><b>(</b><i>argumenttype,...</i><b>)</b> |
|
||||
(<i>returntype methodname</i><b>(</b><i>argumenttype,...</i><b>)</b>)<b>;</b>
|
||||
[<b>@</b><i>annotationtype</i>] [[<b>!</b>]<b>public</b>|<b>private</b>|<b>protected</b>|<b>static</b> ... ] <b>*;</b>
|
||||
...
|
||||
<b>}</b>]
|
||||
</pre>
|
||||
<p>
|
||||
Notes:
|
||||
<ul>
|
||||
<li>Class names must always be fully qualified, i.e. including their package
|
||||
names.</li>
|
||||
<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>
|
||||
<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>
|
||||
</ul>
|
||||
|
||||
<hr />
|
||||
<noscript><div><a target="_top" href="../index.html" class="button">Show menu</a></div></noscript>
|
||||
<address>
|
||||
Copyright © 2002-2011
|
||||
<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
|
||||
</address>
|
||||
</body>
|
||||
</html>
|
||||
345
public/proguard/docs/manual/retrace/examples.html
Normal file
@@ -0,0 +1,345 @@
|
||||
<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//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>
|
||||
|
||||
<h2>Examples</h2>
|
||||
|
||||
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>
|
||||
</ol>
|
||||
|
||||
<h3><a name="with">Restoring a stack trace with line numbers</a></h3>
|
||||
|
||||
Assume for instance ProGuard itself has been obfuscated using the following
|
||||
extra options:
|
||||
<pre>
|
||||
-printmapping proguard.map
|
||||
|
||||
-renamesourcefileattribute ProGuard
|
||||
-keepattributes SourceFile,LineNumberTable
|
||||
</pre>
|
||||
<p>
|
||||
|
||||
Now assume the processed application throws an exception, and we have saved the
|
||||
stack trace in <code>proguard.trace</code>, shown below. Of course, in real
|
||||
life ProGuard rarely throws exceptions, so this is a purposely generated
|
||||
exception. :)
|
||||
|
||||
<pre>
|
||||
Exception in thread "main" java.lang.Error: Random exception
|
||||
at pro.bY.a(ProGuard:576)
|
||||
at pro.bO.a(ProGuard:431)
|
||||
at pro.bj.a(ProGuard:145)
|
||||
at pro.bY.a(ProGuard:522)
|
||||
at pro.bj.a(ProGuard:129)
|
||||
at pro.bN.a(ProGuard:125)
|
||||
at pro.bY.a(ProGuard:251)
|
||||
at pro.bY.a(ProGuard:229)
|
||||
at pro.l.a(ProGuard:55)
|
||||
at pro.bo.b(ProGuard:405)
|
||||
at pro.ci.a(ProGuard:51)
|
||||
at pro.bo.a(ProGuard:356)
|
||||
at pro.be.a(ProGuard:109)
|
||||
at pro.bo.a(ProGuard:356)
|
||||
at pro.be.a(ProGuard:186)
|
||||
at pro.bg.a(ProGuard:369)
|
||||
at pro.bY.a(ProGuard:286)
|
||||
at pro.bh.a(ProGuard:55)
|
||||
at pro.bg.b(ProGuard:408)
|
||||
at pro.bY.a(ProGuard:190)
|
||||
at pro.bg.a(ProGuard:369)
|
||||
at pro.M.a(ProGuard:110)
|
||||
at pro.bY.a(ProGuard:449)
|
||||
at pro.M.a(ProGuard:99)
|
||||
at pro.bo.a(ProGuard:372)
|
||||
at pro.bY.a(ProGuard:649)
|
||||
at pro.bY.a(ProGuard:112)
|
||||
at pro.P.a(ProGuard:66)
|
||||
at pro.p.a(ProGuard:83)
|
||||
at pro.bU.a(ProGuard:69)
|
||||
at pro.bo.a(ProGuard:356)
|
||||
at pro.J.a(ProGuard:149)
|
||||
at pro.I.a(ProGuard:49)
|
||||
at pro.J.a(ProGuard:105)
|
||||
at pro.cf.c(ProGuard:370)
|
||||
at pro.cf.a(ProGuard:317)
|
||||
at pro.bc.a(ProGuard:55)
|
||||
at proguard.ProGuard.a(ProGuard:363)
|
||||
at proguard.ProGuard.c(ProGuard:187)
|
||||
at proguard.ProGuard.b(ProGuard:385)
|
||||
at proguard.ProGuard.main(ProGuard:429)
|
||||
</pre>
|
||||
<p>
|
||||
|
||||
We can then use the following command to recover the stack trace:
|
||||
<pre>
|
||||
<b>java -jar retrace.jar proguard.map proguard.trace</b>
|
||||
</pre>
|
||||
<p>
|
||||
|
||||
The output will look as follows:
|
||||
<pre>
|
||||
Exception in thread "main" java.lang.Error: Random exception
|
||||
at proguard.shrink.UsageMarker.visitInstruction(ProGuard:576)
|
||||
at proguard.classfile.instruction.GenericInstruction.accept(ProGuard:431)
|
||||
at proguard.classfile.CodeAttrInfo.instructionsAccept(ProGuard:145)
|
||||
at proguard.shrink.UsageMarker.visitCodeAttrInfo(ProGuard:522)
|
||||
at proguard.classfile.CodeAttrInfo.accept(ProGuard:129)
|
||||
at proguard.classfile.ProgramMemberInfo.attributesAccept(ProGuard:125)
|
||||
at proguard.shrink.UsageMarker.visitMemberInfo(ProGuard:251)
|
||||
at proguard.shrink.UsageMarker.visitProgramMethodInfo(ProGuard:229)
|
||||
at proguard.classfile.ProgramMethodInfo.accept(ProGuard:55)
|
||||
at proguard.classfile.ProgramClassFile.methodAccept(ProGuard:405)
|
||||
at proguard.classfile.visitor.NamedMethodVisitor.visitProgramClassFile(ProGuard:51)
|
||||
at proguard.classfile.ProgramClassFile.accept(ProGuard:356)
|
||||
at proguard.classfile.visitor.ClassFileUpDownTraveler.visitProgramClassFile(ProGuard:109)
|
||||
at proguard.classfile.ProgramClassFile.accept(ProGuard:356)
|
||||
at proguard.classfile.visitor.ClassFileUpDownTraveler.visitLibraryClassFile(ProGuard:186)
|
||||
at proguard.classfile.LibraryClassFile.accept(ProGuard:369)
|
||||
at proguard.shrink.UsageMarker.visitLibraryMethodInfo(ProGuard:286)
|
||||
at proguard.classfile.LibraryMethodInfo.accept(ProGuard:55)
|
||||
at proguard.classfile.LibraryClassFile.methodsAccept(ProGuard:408)
|
||||
at proguard.shrink.UsageMarker.visitLibraryClassFile(ProGuard:190)
|
||||
at proguard.classfile.LibraryClassFile.accept(ProGuard:369)
|
||||
at proguard.classfile.ClassCpInfo.referencedClassAccept(ProGuard:110)
|
||||
at proguard.shrink.UsageMarker.visitClassCpInfo(ProGuard:449)
|
||||
at proguard.classfile.ClassCpInfo.accept(ProGuard:99)
|
||||
at proguard.classfile.ProgramClassFile.constantPoolEntryAccept(ProGuard:372)
|
||||
at proguard.shrink.UsageMarker.markCpEntry(ProGuard:649)
|
||||
at proguard.shrink.UsageMarker.visitProgramClassFile(ProGuard:112)
|
||||
at proguard.classfile.visitor.VariableClassFileVisitor.visitProgramClassFile(ProGuard:66)
|
||||
at proguard.classfile.visitor.MultiClassFileVisitor.visitProgramClassFile(ProGuard:83)
|
||||
at proguard.classfile.visitor.FilteredClassFileVisitor.visitProgramClassFile(ProGuard:69)
|
||||
at proguard.classfile.ProgramClassFile.accept(ProGuard:356)
|
||||
at proguard.classfile.ClassPool.classFileAccept(ProGuard:149)
|
||||
at proguard.classfile.visitor.NamedClassFileVisitor.visitClassPool(ProGuard:49)
|
||||
at proguard.classfile.ClassPool.accept(ProGuard:105)
|
||||
at proguard.KeepCommand.executeShrinkingPhase(ProGuard:370)
|
||||
at proguard.KeepCommand.execute(ProGuard:317)
|
||||
at proguard.CompoundCommand.execute(ProGuard:55)
|
||||
at proguard.ProGuard.executeCommands(ProGuard:363)
|
||||
at proguard.ProGuard.shrink(ProGuard:187)
|
||||
at proguard.ProGuard.execute(ProGuard:385)
|
||||
at proguard.ProGuard.main(ProGuard:429)
|
||||
</pre>
|
||||
|
||||
<h3><a name="withverbose">Restoring a stack trace with line numbers (verbose)</a></h3>
|
||||
|
||||
In the previous example, we could also use the verbose flag:
|
||||
<pre>
|
||||
<b>java -jar retrace.jar -verbose proguard.map proguard.trace</b>
|
||||
</pre>
|
||||
<p>
|
||||
|
||||
The output will then look as follows:
|
||||
<pre>
|
||||
Exception in thread "main" java.lang.Error: Random exception
|
||||
at proguard.shrink.UsageMarker.void visitInstruction(proguard.classfile.ClassFile,proguard.classfile.instruction.Instruction)(ProGuard:576)
|
||||
at proguard.classfile.instruction.GenericInstruction.void accept(proguard.classfile.ClassFile,proguard.classfile.instruction.InstructionVisitor)(ProGuard:431)
|
||||
at proguard.classfile.CodeAttrInfo.void instructionsAccept(proguard.classfile.ClassFile,proguard.classfile.instruction.InstructionVisitor)(ProGuard:145)
|
||||
at proguard.shrink.UsageMarker.void visitCodeAttrInfo(proguard.classfile.ClassFile,proguard.classfile.CodeAttrInfo)(ProGuard:522)
|
||||
at proguard.classfile.CodeAttrInfo.void accept(proguard.classfile.ClassFile,proguard.classfile.visitor.AttrInfoVisitor)(ProGuard:129)
|
||||
at proguard.classfile.ProgramMemberInfo.void attributesAccept(proguard.classfile.ProgramClassFile,proguard.classfile.visitor.AttrInfoVisitor)(ProGuard:125)
|
||||
at proguard.shrink.UsageMarker.void visitMemberInfo(proguard.classfile.ProgramClassFile,proguard.classfile.ProgramMemberInfo)(ProGuard:251)
|
||||
at proguard.shrink.UsageMarker.void visitProgramMethodInfo(proguard.classfile.ProgramClassFile,proguard.classfile.ProgramMethodInfo)(ProGuard:229)
|
||||
at proguard.classfile.ProgramMethodInfo.void accept(proguard.classfile.ProgramClassFile,proguard.classfile.visitor.MemberInfoVisitor)(ProGuard:55)
|
||||
at proguard.classfile.ProgramClassFile.void methodAccept(proguard.classfile.visitor.MemberInfoVisitor,java.lang.String,java.lang.String)(ProGuard:405)
|
||||
at proguard.classfile.visitor.NamedMethodVisitor.void visitProgramClassFile(proguard.classfile.ProgramClassFile)(ProGuard:51)
|
||||
at proguard.classfile.ProgramClassFile.void accept(proguard.classfile.visitor.ClassFileVisitor)(ProGuard:356)
|
||||
at proguard.classfile.visitor.ClassFileUpDownTraveler.void visitProgramClassFile(proguard.classfile.ProgramClassFile)(ProGuard:109)
|
||||
at proguard.classfile.ProgramClassFile.void accept(proguard.classfile.visitor.ClassFileVisitor)(ProGuard:356)
|
||||
at proguard.classfile.visitor.ClassFileUpDownTraveler.void visitLibraryClassFile(proguard.classfile.LibraryClassFile)(ProGuard:186)
|
||||
at proguard.classfile.LibraryClassFile.void accept(proguard.classfile.visitor.ClassFileVisitor)(ProGuard:369)
|
||||
at proguard.shrink.UsageMarker.void visitLibraryMethodInfo(proguard.classfile.LibraryClassFile,proguard.classfile.LibraryMethodInfo)(ProGuard:286)
|
||||
at proguard.classfile.LibraryMethodInfo.void accept(proguard.classfile.LibraryClassFile,proguard.classfile.visitor.MemberInfoVisitor)(ProGuard:55)
|
||||
at proguard.classfile.LibraryClassFile.void methodsAccept(proguard.classfile.visitor.MemberInfoVisitor)(ProGuard:408)
|
||||
at proguard.shrink.UsageMarker.void visitLibraryClassFile(proguard.classfile.LibraryClassFile)(ProGuard:190)
|
||||
at proguard.classfile.LibraryClassFile.void accept(proguard.classfile.visitor.ClassFileVisitor)(ProGuard:369)
|
||||
at proguard.classfile.ClassCpInfo.void referencedClassAccept(proguard.classfile.visitor.ClassFileVisitor)(ProGuard:110)
|
||||
at proguard.shrink.UsageMarker.void visitClassCpInfo(proguard.classfile.ClassFile,proguard.classfile.ClassCpInfo)(ProGuard:449)
|
||||
at proguard.classfile.ClassCpInfo.void accept(proguard.classfile.ClassFile,proguard.classfile.visitor.CpInfoVisitor)(ProGuard:99)
|
||||
at proguard.classfile.ProgramClassFile.void constantPoolEntryAccept(proguard.classfile.visitor.CpInfoVisitor,int)(ProGuard:372)
|
||||
at proguard.shrink.UsageMarker.void markCpEntry(proguard.classfile.ClassFile,int)(ProGuard:649)
|
||||
at proguard.shrink.UsageMarker.void visitProgramClassFile(proguard.classfile.ProgramClassFile)(ProGuard:112)
|
||||
at proguard.classfile.visitor.VariableClassFileVisitor.void visitProgramClassFile(proguard.classfile.ProgramClassFile)(ProGuard:66)
|
||||
at proguard.classfile.visitor.MultiClassFileVisitor.void visitProgramClassFile(proguard.classfile.ProgramClassFile)(ProGuard:83)
|
||||
at proguard.classfile.visitor.FilteredClassFileVisitor.void visitProgramClassFile(proguard.classfile.ProgramClassFile)(ProGuard:69)
|
||||
at proguard.classfile.ProgramClassFile.void accept(proguard.classfile.visitor.ClassFileVisitor)(ProGuard:356)
|
||||
at proguard.classfile.ClassPool.void classFileAccept(proguard.classfile.visitor.ClassFileVisitor,java.lang.String)(ProGuard:149)
|
||||
at proguard.classfile.visitor.NamedClassFileVisitor.void visitClassPool(proguard.classfile.ClassPool)(ProGuard:49)
|
||||
at proguard.classfile.ClassPool.void accept(proguard.classfile.visitor.ClassPoolVisitor)(ProGuard:105)
|
||||
at proguard.KeepCommand.void executeShrinkingPhase(proguard.classfile.ClassPool,proguard.classfile.ClassPool)(ProGuard:370)
|
||||
at proguard.KeepCommand.void execute(int,proguard.classfile.ClassPool,proguard.classfile.ClassPool)(ProGuard:317)
|
||||
at proguard.CompoundCommand.void execute(int,proguard.classfile.ClassPool,proguard.classfile.ClassPool)(ProGuard:55)
|
||||
at proguard.ProGuard.void executeCommands(int)(ProGuard:363)
|
||||
at proguard.ProGuard.void shrink()(ProGuard:187)
|
||||
at proguard.ProGuard.void execute(java.lang.String[])(ProGuard:385)
|
||||
at proguard.ProGuard.void main(java.lang.String[])(ProGuard:429)
|
||||
</pre>
|
||||
|
||||
|
||||
<h3><a name="without">Restoring a stack trace without line numbers</a></h3>
|
||||
|
||||
Assume for instance ProGuard itself has been obfuscated using the following
|
||||
extra options, this time without preserving the line number tables:
|
||||
<pre>
|
||||
-printmapping proguard.map
|
||||
</pre>
|
||||
<p>
|
||||
|
||||
A stack trace <code>proguard.trace</code> will then lack line number
|
||||
information:
|
||||
<pre>
|
||||
Exception in thread "main" java.lang.Error: Random exception
|
||||
at pro.bY.a(Unknown Source)
|
||||
at pro.bO.a(Unknown Source)
|
||||
at pro.bj.a(Unknown Source)
|
||||
at pro.bY.a(Unknown Source)
|
||||
at pro.bj.a(Unknown Source)
|
||||
at pro.bN.a(Unknown Source)
|
||||
at pro.bY.a(Unknown Source)
|
||||
at pro.bY.a(Unknown Source)
|
||||
at pro.l.a(Unknown Source)
|
||||
at pro.bo.b(Unknown Source)
|
||||
at pro.ci.a(Unknown Source)
|
||||
at pro.bo.a(Unknown Source)
|
||||
at pro.be.a(Unknown Source)
|
||||
at pro.bo.a(Unknown Source)
|
||||
at pro.be.a(Unknown Source)
|
||||
at pro.bg.a(Unknown Source)
|
||||
at pro.bY.a(Unknown Source)
|
||||
at pro.bh.a(Unknown Source)
|
||||
at pro.bg.b(Unknown Source)
|
||||
at pro.bY.a(Unknown Source)
|
||||
at pro.bg.a(Unknown Source)
|
||||
at pro.M.a(Unknown Source)
|
||||
at pro.bY.a(Unknown Source)
|
||||
at pro.M.a(Unknown Source)
|
||||
at pro.bo.a(Unknown Source)
|
||||
at pro.bY.a(Unknown Source)
|
||||
at pro.bY.a(Unknown Source)
|
||||
at pro.P.a(Unknown Source)
|
||||
at pro.p.a(Unknown Source)
|
||||
at pro.bU.a(Unknown Source)
|
||||
at pro.bo.a(Unknown Source)
|
||||
at pro.J.a(Unknown Source)
|
||||
at pro.I.a(Unknown Source)
|
||||
at pro.J.a(Unknown Source)
|
||||
at pro.cf.c(Unknown Source)
|
||||
at pro.cf.a(Unknown Source)
|
||||
at pro.bc.a(Unknown Source)
|
||||
at proguard.ProGuard.a(Unknown Source)
|
||||
at proguard.ProGuard.c(Unknown Source)
|
||||
at proguard.ProGuard.b(Unknown Source)
|
||||
at proguard.ProGuard.main(Unknown Source)
|
||||
</pre>
|
||||
<p>
|
||||
|
||||
We can still use the same command to recover the stack trace:
|
||||
<pre>
|
||||
<b>java -jar retrace.jar proguard.map proguard.trace</b>
|
||||
</pre>
|
||||
<p>
|
||||
|
||||
The output will now give a list of alternative original method names for each
|
||||
ambiguous obfuscated method name:
|
||||
<pre>
|
||||
Exception in thread "main" java.lang.Error: Random exception
|
||||
at proguard.shrink.UsageMarker.visitProgramClassFile(Unknown Source)
|
||||
visitLibraryClassFile
|
||||
visitProgramFieldInfo
|
||||
visitProgramMethodInfo
|
||||
visitMemberInfo
|
||||
visitLibraryFieldInfo
|
||||
visitLibraryMethodInfo
|
||||
visitIntegerCpInfo
|
||||
visitLongCpInfo
|
||||
visitFloatCpInfo
|
||||
visitDoubleCpInfo
|
||||
visitStringCpInfo
|
||||
visitUtf8CpInfo
|
||||
visitFieldrefCpInfo
|
||||
visitInterfaceMethodrefCpInfo
|
||||
visitMethodrefCpInfo
|
||||
visitClassCpInfo
|
||||
visitNameAndTypeCpInfo
|
||||
visitUnknownAttrInfo
|
||||
visitInnerClassesAttrInfo
|
||||
visitConstantValueAttrInfo
|
||||
visitExceptionsAttrInfo
|
||||
visitCodeAttrInfo
|
||||
visitLineNumberTableAttrInfo
|
||||
visitLocalVariableTableAttrInfo
|
||||
visitSourceFileAttrInfo
|
||||
visitDeprecatedAttrInfo
|
||||
visitSyntheticAttrInfo
|
||||
visitInstruction
|
||||
visitCpInstruction
|
||||
visitExceptionInfo
|
||||
visitInnerClassesInfo
|
||||
visitLocalVariableInfo
|
||||
markCpEntry
|
||||
markAsUnused
|
||||
isUsed
|
||||
at proguard.classfile.instruction.GenericInstruction.create(Unknown Source)
|
||||
isWide
|
||||
getLength
|
||||
accept
|
||||
at proguard.classfile.CodeAttrInfo.getAttribute(Unknown Source)
|
||||
getAttrInfoLength
|
||||
readInfo
|
||||
accept
|
||||
instructionsAccept
|
||||
exceptionsAccept
|
||||
[...]
|
||||
at proguard.KeepCommand.executeShrinkingPhase(Unknown Source)
|
||||
access$100
|
||||
at proguard.KeepCommand.keepField(Unknown Source)
|
||||
ensureMultiClassFileVisitorForMembers
|
||||
execute
|
||||
executeObfuscationPhase
|
||||
access$002
|
||||
access$000
|
||||
access$102
|
||||
access$108
|
||||
at proguard.CompoundCommand.addCommand(Unknown Source)
|
||||
execute
|
||||
at proguard.ProGuard.readCommands(Unknown Source)
|
||||
obfuscate
|
||||
executeCommands
|
||||
at proguard.ProGuard.shrink(Unknown Source)
|
||||
at proguard.ProGuard.check(Unknown Source)
|
||||
execute
|
||||
at proguard.ProGuard.main(Unknown Source)
|
||||
</pre>
|
||||
|
||||
<hr />
|
||||
<noscript><div><a target="_top" href="../../index.html" class="button">Show menu</a></div></noscript>
|
||||
<address>
|
||||
Copyright © 2002-2011
|
||||
<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
|
||||
</address>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
37
public/proguard/docs/manual/retrace/index.html
Normal file
@@ -0,0 +1,37 @@
|
||||
<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//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>
|
||||
</ol>
|
||||
|
||||
<hr />
|
||||
<noscript><div><a target="_top" href="../../index.html" class="button">Show menu</a></div></noscript>
|
||||
<address>
|
||||
Copyright © 2002-2011
|
||||
<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
|
||||
</address>
|
||||
</body>
|
||||
</html>
|
||||
79
public/proguard/docs/manual/retrace/introduction.html
Normal file
@@ -0,0 +1,79 @@
|
||||
<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//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>
|
||||
|
||||
<h2>Introduction</h2>
|
||||
|
||||
<b>ReTrace</b> is a companion tool for <b>ProGuard</b> that 'de-obfuscates'
|
||||
stack traces.
|
||||
<p>
|
||||
When an obfuscated program throws an exception, the resulting stack trace
|
||||
typically isn't very informative. Class names and method names have been
|
||||
replaced by short meaningless strings. Source file names and line numbers are
|
||||
missing altogether. While this may be intentional, it can also be inconvenient
|
||||
when debugging problems.
|
||||
<p>
|
||||
|
||||
<table class="diagram" align="center">
|
||||
|
||||
<tr>
|
||||
<td rowspan="1" class="lightblock">Original code</td>
|
||||
<td class="transparentblock">- <b>ProGuard</b> →</td>
|
||||
<td rowspan="1" class="lightblock">Obfuscated code</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td rowspan="3" class="transparentblock"></td>
|
||||
<td class="transparentblock">↓</td>
|
||||
<td class="transparentblock">↓</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td class="whiteblock">Mapping file</td>
|
||||
<td class="transparentblock">↓</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td class="transparentblock">↓</td>
|
||||
<td class="transparentblock">↓</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td class="whiteblock">Readable stack trace</td>
|
||||
<td class="transparentblock">← <b>ReTrace</b> -</td>
|
||||
<td class="whiteblock">Obfuscated stack trace</td>
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
<p>
|
||||
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.
|
||||
|
||||
<hr />
|
||||
<noscript><div><a target="_top" href="../../index.html" class="button">Show menu</a></div></noscript>
|
||||
<address>
|
||||
Copyright © 2002-2011
|
||||
<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
|
||||
</address>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
127
public/proguard/docs/manual/retrace/usage.html
Normal file
@@ -0,0 +1,127 @@
|
||||
<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//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>
|
||||
|
||||
<h2>Usage</h2>
|
||||
|
||||
You can find the ReTrace jar in the <code>lib</code> directory of the
|
||||
ProGuard distribution. To run ReTrace, just type:
|
||||
<p>
|
||||
<p class="code">
|
||||
<code><b>java -jar retrace.jar </b></code>[<i>options...</i>]
|
||||
<i>mapping_file</i> [<i>stacktrace_file</i>]
|
||||
</p>
|
||||
These are the arguments:
|
||||
|
||||
<dl>
|
||||
<dt><i>mapping_file</i></dt>
|
||||
|
||||
<dd>Specifies the name of the mapping file, produced by ProGuard with the
|
||||
option
|
||||
"<a href="../usage.html#printmapping"><code>-printmapping</code></a> <i>mapping_file</i>",
|
||||
while obfuscating the application that produced the stack trace.</dd>
|
||||
|
||||
<dt><i>stacktrace_file</i></dt>
|
||||
|
||||
<dd>Optionally specifies the name of the file containing the stack trace. If
|
||||
no file is specified, a stack trace is read from the standard input. Blank
|
||||
lines and unrecognized lines are ignored, as far as possible.</dd>
|
||||
</dl>
|
||||
|
||||
The following options are supported:
|
||||
<dl>
|
||||
<dt><code><b>-verbose</b></code></dt>
|
||||
|
||||
<dd>Specifies to print out more informative stack traces that include not only
|
||||
method names, but also method return types and arguments.</dd>
|
||||
|
||||
<dt><code><b>-regex</b></code> <i>regular_expression</i></dt>
|
||||
|
||||
<dd>Specifies the regular expression that is used to parse the lines in the
|
||||
stack trace. Specifying a different regular expression allows to
|
||||
de-obfuscate more general types of input than just stack traces. The
|
||||
default is suitable for stack traces produced by most JVMs:
|
||||
<pre>
|
||||
(?:\s*%c:.*)|(?:\s*at\s+%c.%m\s*\(.*?(?::%l)?\)\s*)
|
||||
</pre>
|
||||
The regular expression is a Java regular expression (cfr. the documentation
|
||||
of <code>java.util.regex.Pattern</code>), with a few additional wildcards:
|
||||
<table cellspacing="10">
|
||||
<tr><td valign="top"><code><b>%c</b></code></td>
|
||||
<td>matches a class name (e.g.
|
||||
"<code>myapplication.MyClass</code>").</td></tr>
|
||||
<tr><td valign="top"><code><b>%C</b></code></td>
|
||||
<td>matches a class name with slashes (e.g.
|
||||
"<code>myapplication/MyClass</code>").</td></tr>
|
||||
<tr><td valign="top"><code><b>%t</b></code></td>
|
||||
<td>matches a field type or method return type (e.g.
|
||||
"<code>myapplication.MyClass[]</code>").</td></tr>
|
||||
<tr><td valign="top"><code><b>%f</b></code></td>
|
||||
<td>matches a field name (e.g.
|
||||
"<code>myField</code>").</td></tr>
|
||||
<tr><td valign="top"><code><b>%m</b></code></td>
|
||||
<td>matches a method name (e.g.
|
||||
"<code>myMethod</code>").</td></tr>
|
||||
<tr><td valign="top"><code><b>%a</b></code></td>
|
||||
<td>matches a list of method arguments (e.g.
|
||||
"<code>boolean,int</code>").</td></tr>
|
||||
<tr><td valign="top"><code><b>%l</b></code></td>
|
||||
<td>matches a line number inside a method (e.g.
|
||||
"<code>123</code>").</td></tr>
|
||||
</table>
|
||||
Elements that match these wildcards are de-obfuscated, when possible. Note
|
||||
that regular expressions must not contain any capturing groups. Use
|
||||
non-capturing groups instead: <code>(?:</code>...<code>)</code>
|
||||
</dd>
|
||||
</dl>
|
||||
|
||||
The restored stack trace is printed to the standard output. The completeness
|
||||
of the restored stack trace depends on the presence of line number tables in
|
||||
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>
|
||||
|
||||
<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>
|
||||
|
||||
</ul>
|
||||
<p>
|
||||
|
||||
Preserving line number tables is explained in detail in this <a
|
||||
href="../examples.html#stacktrace">example</a> in the ProGuard User Manual.
|
||||
<p>
|
||||
|
||||
Unobfuscated elements and obfuscated elements for which no mapping is available
|
||||
will be left unchanged.
|
||||
|
||||
<hr />
|
||||
<noscript><div><a target="_top" href="../../index.html" class="button">Show menu</a></div></noscript>
|
||||
<address>
|
||||
Copyright © 2002-2011
|
||||
<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
|
||||
</address>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
60
public/proguard/docs/manual/sections.html
Normal file
@@ -0,0 +1,60 @@
|
||||
<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
|
||||
<meta http-equiv="content-script-type" content="text/javascript">
|
||||
<meta http-equiv="content-style-type" content="text/css">
|
||||
<link rel="stylesheet" type="text/css" href="../style.css">
|
||||
<title>Sections</title>
|
||||
</head>
|
||||
<body class="navigation">
|
||||
|
||||
<ul class="navigation">
|
||||
<li><a href="../sections.html"><< Main menu</a></li>
|
||||
|
||||
<li class="title">ProGuard Manual</li>
|
||||
<li><a target="main" href="introduction.html">Introduction</a></li>
|
||||
<li><a target="main" href="usage.html">Usage</a></li>
|
||||
<li><a target="main" href="limitations.html">Limitations</a></li>
|
||||
<li><a target="main" href="examples.html">Examples</a></li>
|
||||
<li><a target="main" href="troubleshooting.html">Troubleshooting</a></li>
|
||||
<li><a target="main" href="refcard.html">Ref Card</a></li>
|
||||
<li><a target="main" href="gui.html">GUI</a></li>
|
||||
<li><a target="main" href="ant.html">Ant Task</a></li>
|
||||
<li><a target="main" href="wtk.html">JME WTK</a></li>
|
||||
|
||||
<li class="title">ReTrace Manual</li>
|
||||
<li><a target="main" href="retrace/introduction.html">Introduction</a></li>
|
||||
<li><a target="main" href="retrace/usage.html">Usage</a></li>
|
||||
<li><a target="main" href="retrace/examples.html">Examples</a></li>
|
||||
</ul>
|
||||
|
||||
<p>
|
||||
<center>
|
||||
<small>With support of</small>
|
||||
<p>
|
||||
|
||||
<a href="http://sourceforge.net/projects/proguard/" target="other">
|
||||
|
||||
<script type="text/javascript" language="JavaScript">
|
||||
<!--
|
||||
document.write("<img src=\"");
|
||||
document.write(document.location.hostname == "proguard.sourceforge.net" ?
|
||||
"http://sourceforge.net/sflogo.php?group_id=54750&type=1" :
|
||||
"../sflogo.png");
|
||||
document.write("\" width=\"88\" height=\"31\" alt=\"SourceForge\" />");
|
||||
//-->
|
||||
</script>
|
||||
<noscript>
|
||||
<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>
|
||||
</center>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
105
public/proguard/docs/manual/style.css
Normal file
@@ -0,0 +1,105 @@
|
||||
@charset "iso-8859-1";
|
||||
|
||||
/* Global settings. */
|
||||
|
||||
body {
|
||||
background: #FFFFFF;
|
||||
}
|
||||
|
||||
h1 {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
h2 {
|
||||
background: #EEEEFF;
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
dt {
|
||||
padding: 6px;
|
||||
}
|
||||
|
||||
dt div
|
||||
{
|
||||
color: grey;
|
||||
float: right;
|
||||
}
|
||||
|
||||
dd {
|
||||
padding: 6px;
|
||||
}
|
||||
|
||||
pre {
|
||||
padding: 10px;
|
||||
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 {
|
||||
padding: 10px;
|
||||
background: #E0E0E0;
|
||||
}
|
||||
|
||||
|
||||
/* Settings for diagrams. */
|
||||
|
||||
table.diagram {
|
||||
padding: 8px;
|
||||
border: none;
|
||||
border-spacing: 2px;
|
||||
}
|
||||
|
||||
td.transparentblock {
|
||||
text-align: center;
|
||||
padding: 10px 0px;
|
||||
}
|
||||
|
||||
td.whiteblock {
|
||||
width: 100px;
|
||||
text-align: center;
|
||||
border: 1px solid #C0C0C0;
|
||||
background: #E0E0E0;
|
||||
padding: 10px 0px;
|
||||
}
|
||||
|
||||
td.lightblock {
|
||||
width: 100px;
|
||||
text-align: center;
|
||||
border: 1px solid #8888FF;
|
||||
background: #BBBBFF;
|
||||
padding: 20px 0px;
|
||||
}
|
||||
|
||||
td.darkblock {
|
||||
width: 100px;
|
||||
text-align: center;
|
||||
background: #8888FF;
|
||||
padding: 20px 0px;
|
||||
}
|
||||
|
||||
/* Settings for buttons. */
|
||||
|
||||
td.button {
|
||||
background: #E0E0E0;
|
||||
border: 1px outset #FFFFFF;
|
||||
font-weight: bold;
|
||||
}
|
||||
729
public/proguard/docs/manual/troubleshooting.html
Normal file
@@ -0,0 +1,729 @@
|
||||
<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//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>
|
||||
|
||||
<h2>Troubleshooting</h2>
|
||||
|
||||
While preparing a configuration for processing your code, you may bump into a
|
||||
few problems. The following sections discuss some common issues and solutions:
|
||||
|
||||
<h3><a href="#processing">Problems while processing</a></h3>
|
||||
<ul>
|
||||
<li><a href="#dynamicalclass">Note: can't find dynamically referenced class</a></li>
|
||||
<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>
|
||||
<li><a href="#otherwise">Otherwise...</a></li>
|
||||
</ul>
|
||||
|
||||
<h3><a href="#afterprocessing">Unexpected observations after processing</a></h3>
|
||||
<ul>
|
||||
<li><a href="#disappearingclasses">Disappearing classes</a></li>
|
||||
<li><a href="#notkept">Classes or class members not being kept</a></li>
|
||||
<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>
|
||||
<li><a href="#invalidclassexception1">InvalidClassException, class loading error, or verification error</a></li>
|
||||
</ul>
|
||||
|
||||
<h3><a href="#runtime">Problems at run-time</a></h3>
|
||||
<ul>
|
||||
<li><a href="#stacktraces">Stack traces without class names or line numbers</a></li>
|
||||
<li><a href="#noclassdeffounderror">NoClassDefFoundError</a></li>
|
||||
<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>
|
||||
<li><a href="#disappearingloops">Disappearing loops</a></li>
|
||||
<li><a href="#securityexception">SecurityException: SHA1 digest error</a></li>
|
||||
<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="#nosuchmethoderror">NoSuchMethodError or AbstractMethodError</a></li>
|
||||
<li><a href="#verifyerror">VerifyError</a></li>
|
||||
</ul>
|
||||
|
||||
|
||||
<h2><a name="processing">Problems while processing</a></h2>
|
||||
|
||||
ProGuard may print out some notes and non-fatal warnings:
|
||||
|
||||
<dl>
|
||||
<dt><a name="dynamicalclass"><b>Note: can't find dynamically referenced class</b></a></dt>
|
||||
|
||||
<dd>ProGuard can't find a class or interface that your code is accessing by
|
||||
means of introspection. You should check if you want to add the jar that
|
||||
contains this class.</dd>
|
||||
|
||||
<dt><a name="dynamicalclasscast"><b>Note: ... calls '(...)Class.forName(variable).newInstance()'</b></a></dt>
|
||||
|
||||
<dd>ProGuard lists all class casts of dynamically created class instances,
|
||||
like "<code>(MyClass)Class.forName(variable).newInstance()</code>".
|
||||
Depending on your application, you may need to keep the mentioned classes
|
||||
with an option like "<code>-keep class MyClass</code>", or their
|
||||
implementations with an option like "<code>-keep class * implements
|
||||
MyClass</code>". You can switch off these notes by specifying the
|
||||
<a href="usage.html#dontnote"><code>-dontnote</code></a> option.</dd>
|
||||
|
||||
<dt><a name="dynamicalclassmember"><b>Note: ... accesses a field/method '...' dynamically</b></a></dt>
|
||||
|
||||
<dd>ProGuard lists a number of constructs like
|
||||
"<code>.getField("myField")</code>". Depending on your application, you
|
||||
may need to figure out where the mentioned class members are defined and
|
||||
keep them with an option like "<code>-keep class MyClass { MyFieldType
|
||||
myField; }</code>". Otherwise, ProGuard might remove or obfuscate the
|
||||
class members, since it can't know which ones they are exactly. It does
|
||||
list possible candidates, for your information. You can switch off these
|
||||
notes by specifying the <a
|
||||
href="usage.html#dontnote"><code>-dontnote</code></a> option.</dd>
|
||||
|
||||
<dt><a name="descriptorclass"><b>Note: the configuration keeps the entry point '...', but not the descriptor class '...'</b></a></dt>
|
||||
|
||||
<dd>Your configuration contains a <code>-keep</code> option to preserve the
|
||||
given method (or field), but no <code>-keep</code> option for the given
|
||||
class that is an argument type or return type in the method's descriptor.
|
||||
You may then want to keep the class too. Otherwise, ProGuard will
|
||||
obfuscate its name, thus changing the method's signature. The method might
|
||||
then become unfindable as an entry point, e.g. if it is part of a public
|
||||
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
|
||||
listed classes. ProGuard continues processing as usual, only considering
|
||||
the first definitions. The warning may be an indication of some problem
|
||||
though, so it's advisable to remove the duplicates. A convenient way to do
|
||||
so is by specifying filters on the input jars or library jars. You can
|
||||
switch off these notes by specifying the <a
|
||||
href="usage.html#dontnote"><code>-dontnote</code></a> option.</dd>
|
||||
|
||||
<dt><a name="duplicatezipentry"><b>Warning: can't write resource ... Duplicate zip entry</b></a></dt>
|
||||
|
||||
<dd>Your input jars contain multiple resource files with the same name.
|
||||
ProGuard continues copying the resource files as usual, skipping any files
|
||||
with previously used names. Once more, the warning may be an indication of
|
||||
some problem though, so it's advisable to remove the duplicates. A
|
||||
convenient way to do so is by specifying filters on the input jars. There
|
||||
is no option to switch off these warnings.</dd>
|
||||
|
||||
</dl>
|
||||
<p>
|
||||
|
||||
ProGuard may terminate when it encounters parsing errors or I/O errors, or
|
||||
some more serious warnings:
|
||||
|
||||
<dl>
|
||||
<dt><a name="unresolvedclass"><b>Warning: can't find superclass or interface</b><br/><b>Warning: can't find referenced class</b></a></dt>
|
||||
|
||||
<dd>If there are unresolved references to classes or interfaces, you most
|
||||
likely forgot to specify an essential library. For proper processing, all
|
||||
libraries that are referenced by your code must be specified, including
|
||||
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>.
|
||||
<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>
|
||||
|
||||
<dt><a name="unresolvedclassmember"><b>Warning: can't find referenced field/method</b></a></dt>
|
||||
|
||||
<dd>If there are unresolved references to class members in input classes, your
|
||||
class files are most likely inconsistent. Possibly, some class file didn't
|
||||
get recompiled properly, or some class file was left behind after its
|
||||
source file was removed. Try removing all class files, recompiling them,
|
||||
zipping them up, and running ProGuard again.
|
||||
<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>
|
||||
option.</dd>
|
||||
|
||||
<dt><a name="unresolvedenclosingmethod"><b>Warning: can't find enclosing class/method</b></a></dt>
|
||||
|
||||
<dd>If there are unresolved references to classes that are defined inside
|
||||
methods in your input, once more, your class files are most likely
|
||||
inconsistent. Possibly, some class file didn't get recompiled properly, or
|
||||
some class file was left behind after its source file was removed. Try
|
||||
removing all class files, recompiling them, zipping them up, and running
|
||||
ProGuard again.</dd>
|
||||
|
||||
<dt><a name="dependency"><b>Warning: library class ... depends on program class ...</b></a></dt>
|
||||
|
||||
<dd>If any of your library classes depend on your program classes, by
|
||||
extending, implementing or just referencing them, your processed code will
|
||||
generally be unusable. Program classes can depend on library classes, but
|
||||
not the other way around. Program classes are processed, while library
|
||||
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>
|
||||
|
||||
<dt><a name="unexpectedclass"><b>Warning: class file ... unexpectedly contains class ...</b></a></dt>
|
||||
|
||||
<dd>The given class file contains a definition for the given class, but the
|
||||
directory name of the file doesn't correspond to the package name of the
|
||||
class. ProGuard will accept the class definition, but the current
|
||||
implementation will not write out the processed version. Please make sure
|
||||
your input classes are packaged correctly. Notably, class files that are
|
||||
in the <code>WEB-INF/classes</code> directory in a war should be packaged
|
||||
in a jar and put in the <code>WEB-INF/lib</code> directory. If you don't
|
||||
mind these classes not being written to the output, you can specify the <a
|
||||
href="usage.html#ignorewarnings"><code>-ignorewarnings</code></a> option,
|
||||
or even the <a href="usage.html#dontwarn"><code>-dontwarn</code></a>
|
||||
option.</dd>
|
||||
|
||||
<dt><a name="mappingconflict1"><b>Warning: ... is not being kept as ..., but remapped to ...</b></a></dt>
|
||||
|
||||
<dd>There is a conflict between a <code>-keep</code> option in the
|
||||
configuration, and the mapping file, in the obfuscation step. The given
|
||||
class name or class member name can't be kept by its original name, as
|
||||
specified in the configuration, but it has to be mapped to the other given
|
||||
name, as specified in the mapping file. You should adapt your
|
||||
configuration or your mapping file to remove the conflict. Alternatively,
|
||||
if you're sure the renaming won't hurt, you can specify the <a
|
||||
href="usage.html#ignorewarnings"><code>-ignorewarnings</code></a> option,
|
||||
or even the <a href="usage.html#dontwarn"><code>-dontwarn</code></a>
|
||||
option.</dd>
|
||||
|
||||
<dt><a name="mappingconflict2"><b>Warning: field/method ... can't be mapped to ...</b></a></dt>
|
||||
|
||||
<dd>There is a conflict between some new program code and the mapping file, in
|
||||
the obfuscation step. The given class member can't be mapped to the given
|
||||
name, because it would conflict with another class member that is already
|
||||
being mapped to the same name. This can happen if you are performing
|
||||
incremental obfuscation, applying an obfuscation mapping file from an
|
||||
initial obfuscation step. For instance, some new class may have been added
|
||||
that extends two existing classes, introducing a conflict in the name
|
||||
space of its class members. If you're sure the class member receiving
|
||||
another name than the one specified won't hurt, you can specify the <a
|
||||
href="usage.html#ignorewarnings"><code>-ignorewarnings</code></a> option,
|
||||
or even the <a href="usage.html#dontwarn"><code>-dontwarn</code></a>
|
||||
option. Note that you should always use the <a
|
||||
href="usage.html#useuniqueclassmembernames"><code>-useuniqueclassmembernames</code></a>
|
||||
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
|
||||
href="usage.html#keep"><code>-keep</code></a> options, or you mistyped the
|
||||
class names. ProGuard has to know exactly what you want to keep: an
|
||||
application, an applet, a servlet, a midlet,..., or any combination of
|
||||
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",
|
||||
you have to enclose it with single or double quotes, as explained in the
|
||||
section on <a href="usage.html#filename">file names</a>. This is actually
|
||||
true for all file names containing special characters, on all
|
||||
platforms.</dd>
|
||||
|
||||
<dt><a name="macosx"><b>Error: Can't read [</b>...<b>/lib/rt.jar] (No such file or directory)</b> (in MacOS X)</a></dt>
|
||||
|
||||
<dd>In MacOS X, the run-time classes may be in a different place than on most
|
||||
other platforms. You'll then have to adapt your configuration, replacing
|
||||
the path <code><java.home>/lib/rt.jar</code> by
|
||||
<code><java.home>/../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>
|
||||
|
||||
Should ProGuard crash while processing your application:
|
||||
|
||||
<dl>
|
||||
<dt><a name="outofmemoryerror"><b>OutOfMemoryError</b></a></dt>
|
||||
|
||||
<dd>You can try increasing the heap size of the Java virtual machine (with the
|
||||
usual <code>-Xms</code> and <code>-Xmx</code> options). You can also
|
||||
reduce the amount of memory that ProGuard needs by removing unnecessary
|
||||
library jars from your configuration, or by filtering out unused library
|
||||
packages and classes. Remember that only classes or interfaces that are
|
||||
extended or implemented by classes in your input jars are required.</dd>
|
||||
|
||||
<dt><a name="stackoverflowerror"><b>StackOverflowError</b></a></dt>
|
||||
|
||||
<dd>This error might occur when processing a large code base on Windows
|
||||
(surprisingly, not so easily on Linux). In theory, increasing the stack
|
||||
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
|
||||
#4362291</a>. As a result, this solution will only work when running
|
||||
ProGuard in a different thread, e.g. from its GUI.</dd>
|
||||
|
||||
<dt><a name="unexpectederror"><b>Unexpected error</b></a></dt>
|
||||
|
||||
<dd>ProGuard has encountered an unexpected condition, typically in the
|
||||
optimization step. It may or may not recover. You should be able to avoid
|
||||
it using the <a
|
||||
href="usage.html#dontoptimize"><code>-dontoptimize</code></a> option. In
|
||||
any case, please report the problem, preferably with the simplest example
|
||||
that causes ProGuard to crash.</dd>
|
||||
|
||||
<dt><a name="otherwise"><b>Otherwise...</b></a></dt>
|
||||
|
||||
<dd>Maybe your class files are corrupt. See if recompiling them and trying
|
||||
again helps. If not, please report the problem, preferably with the
|
||||
simplest example that causes ProGuard to crash.</dd>
|
||||
|
||||
</dl>
|
||||
<p>
|
||||
|
||||
<h2><a name="afterprocessing">Unexpected observations after processing</a></h2>
|
||||
|
||||
If ProGuard seems to run fine, but your processed code doesn't look right,
|
||||
there might be a couple of reasons:
|
||||
|
||||
<dl>
|
||||
<dt><a name="disappearingclasses"><b>Disappearing classes</b></a></dt>
|
||||
|
||||
<dd>If you are working on Windows and it looks like some classes have
|
||||
disappeared from your output, you should make sure you're not writing your
|
||||
output class files to a directory (or unpacking the output jar). On
|
||||
platforms with case-insensitive file systems, such as Windows, unpacking
|
||||
tools often let class files with similar lower-case and upper-case names
|
||||
overwrite each other. If you really can't switch to a different operating
|
||||
system, you could consider using ProGuard's <a
|
||||
href="usage.html#dontusemixedcaseclassnames"><code>-dontusemixedcaseclassnames</code></a>
|
||||
option.
|
||||
<p>
|
||||
Also, you should make sure your class files are in directories that
|
||||
correspond to their package names. ProGuard will read misplaced class
|
||||
files, but it will currently not write their processed versions. Notably,
|
||||
class files that are in the <code>WEB-INF/classes</code> directory in a
|
||||
war should be packaged in a jar and put in the <code>WEB-INF/lib</code>
|
||||
directory.</dd>
|
||||
|
||||
<dt><a name="notkept"><b>Classes or class members not being kept</b></a></dt>
|
||||
|
||||
<dd>If ProGuard is not keeping the right classes or class members, make sure
|
||||
you are using fully qualified class names. If the package name of some
|
||||
class is missing, ProGuard won't match the elements that you might be
|
||||
expecting. It may help to double-check for typos too. You can use the <a
|
||||
href="usage.html#printseeds"><code>-printseeds</code></a> option to see
|
||||
which elements are being kept exactly.
|
||||
<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>
|
||||
|
||||
<dt><a name="notobfuscated"><b>Variable names not being obfuscated</b></a></dt>
|
||||
|
||||
<dd>If the names of the local variables and parameters in your obfuscated code
|
||||
don't look obfuscated, because they suspiciously resemble the names of
|
||||
their types, it's probably because the decompiler that you are using is
|
||||
coming up with those names. ProGuard's obfuscation step does remove the
|
||||
original names entirely, unless you explicitly keep the
|
||||
<code>LocalVariableTable</code> or <code>LocalVariableTypeTable</code>
|
||||
attributes.</dd>
|
||||
|
||||
</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>
|
||||
|
||||
If ProGuard seems to run fine, but the external preverifier subsequently
|
||||
produces errors, it's usually for a single reason:
|
||||
|
||||
<dl>
|
||||
<dt><a name="invalidclassexception1"><b>InvalidClassException</b>, <b>class loading error</b>, or <b>verification error</b></a></dt>
|
||||
|
||||
<dd>If you get any such message from the preverifier, you are probably working
|
||||
on a platform with a case-insensitive file system, such as Windows. The
|
||||
<code>preverify</code> tool always unpacks the jars, so class files with
|
||||
similar lower-case and upper-case names overwrite each other. You can use
|
||||
ProGuard's <a
|
||||
href="usage.html#dontusemixedcaseclassnames"><code>-dontusemixedcaseclassnames</code></a>
|
||||
option to work around this problem.
|
||||
<p>
|
||||
If the above doesn't help, there is probably a bug in the optimization
|
||||
step of ProGuard. Make sure you are using the latest version. You should
|
||||
be able to work around the problem by using the <a
|
||||
href="usage.html#dontoptimize"><code>-dontoptimize</code></a> option. You
|
||||
can check the bug database to see if it is a known problem (often with a
|
||||
fix). Otherwise, please report it, preferably with the simplest example on
|
||||
which you can find ProGuard to fail.</dd>
|
||||
|
||||
</dl>
|
||||
|
||||
Note that it is no longer necessary to use an external preverifier. With the
|
||||
<a href="usage.html#microedition"><code>-microedition</code></a> option,
|
||||
ProGuard will preverify the class files for Java Micro Edition.
|
||||
<p>
|
||||
|
||||
<h2><a name="runtime">Problems at run-time</a></h2>
|
||||
|
||||
If ProGuard runs fine, but your processed application doesn't work, there
|
||||
might be several reasons:
|
||||
|
||||
<dl>
|
||||
<dt><a name="stacktraces"><b>Stack traces without class names or line numbers</b></a></dt>
|
||||
|
||||
<dd>If your stack traces don't contain any class names or lines numbers,
|
||||
even though you are keeping the proper attributes, make sure this debugging
|
||||
information is present in your compiled code to start with. Notably the Ant
|
||||
javac task has debugging information switched off by default.</dd>
|
||||
|
||||
<dt><a name="noclassdeffounderror"><b>NoClassDefFoundError</b></a></dt>
|
||||
|
||||
<dd>Your class path is probably incorrect. It should at least contain all
|
||||
library jars and, of course, your processed program jar.</dd>
|
||||
|
||||
<dt><a name="classnotfoundexception"><b>ClassNotFoundException</b></a></dt>
|
||||
|
||||
<dd>Your code is probably calling <code>Class.forName</code>, trying to create
|
||||
the missing class dynamically. ProGuard can only detect constant name
|
||||
arguments, like <code>Class.forName("mypackage.MyClass")</code>. For
|
||||
variable name arguments like <code>Class.forName(someClass)</code>, you
|
||||
have to keep all possible classes using the appropriate <a
|
||||
href="usage.html#keep"><code>-keep</code></a> option, e.g. "<code>-keep
|
||||
class mypackage.MyClass</code>" or "<code>-keep class * implements
|
||||
mypackage.MyInterface</code>".</dd>
|
||||
|
||||
<dt><a name="nosuchmethodexception"><b>NoSuchMethodException</b></a></dt>
|
||||
|
||||
<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
|
||||
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>
|
||||
|
||||
<dt><a name="missingresourceexception"><b>MissingResourceException</b> or <b>NullPointerException</b></a></dt>
|
||||
|
||||
<dd>Your processed code may be unable to find some resource files. ProGuard
|
||||
simply copies resource files over from the input jars to the output jars.
|
||||
Their names and contents remain unchanged, unless you specify the options
|
||||
<a
|
||||
href="usage.html#adaptresourcefilenames"><code>-adaptresourcefilenames</code></a>
|
||||
and/or <a
|
||||
href="usage.html#adaptresourcefilecontents"><code>-adaptresourcefilecontents</code></a>.
|
||||
<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>
|
||||
|
||||
<dt><a name="invalidjarfile"><b>Invalid or corrupt jarfile</b></a></dt>
|
||||
|
||||
<dd>You are probably starting your application with the java option
|
||||
<code>-jar</code> instead of the option <code>-classpath</code>. The java
|
||||
virtual machine returns with this error message if your jar doesn't
|
||||
contain a manifest file (<code>META-INF/MANIFEST.MF</code>), if the
|
||||
manifest file doesn't specify a main class (<code>Main-Class:</code> ...),
|
||||
or if the jar doesn't contain this main class. You should then make sure
|
||||
that the input jar contains a valid manifest file to start with, that this
|
||||
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
|
||||
specify the <a
|
||||
href="usage.html#microedition"><code>-microedition</code></a> option, so
|
||||
the processed class files are preverified properly.</dd>
|
||||
|
||||
<dt><a name="nosuchfieldormethod"><b>Error: No Such Field or Method</b>, <b>Error verifying method</b> (in a Java Micro Edition emulator)</a></dt>
|
||||
|
||||
<dd>If you get such a message in a Motorola or Sony Ericsson phone emulator,
|
||||
it's because these emulators don't like packageless classes and/or
|
||||
overloaded fields and methods. You can work around it by not using the
|
||||
options <code><a href="usage.html#repackageclasses">-repackageclasses</a>
|
||||
''</code> and <a
|
||||
href="usage.html#overloadaggressively"><code>-overloadaggressively</code></a>.
|
||||
If you're using the JME WTK plugin, you can adapt the configuration
|
||||
<code>proguard/wtk/default.pro</code> that's inside the
|
||||
<code>proguard.jar</code>.</dd>
|
||||
|
||||
<dt><a name="failingmidlets"><b>Failing midlets</b> (on a Java Micro Edition device)</a></dt>
|
||||
|
||||
<dd>If your midlet runs in an emulator and on some devices, but not on some
|
||||
other devices, this is probably due to a bug in the latter devices. For
|
||||
some older Motorola and Nokia phones, you might try specifying the <a
|
||||
href="usage.html#useuniqueclassmembernames"><code>-useuniqueclassmembernames</code></a>
|
||||
option. It avoids overloading class member names, which triggers a bug in
|
||||
their java virtual machine.
|
||||
<p>
|
||||
You might also try using the <a
|
||||
href="usage.html#dontusemixedcaseclassnames"><code>-dontusemixedcaseclassnames</code></a>
|
||||
option. Even if the midlet has been properly processed and then
|
||||
preverified on a case-sensitive file system, the device itself might not
|
||||
like the mixed-case class names. Notably, the Nokia N-Gage emulator works
|
||||
fine, but the actual device seems to exhibit this problem.</dd>
|
||||
|
||||
<dt><a name="disappearingloops"><b>Disappearing loops</b></a></dt>
|
||||
|
||||
<dd>If your code contains empty busy-waiting loops, ProGuard's optimization
|
||||
step may remove them. More specifically, this happens if a loop
|
||||
continuously checks the value of a non-volatile field that is changed in a
|
||||
different thread. The specifications of the Java Virtual Machine require
|
||||
that you always mark fields that are accessed across different threads
|
||||
without further synchronization as <code>volatile</code>. If this is not
|
||||
possible for some reason, you'll have to switch off optimization using the
|
||||
<a href="usage.html#dontoptimize"><code>-dontoptimize</code></a>
|
||||
option.</dd>
|
||||
|
||||
<dt><a name="securityexception"><b>SecurityException: SHA1 digest error</b></a></dt>
|
||||
|
||||
<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>
|
||||
|
||||
<dd>You should make sure you're preserving the special methods of enumeration
|
||||
types, which the run-time environment calls by introspection. The required
|
||||
options are shown in the <a
|
||||
href="examples.html#enumerations">examples</a>.</dd>
|
||||
|
||||
<dt><a name="arraystoreexception"><b>ArrayStoreException: sun.reflect.annotation.EnumConstantNotPresentExceptionProxy</b></a></dt>
|
||||
|
||||
<dd>You are probably processing annotations involving enumerations. Again, you
|
||||
should make sure you're preserving the special methods of the enumeration
|
||||
type, as shown in the examples.</dd>
|
||||
|
||||
<dt><a name="compilererror"><b>CompilerError: duplicate addition</b></a></dt>
|
||||
|
||||
<dd>You are probably compiling or running some code that has been obfuscated
|
||||
with the <a
|
||||
href="usage.html#overloadaggressively"><code>-overloadaggressively</code></a>
|
||||
option. This option triggers a bug in
|
||||
<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>
|
||||
|
||||
<dd>You are probably processing some code that has been obfuscated before with
|
||||
the <a
|
||||
href="usage.html#overloadaggressively"><code>-overloadaggressively</code></a>
|
||||
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
|
||||
directory on a platform with a case-insensitive file system, such as
|
||||
Windows. Please refer to the section about <a
|
||||
href="#disappearingclasses">disappearing classes</a> for details.
|
||||
<p>
|
||||
Furthermore, you should check whether you have specified your program jars
|
||||
and library jars properly. Program classes can refer to library classes,
|
||||
but not the other way around.
|
||||
<p>
|
||||
If all of this seems ok, perhaps there's a bug in ProGuard (gasp!). If so,
|
||||
please report it, preferably with the simplest example on which you can
|
||||
find ProGuard to fail.</dd>
|
||||
|
||||
<dt><a name="verifyerror"><b>VerifyError</b></a></dt>
|
||||
|
||||
<dd>Verification errors when executing a program are almost certainly the
|
||||
result of a bug in the optimization step of ProGuard. Make sure you are
|
||||
using the latest version. You should be able to work around the problem by
|
||||
using the <a href="usage.html#dontoptimize"><code>-dontoptimize</code></a>
|
||||
option. You can check the bug database to see if it is a known problem
|
||||
(often with a fix). Otherwise, please report it, preferably with the
|
||||
simplest example on which ProGuard fails.</dd>
|
||||
|
||||
</dl>
|
||||
|
||||
<hr />
|
||||
<noscript><div><a target="_top" href="../index.html" class="button">Show menu</a></div></noscript>
|
||||
<address>
|
||||
Copyright © 2002-2011
|
||||
<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
|
||||
</address>
|
||||
</body>
|
||||
</html>
|
||||
1243
public/proguard/docs/manual/usage.html
Normal file
70
public/proguard/docs/manual/wtk.html
Normal file
@@ -0,0 +1,70 @@
|
||||
<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//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)
|
||||
for Java Micro Edition (JME).
|
||||
<p>
|
||||
|
||||
The WTK already comes with a plug-in for ProGuard. Alternatively, ProGuard
|
||||
offers its own plug-in. This latter implementation is recommended, as it more
|
||||
up to date and it solves some problems. It is also somewhat more efficient,
|
||||
invoking the ProGuard engine directly, instead of writing out a configuration
|
||||
file and running ProGuard in a separate virtual machine.
|
||||
<p>
|
||||
|
||||
In order to integrate this plug-in in the toolkit, you'll have to put the
|
||||
following lines in the file
|
||||
{j2mewtk.dir}<code>/wtklib/Linux/ktools.properties</code> or
|
||||
{j2mewtk.dir}<code>\wtklib\Windows\ktools.properties</code> (whichever is
|
||||
applicable).
|
||||
<p>
|
||||
|
||||
<pre>
|
||||
obfuscator.runner.class.name: proguard.wtk.ProGuardObfuscator
|
||||
obfuscator.runner.classpath: /usr/local/java/proguard/lib/proguard.jar
|
||||
</pre>
|
||||
<p>
|
||||
|
||||
Please make sure the class path is set correctly for your system.
|
||||
<p>
|
||||
|
||||
Once ProGuard has been set up, you can apply it to your projects as part of
|
||||
the build process. The build process is started from the WTK menu bar:
|
||||
<p>
|
||||
<center><b>Project -> Package -> Create Obfuscated Package</b></center>
|
||||
<p>
|
||||
This option will compile, shrink, obfuscate, verify, and install your midlets
|
||||
for testing.
|
||||
<p>
|
||||
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>
|
||||
<address>
|
||||
Copyright © 2002-2011
|
||||
<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
|
||||
</address>
|
||||
</body>
|
||||
</html>
|
||||
56
public/proguard/docs/quality.html
Normal file
@@ -0,0 +1,56 @@
|
||||
<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//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>
|
||||
|
||||
<h2>Quality</h2>
|
||||
|
||||
In order to get a feel for the quality of the <b>ProGuard</b> code, it is run
|
||||
through a regular automatic build process. This process produces numerous
|
||||
statistics on the source code, Java lint comments, Java documentation
|
||||
comments, the Java documentation itself, html lint comments on the Java
|
||||
documentation, spell checks, compilation results, an output jar, dead code
|
||||
analysis, a shrunk and obfuscated jar (using ProGuard itself!), test runs with
|
||||
memory and performance analyses, etc. Most analyses are produced using freely
|
||||
available tools. The results are poured into a convenient set of web pages
|
||||
using bash/sed/awk scripts. You're welcome to have a look at an uploaded
|
||||
snapshot of one of these runs:
|
||||
<p>
|
||||
<center><a href="http://proguard.sourceforge.net/quality/"
|
||||
target="other">Automated Code Analysis and Testing Pages</a> (at <a
|
||||
href="http://sourceforge.net/projects/proguard/"
|
||||
target="other">SourceForge</a>)</center>
|
||||
<p>
|
||||
The pages will appear in a new window, which you probably want to view at
|
||||
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
|
||||
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>
|
||||
<address>
|
||||
Copyright © 2002-2011
|
||||
<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
|
||||
</address>
|
||||
</body>
|
||||
</html>
|
||||
170
public/proguard/docs/results.html
Normal file
@@ -0,0 +1,170 @@
|
||||
<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//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>
|
||||
|
||||
<h2>Results</h2>
|
||||
|
||||
<b>ProGuard</b> successfully processes any Java bytecode, ranging from small
|
||||
midlets to entire run-time libraries. It primarily reduces the size of the
|
||||
processed code, with some potential increase in efficiency as an added bonus.
|
||||
The improvements obviously depend on the original code. The table below
|
||||
presents some typical results:
|
||||
<p>
|
||||
|
||||
<table>
|
||||
|
||||
<tr>
|
||||
<th width="28%">Input Program</th>
|
||||
<th width="12%">Original size</th>
|
||||
<th width="12%">After shrinking</th>
|
||||
<th width="12%">After optim.</th>
|
||||
<th width="12%">After obfusc.</th>
|
||||
<th width="12%">Total reduction</th>
|
||||
<th width="12%">Time</th>
|
||||
<th width="12%">Memory usage</th>
|
||||
</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 align="center">10.3 K</td>
|
||||
<td align="center">9.8 K</td>
|
||||
<td align="center">9.6 K</td>
|
||||
<td align="center">8.5 K</td>
|
||||
<td align="center">18 %</td>
|
||||
<td align="center">2 s</td>
|
||||
<td align="center">19 M</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><a target="other" href="http://www.javadocking.com/">Javadocking</a>, a docking library</td>
|
||||
<td align="center">290 K</td>
|
||||
<td align="center">281 K</td>
|
||||
<td align="center">270 K</td>
|
||||
<td align="center">201 K</td>
|
||||
<td align="center">30 %</td>
|
||||
<td align="center">12 s</td>
|
||||
<td align="center">32 M</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><b>ProGuard</b> itself</td>
|
||||
<td align="center">648 K</td>
|
||||
<td align="center">579 K</td>
|
||||
<td align="center">557 K</td>
|
||||
<td align="center">348 K</td>
|
||||
<td align="center">46 %</td>
|
||||
<td align="center">28 s</td>
|
||||
<td align="center">66 M</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><a target="other" href="http://www.clarkware.com/software/JDepend.html">JDepend</a>, a Java quality metrics tool</td>
|
||||
<td align="center">57 K</td>
|
||||
<td align="center">36 K</td>
|
||||
<td align="center">33 K</td>
|
||||
<td align="center">28 K</td>
|
||||
<td align="center">51 %</td>
|
||||
<td align="center">6 s</td>
|
||||
<td align="center">24 M</td>
|
||||
</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 align="center">53 M</td>
|
||||
<td align="center">23 M</td>
|
||||
<td align="center">22 M</td>
|
||||
<td align="center">18 M</td>
|
||||
<td align="center">66 %</td>
|
||||
<td align="center">16 min</td>
|
||||
<td align="center">270 M</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><a target="other" href="http://tomcat.apache.org/">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>
|
||||
<td align="center">295 K</td>
|
||||
<td align="center">74 %</td>
|
||||
<td align="center">17 s</td>
|
||||
<td align="center">44 M</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><a target="other" href="http://javancss.codehaus.org/">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>
|
||||
<td align="center">152 K</td>
|
||||
<td align="center">75 %</td>
|
||||
<td align="center">20 s</td>
|
||||
<td align="center">36 M</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><a target="other" href="http://ant.apache.org/">Ant</a>, the Apache build tool</td>
|
||||
<td align="center">2.4 M</td>
|
||||
<td align="center">401 K</td>
|
||||
<td align="center">325 K</td>
|
||||
<td align="center">242 K</td>
|
||||
<td align="center">90 %</td>
|
||||
<td align="center">23 s</td>
|
||||
<td align="center">61 M</td>
|
||||
</tr>
|
||||
|
||||
</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.
|
||||
<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
|
||||
obfuscation step can significantly shrink large programs even further, since
|
||||
the identifiers of their many internal references can be replaced by short
|
||||
identifiers.
|
||||
<p>
|
||||
The Java 6 run-time classes are the most complex example. The classes perform
|
||||
a lot of introspection, interacting with the native code of the virtual
|
||||
machine. The 1500+ lines of configuration were largely composed by automated
|
||||
analysis, complemented by a great deal of trial and error. The configuration
|
||||
is probably not complete, but the resulting library successfully serves as a
|
||||
run-time environment for running applications like ProGuard and the ProGuard
|
||||
GUI.
|
||||
<p>
|
||||
For small inputs, timings are governed by the reading and parsing of the jars.
|
||||
For large inputs, the optimization step becomes more important. For instance,
|
||||
processing the Java 6 run-time classes without optimization only takes 2
|
||||
minutes.
|
||||
<p>
|
||||
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>
|
||||
<address>
|
||||
Copyright © 2002-2011
|
||||
<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
|
||||
</address>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
BIN
public/proguard/docs/saikoalogo.png
Normal file
|
After Width: | Height: | Size: 2.8 KiB |
BIN
public/proguard/docs/screenshot_console.gif
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
public/proguard/docs/screenshot_console_small.gif
Normal file
|
After Width: | Height: | Size: 19 KiB |
BIN
public/proguard/docs/screenshot_gui1.gif
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
public/proguard/docs/screenshot_gui2.gif
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
public/proguard/docs/screenshot_gui3.gif
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
public/proguard/docs/screenshot_gui4.gif
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
public/proguard/docs/screenshot_gui5.gif
Normal file
|
After Width: | Height: | Size: 35 KiB |
BIN
public/proguard/docs/screenshot_gui6.gif
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
public/proguard/docs/screenshot_gui7.gif
Normal file
|
After Width: | Height: | Size: 41 KiB |
BIN
public/proguard/docs/screenshot_gui8.gif
Normal file
|
After Width: | Height: | Size: 31 KiB |
67
public/proguard/docs/screenshots.html
Normal file
@@ -0,0 +1,67 @@
|
||||
<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//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>
|
||||
|
||||
<h2>Screenshots</h2>
|
||||
|
||||
<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>
|
||||
|
||||
<map id="guimap" name="guimap">
|
||||
<area shape="rect" coords="2,7,46,16" alt="ProGuard" href="screenshot_gui1.gif" target="other">
|
||||
<area shape="rect" coords="2,17,46,27" alt="Input/Output" href="screenshot_gui2.gif" target="other">
|
||||
<area shape="rect" coords="2,28,46,37" alt="Shrinking" href="screenshot_gui3.gif" target="other">
|
||||
<area shape="rect" coords="2,38,46,48" alt="Optimization" href="screenshot_gui4.gif" target="other">
|
||||
<area shape="rect" coords="2,49,46,58" alt="Obfuscation" href="screenshot_gui5.gif" target="other">
|
||||
<area shape="rect" coords="2,59,46,69" alt="Information" href="screenshot_gui6.gif" target="other">
|
||||
<area shape="rect" coords="2,70,46,79" alt="Process" href="screenshot_gui7.gif" target="other">
|
||||
<area shape="rect" coords="2,80,46,90" alt="ReTrace" href="screenshot_gui8.gif" target="other">
|
||||
</map>
|
||||
|
||||
The graphical user interface to <b>ProGuard</b> works like a wizard. It allows
|
||||
you to browse through the presented tabs and fill them out.
|
||||
<p>
|
||||
You can click on the small tab buttons to see the full-size versions of the
|
||||
tabs.
|
||||
|
||||
</td></tr>
|
||||
<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>
|
||||
|
||||
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
|
||||
<b>ProGuard</b> from the command-line.
|
||||
<p>
|
||||
You can click on the image to see the full-size version.
|
||||
|
||||
</td></tr></table>
|
||||
|
||||
<hr />
|
||||
<noscript><div><a target="_top" href="index.html" class="button">Show menu</a></div></noscript>
|
||||
<address>
|
||||
Copyright © 2002-2011
|
||||
<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
|
||||
</address>
|
||||
</body>
|
||||
</html>
|
||||
BIN
public/proguard/docs/screenshots_gui_small.gif
Normal file
|
After Width: | Height: | Size: 157 KiB |
64
public/proguard/docs/sections.html
Normal file
@@ -0,0 +1,64 @@
|
||||
<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
|
||||
<meta http-equiv="content-script-type" content="text/javascript">
|
||||
<meta http-equiv="content-style-type" content="text/css">
|
||||
<link rel="stylesheet" type="text/css" href="style.css">
|
||||
<title>Sections</title>
|
||||
</head>
|
||||
<body class="navigation">
|
||||
|
||||
<ul class="navigation">
|
||||
<li><a target="main" href="main.html">Main</a></li>
|
||||
<li><a target="main" href="results.html">Results</a></li>
|
||||
<li><a target="main" href="FAQ.html">FAQ</a></li>
|
||||
<li><a href="manual/sections.html">Manual</a></li>
|
||||
<li><a target="main" href="quality.html">Quality</a></li>
|
||||
<li><a target="main" href="screenshots.html">Screenshots</a></li>
|
||||
<li><a target="main" href="testimonials.html">Testimonials</a></li>
|
||||
<li><a target="main" href="license.html">License</a></li>
|
||||
<li><a target="main" href="downloads.html">Downloads</a></li>
|
||||
<li><a target="main" href="feedback.html">Feedback</a></li>
|
||||
<li><a target="main" href="acknowledgements.html">Ack'ments</a></li>
|
||||
<li><a target="main" href="alternatives.html">Alternatives</a></li>
|
||||
</ul>
|
||||
|
||||
<p>
|
||||
<center>
|
||||
<small>With support of</small>
|
||||
<p>
|
||||
|
||||
<a href="http://sourceforge.net/projects/proguard/" target="other">
|
||||
|
||||
<script type="text/javascript" language="JavaScript">
|
||||
<!--
|
||||
document.write("<img src=\"");
|
||||
document.write(document.location.hostname == "proguard.sourceforge.net" ?
|
||||
"http://sourceforge.net/sflogo.php?group_id=54750&type=1" :
|
||||
"sflogo.png");
|
||||
document.write("\" width=\"88\" height=\"31\" alt=\"SourceForge\" />");
|
||||
//-->
|
||||
</script>
|
||||
<noscript>
|
||||
<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>
|
||||
</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>
|
||||
BIN
public/proguard/docs/sflogo.png
Normal file
|
After Width: | Height: | Size: 469 B |
BIN
public/proguard/docs/steel.gif
Normal file
|
After Width: | Height: | Size: 2.7 KiB |
223
public/proguard/docs/style.css
Normal file
@@ -0,0 +1,223 @@
|
||||
|
||||
@charset "iso-8859-1";
|
||||
|
||||
/* Global settings. */
|
||||
|
||||
body
|
||||
{
|
||||
background: #FFFFFF;
|
||||
}
|
||||
|
||||
h1
|
||||
{
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
h2
|
||||
{
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
h3
|
||||
{
|
||||
background: #EEEEFF;
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
h3 div
|
||||
{
|
||||
font-weight: normal;
|
||||
font-size: 80%;
|
||||
float: right;
|
||||
}
|
||||
|
||||
table
|
||||
{
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
th
|
||||
{
|
||||
padding: 4px;
|
||||
}
|
||||
|
||||
tr.disappeared td
|
||||
{
|
||||
background: #EEEEEE;
|
||||
}
|
||||
|
||||
td
|
||||
{
|
||||
background: #EEEEFF;
|
||||
padding: 8px;
|
||||
}
|
||||
|
||||
ul.spacious li
|
||||
{
|
||||
padding: 8px;
|
||||
}
|
||||
|
||||
a
|
||||
{
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
/* Settings for the title frame. */
|
||||
|
||||
body.title
|
||||
{
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
background: #C0C0C0;
|
||||
}
|
||||
|
||||
div.title
|
||||
{
|
||||
height: 48px;
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
border-width: 1px;
|
||||
border-style: solid;
|
||||
border-color: #FFFFFF #808080 #808080 #FFFFFF;
|
||||
background: url("steel.gif");
|
||||
}
|
||||
|
||||
div.title h1
|
||||
{
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
padding-top: 8px;
|
||||
padding-left: 40%;
|
||||
float: left;
|
||||
}
|
||||
|
||||
div.title div
|
||||
{
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
padding-top: 12px;
|
||||
padding-right: 20px;
|
||||
float: right;
|
||||
}
|
||||
|
||||
/* Settings for the section frames. */
|
||||
|
||||
body.navigation
|
||||
{
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
}
|
||||
|
||||
ul.navigation
|
||||
{
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
list-style: none;
|
||||
text-align: center;
|
||||
background: url("steel.gif");
|
||||
}
|
||||
|
||||
ul.navigation li
|
||||
{
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
border-width: 1px;
|
||||
border-style: solid;
|
||||
border-color: #FFFFFF #808080 #808080 #FFFFFF;
|
||||
color: #000000;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
ul.navigation li.title
|
||||
{
|
||||
margin: 0px;
|
||||
padding: 4px 10px;
|
||||
background: #E0E0E0;
|
||||
}
|
||||
|
||||
ul.navigation li a
|
||||
{
|
||||
margin: 0px;
|
||||
padding: 6px 0px;
|
||||
background: transparent;
|
||||
color: #000000;
|
||||
text-decoration: none;
|
||||
display: block;
|
||||
}
|
||||
|
||||
ul.navigation li a:hover,
|
||||
ul.navigation li a:focus
|
||||
{
|
||||
background: #FFFFFF;
|
||||
}
|
||||
|
||||
/* Settings for the yellow note tables. */
|
||||
|
||||
table.note
|
||||
{
|
||||
width: 408px;
|
||||
border: none;
|
||||
border-spacing: 0px;
|
||||
}
|
||||
|
||||
td.shadow8
|
||||
{
|
||||
width: 8px;
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
vertical-align: bottom;
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
td.shadow400
|
||||
{
|
||||
width: 400px;
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
text-align: right;
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
td.note
|
||||
{
|
||||
width: 380px;
|
||||
background: #FFFFC0;
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
p.note
|
||||
{
|
||||
padding: 0px;
|
||||
margin: 0px 10px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
p.author
|
||||
{
|
||||
padding: 0px;
|
||||
margin: 0px 10px;
|
||||
text-align: right;
|
||||
}
|
||||
133
public/proguard/docs/testimonials.html
Normal file
@@ -0,0 +1,133 @@
|
||||
<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//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>
|
||||
|
||||
<h2>Testimonials</h2>
|
||||
|
||||
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.
|
||||
<p>
|
||||
|
||||
<center><table class="note">
|
||||
<tr><td class="note"><p class="note"><cite>
|
||||
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>
|
||||
</tr></table></center>
|
||||
<p>
|
||||
|
||||
Also:
|
||||
<center><table class="note">
|
||||
<tr><td class="note"><p class="note"><cite>
|
||||
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>
|
||||
</tr></table></center>
|
||||
<p>
|
||||
|
||||
And:
|
||||
<center><table class="note">
|
||||
<tr><td class="note"><p class="note"><cite>
|
||||
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>
|
||||
</tr></table></center>
|
||||
<p>
|
||||
|
||||
And indeed:
|
||||
<center><table class="note">
|
||||
<tr><td class="note"><p class="note"><cite>
|
||||
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>
|
||||
</tr></table></center>
|
||||
<p>
|
||||
|
||||
Straight from <b>ProGuard</b>'s open discussion forum:
|
||||
<p>
|
||||
<center><table class="note">
|
||||
<tr><td class="note"><p class="note"><cite>
|
||||
After searching for, trying to trial, and futzing with numerous other
|
||||
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>
|
||||
</tr></table></center>
|
||||
<p>
|
||||
|
||||
From the article "Obfuscating MIDlet Suites with ProGuard" at <a
|
||||
target="other" href="http://developers.sun.com/">developers.sun.com</a>:
|
||||
<p>
|
||||
<center><table class="note">
|
||||
<tr><td class="note"><p class="note"><cite>
|
||||
Its friendly license, attractive price tag, compelling performance, and
|
||||
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>
|
||||
</tr></table></center>
|
||||
<p>
|
||||
|
||||
And, of course, the price is stunning:
|
||||
<p>
|
||||
<center><table class="note">
|
||||
<tr><td class="note"><p class="note"><cite>
|
||||
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>
|
||||
</tr></table></center>
|
||||
|
||||
<hr />
|
||||
<noscript><div><a target="_top" href="index.html" class="button">Show menu</a></div></noscript>
|
||||
<address>
|
||||
Copyright © 2002-2011
|
||||
<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
|
||||
</address>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
BIN
public/proguard/docs/title.gif
Normal file
|
After Width: | Height: | Size: 2.6 KiB |
17
public/proguard/docs/title.html
Normal file
@@ -0,0 +1,17 @@
|
||||
<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//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</title>
|
||||
</head>
|
||||
<body class="title">
|
||||
|
||||
<div class="title">
|
||||
<h1><img src="title.gif" width="154" height="29" alt="ProGuard" /></h1>
|
||||
<div>Version 4.7</div>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||