<!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 and for Java 6 and higher.
<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 &rarr;</td>
<td             class="transparentblock">- optimize &rarr;</td>
<td             class="transparentblock">- obfuscate &rarr;</td>
<td             class="lightblock">Obfusc. code</td>
<td             class="transparentblock">- preverify &rarr;</td>
</tr>

<tr>
<td             class="darkblock">Library jars</td>
<td colspan="7" class="transparentblock">------------------------------- (unchanged) -------------------------------&rarr;</td>
<td             class="darkblock">Library jars</td>
</tr>

</table>
<p>

ProGuard first reads the <b>input jars</b> (or wars, ears, zips, or
directories). It then subsequently shrinks, optimizes, obfuscates, and
preverifies them. You can optionally let ProGuard perform multiple
optimization passes. 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, activities, 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 compute 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 &copy; 2002-2013
<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
</address>
</body>
</html>
