Limitations
When using ProGuard, you should be aware of a few issues, all of which are
easily avoided or resolved:
- For efficiency, ProGuard always ignores any private or package visible
library classes while reading library jars. If any of them are
extended by public library classes, and then extended again by input
classes, ProGuard will complain it can't find them. In that case, you'll
have to use the
-dontskipnonpubliclibraryclasses
option, and
maybe even the -dontskipnonpubliclibraryclassmembers
option.
The graphical user interface has checkboxes for these settings.
- For best results, ProGuard's optimization algorithms assume that the
processed code never intentionally throws NullPointerExceptions or
ArrayIndexOutOfBoundsExceptions, or even OutOfMemoryErrors or
StackOverflowErrors, in order to achieve something useful. For instance,
it may remove a method call
myObject.myMethod()
if that call
wouldn't have any effect. It ignores that myObject
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
-dontoptimize
option.
- ProGuard's optimization algorithms also remove all empty busy-waiting
loops, unless they test on fields that are marked as
volatile
. The specifications of the Java Virtual Machine
require that you always mark fields that are accessed across different
threads without further synchronization as volatile
.
Otherwise, you'll have to switch off optimization using the
-dontoptimize
option.
- If an input jar and a library jar contain classes in the same
package, 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.
- When obfuscating, ProGuard will write out class files named
"
a.class
", "b.class
", etc. If there is a large
numbers of classes in the same package, it may also write out
"aux.class
". Windows doesn't allow creating files with
this reserved name (among a few other names), so it's generally better to
write the output to a jar, in order to avoid such problems.
Copyright © 2002-2007
Eric Lafortune.