summaryrefslogtreecommitdiff
path: root/docs/manual/troubleshooting.html
diff options
context:
space:
mode:
Diffstat (limited to 'docs/manual/troubleshooting.html')
-rw-r--r--docs/manual/troubleshooting.html227
1 files changed, 45 insertions, 182 deletions
diff --git a/docs/manual/troubleshooting.html b/docs/manual/troubleshooting.html
index 6b0c1a9..d3ed14e 100644
--- a/docs/manual/troubleshooting.html
+++ b/docs/manual/troubleshooting.html
@@ -1,21 +1,10 @@
-<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!doctype html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<meta http-equiv="content-style-type" content="text/css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>ProGuard Troubleshooting</title>
-<script type="text/javascript" language="JavaScript">
-<!--
-if (window.self==window.top)
- window.top.location.replace("../index.html#"+window.location.pathname+window.location.hash);
-else {
- var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
- if (window.top.location.hash!=hash)
- window.top.location.hash=hash;
-}
-//-->
-</script>
</head>
<body>
@@ -30,24 +19,19 @@ few problems. The following sections discuss some common issues and solutions:
<li><a href="#dynamicalclasscast">Note: ... calls '(...)Class.forName(variable).newInstance()'</a></li>
<li><a href="#dynamicalclassmember">Note: ... accesses a field/method '...' dynamically</a></li>
<li><a href="#descriptorclass">Note: the configuration keeps the entry point '...', but not the descriptor class '...'</a></li>
-<li><a href="#classmembers">Note: the configuration doesn't specify which class members to keep for class '...'</a></li>
<li><a href="#duplicateclass">Note: duplicate definition of program/library class</a></li>
<li><a href="#duplicatezipentry">Warning: can't write resource ... Duplicate zip entry</a></li>
<li><a href="#unresolvedclass">Warning: can't find superclass or interface</a></li>
<li><a href="#unresolvedclass">Warning: can't find referenced class</a></li>
-<li><a href="#superclass">Error: Can't find any super classes of ... (not even immediate super class ...)</a></li>
-<li><a href="#superclass">Error: Can't find common super class of ... and ...</a></li>
<li><a href="#unresolvedclassmember">Warning: can't find referenced field/method</a></li>
<li><a href="#unresolvedenclosingmethod">Warning: can't find enclosing class/method</a></li>
<li><a href="#dependency">Warning: library class ... depends on program class ...</a></li>
<li><a href="#unexpectedclass">Warning: class file ... unexpectedly contains class ...</a></li>
<li><a href="#mappingconflict1">Warning: ... is not being kept as ..., but remapped to ...</a></li>
<li><a href="#mappingconflict2">Warning: field/method ... can't be mapped to ...</a></li>
-<li><a href="#unsupportedclassversion">Error: Unsupported class version number</a></li>
<li><a href="#keep">Error: You have to specify '-keep' options</a></li>
<li><a href="#filename">Error: Expecting class path separator ';' before 'Files\Java\...' (in Windows)</a></li>
<li><a href="#macosx">Error: Can't read [.../lib/rt.jar] (No such file or directory) (in MacOS X)</a></li>
-<li><a href="#startinggui">Internal problem starting the ProGuard GUI (Cannot write XdndAware property) (in Linux)</a></li>
<li><a href="#outofmemoryerror">OutOfMemoryError</a></li>
<li><a href="#stackoverflowerror">StackOverflowError</a></li>
<li><a href="#unexpectederror">Unexpected error</a></li>
@@ -61,13 +45,6 @@ few problems. The following sections discuss some common issues and solutions:
<li><a href="#notobfuscated">Variable names not being obfuscated</a></li>
</ul>
-<h3><a href="#dalvik">Problems while converting to Android Dalvik bytecode</a></h3>
-
-<ul>
-<li><a href="#simexception">SimException: local variable type mismatch</a></li>
-<li><a href="#conversionerror">Conversion to Dalvik format failed with error 1</a></li>
-</ul>
-
<h3><a href="#preverifying">Problems while preverifying for Java Micro Edition</a></h3>
<ul>
@@ -81,9 +58,7 @@ few problems. The following sections discuss some common issues and solutions:
<li><a href="#classnotfoundexception">ClassNotFoundException</a></li>
<li><a href="#nosuchmethodexception">NoSuchMethodException</a></li>
<li><a href="#missingresourceexception">MissingResourceException or NullPointerException</a></li>
-<li><a href="#disappearingannotations">Disappearing annotations</a></li>
<li><a href="#invalidjarfile">Invalid or corrupt jarfile</a></li>
-<li><a href="#invalidjarindexexception">InvalidJarIndexException: Invalid index</a></li>
<li><a href="#invalidclassexception2">InvalidClassException, class loading error, or verification error (in Java Micro Edition)</a></li>
<li><a href="#nosuchfieldormethod">Error: No Such Field or Method, Error verifying method (in a Java Micro Edition emulator)</a></li>
<li><a href="#failingmidlets">Failing midlets (on a Java Micro Edition device)</a></li>
@@ -92,14 +67,14 @@ few problems. The following sections discuss some common issues and solutions:
<li><a href="#classcastexception">ClassCastException: class not an enum</a></li><li><a href="#classcastexception">IllegalArgumentException: class not an enum type</a></li>
<li><a href="#arraystoreexception">ArrayStoreException: sun.reflect.annotation.EnumConstantNotPresentExceptionProxy</a></li>
<li><a href="#compilererror">CompilerError: duplicate addition</a></li>
-<li><a href="#classformaterror1">ClassFormatError: repetitive field name/signature</a></li>
-<li><a href="#classformaterror2">ClassFormatError: Invalid index in LocalVariableTable in class file</a></li>
+<li><a href="#classformaterror">ClassFormatError: repetitive field name/signature</a></li>
<li><a href="#nosuchmethoderror">NoSuchMethodError or AbstractMethodError</a></li>
<li><a href="#verifyerror">VerifyError</a></li>
</ul>
-<h2><a name="processing">Problems while processing</a></h2>
+<a name="processing">&nbsp;</a>
+<h2>Problems while processing</h2>
ProGuard may print out some notes and non-fatal warnings:
@@ -143,17 +118,6 @@ ProGuard may print out some notes and non-fatal warnings:
API. You can switch off these notes by specifying the <a
href="usage.html#dontnote"><code>-dontnote</code></a> option.</dd>
-<dt><a name="classmembers"><b>Note: the configuration doesn't specify which class members to keep for class '...'</b></a></dt>
-
-<dd>Your configuration contains
- a <code>-keepclassmembers/-keepclasseswithmembers</code> option to
- preserve fields or methods in the given class, but it doesn't specify
- which fields or methods. This way, the option simply won't have any
- effect. You probably want to specify one or more fields or methods, as
- usual between curly braces. You can specify all fields or methods with a
- wildcard "<code>*;</code>". You can switch off these notes by specifying
- the <a href="usage.html#dontnote"><code>-dontnote</code></a> option.</dd>
-
<dt><a name="duplicateclass"><b>Note: duplicate definition of program/library class</b></a></dt>
<dd>Your program jars or library jars contain multiple definitions of the
@@ -188,43 +152,22 @@ some more serious warnings:
the Java run-time library. For specifying libraries, use
the <a href="usage.html#libraryjars"><code>-libraryjars</code></a> option.
<p>
- For example, if ProGuard complains that it can't find a
- <code>javax.crypto</code> class, you probably still have to specify
- <code>jce.jar</code>, next to the more common <code>rt.jar</code>.
+ If the class that is reported as missing is a non-public library class,
+ you should specify the <a
+ href="usage.html#dontskipnonpubliclibraryclasses"><code>-dontskipnonpubliclibraryclasses</code></a>
+ option. Common examples are the classes
+ <code>javax.swing.TransferHandler$HasGetTransferHandler</code> and
+ <code>java.util.zip.ZipConstants</code>, which are used as interfaces in
+ some public classes, even though they are only package visible. This
+ option is not set by default for reasons of efficiency. Setting it increases
+ the processing time a bit, but it won't hurt the output in any way.
<p>
If you're missing a library and you're absolutely sure it isn't used
anyway, you can try your luck with the <a
href="usage.html#ignorewarnings"><code>-ignorewarnings</code></a> option,
or even the <a href="usage.html#dontwarn"><code>-dontwarn</code></a>
option. Only use these options if you really know what you're doing
- though.
- <p>
- For example, if you're developing for Android, and ProGuard complains that
- it can't find a <code>java.awt</code> class, then some library that you
- are using is referring to <code>java.awt</code>. This is a bit shady, since
- Android doesn't have this package at all, but if your application works
- anyway, you can let ProGuard accept it with "<code>-dontwarn
- java.awt.**</code>".</dd>
-
-<dt><a name="superclass"><b>Error: Can't find any super classes of ... (not even immediate super class ...)</b><br/><b>Error: Can't find common super class of ... and ...</b></a></dt>
-
-<dd>It seems like you tried to avoid the warnings from the previous paragraph
- by specifying
- <a href="usage.html#ignorewarnings"><code>-ignorewarnings</code></a>
- or <a href="usage.html#dontwarn"><code>-dontwarn</code></a>, but it didn't
- work out. ProGuard's optimization step and preverification step really
- need the missing classes to make sense of the code. Preferably, you would
- solve the problem by adding the missing library, as discussed. If you're
- sure the class that references the missing class isn't used either, you
- could also try filtering it out from the input, by adding a filter to the
- corresponding <a href="usage.html#injars"><code>-injars</code></a> option:
- "<code>-injars
- myapplication.jar(!somepackage/SomeUnusedClass.class)</code>". Hopefully,
- you can access the configuration of your build process for such a
- modification. As a final solution, you could switch off optimization
- (<a href="usage.html#dontoptimize"><code>-dontoptimize</code></a>) and
- preverification
- (<a href="usage.html#dontpreverify"><code>-dontpreverify</code></a>).</dd>
+ though.</dd>
<dt><a name="unresolvedclassmember"><b>Warning: can't find referenced field/method</b></a></dt>
@@ -234,10 +177,19 @@ some more serious warnings:
source file was removed. Try removing all class files, recompiling them,
zipping them up, and running ProGuard again.
<p>
+ If the class member that is reported as missing is actually implemented in
+ a non-public library class, you should specify the
+ <a href="usage.html#dontskipnonpubliclibraryclasses"><code>-dontskipnonpubliclibraryclasses</code></a> option. A common example is
+ the method <code>setLength(int)</code> in the public class
+ <code>java.lang.StringBuilder</code>. This method is actually defined in
+ the package visible superclass
+ <code>java.lang.AbstractStringBuilder</code>, which ProGuard ignores by
+ default.
+ <p>
If your program classes reside in the same packages as library classes,
- and refer to their package visible class members, then you should also
- specify the
- <a href="usage.html#dontskipnonpubliclibraryclassmembers"><code>-dontskipnonpubliclibraryclassmembers</code></a>
+ and refer to their package visible class members, then you should specify
+ the <a
+ href="usage.html#dontskipnonpubliclibraryclassmembers"><code>-dontskipnonpubliclibraryclassmembers</code></a>
option.</dd>
<dt><a name="unresolvedenclosingmethod"><b>Warning: can't find enclosing class/method</b></a></dt>
@@ -258,11 +210,7 @@ some more serious warnings:
classes always remain unchanged. It is therefore impossible to adapt
references from library classes to program classes, for instance if the
program classes are renamed. You should define a clean separation between
- program code (specified with <a
- href="usage.html#injars"><code>-injars</code></a>) and library code
- (specified with <a
- href="usage.html#libraryjars"><code>-libraryjars</code></a>), and try
- again.</dd>
+ program code and library code, and try again.</dd>
<dt><a name="unexpectedclass"><b>Warning: class file ... unexpectedly contains class ...</b></a></dt>
@@ -309,13 +257,6 @@ some more serious warnings:
option in the initial obfuscation step, in order to reduce the risk of
conflicts.</dd>
-<dt><a name="unsupportedclassversion"><b>Error: Unsupported class version number</b></a></dt>
-
-<dd>You are trying to process class files compiled for a recent version of
- Java that your copy of ProGuard doesn't support yet. You should check if
- there is a more recent release
- <a href="http://proguard.sourceforge.net/downloads.html">on-line</a>.</dd>
-
<dt><a name="keep"><b>Error: You have to specify '-keep' options</b></a></dt>
<dd>You either forgot to specify <a
@@ -325,6 +266,7 @@ some more serious warnings:
these. Without the proper seed specifications, ProGuard would shrink,
optimize, or obfuscate all class files away.</dd>
+
<dt><a name="filename"><b>Error: Expecting class path separator ';' before 'Files\Java\</b>...<b>'</b> (in Windows)</a></dt>
<dd>If the path of your run-time jar contains spaces, like in "Program Files",
@@ -340,16 +282,6 @@ some more serious warnings:
the path <code>&lt;java.home&gt;/lib/rt.jar</code> by
<code>&lt;java.home&gt;/../Classes/classes.jar</code>.</dd>
-<dt><a name="startinggui"><b>Internal problem starting the ProGuard GUI (Cannot write XdndAware property)</b> (in Linux)</a></dt>
-
-<dd>In Linux, at least with Java 6, the GUI may not start properly, due to
- <a href="http://bugs.sun.com/view_bug.do?bug_id=7027598">Sun
- Bug #7027598</a>. The work-around at this time is to specify the JVM
- option <code>-DsuppressSwingDropSupport=true</code> when running the
- GUI.</dd>
-
-<dd>
-
</dl>
<p>
@@ -372,7 +304,7 @@ Should ProGuard crash while processing your application:
size of the Java virtual machine (with the usual <code>-Xss</code> option)
should help too. In practice however, the <code>-Xss</code> setting
doesn't have any effect on the main thread, due to <a
- href="http://bugs.sun.com/view_bug.do?bug_id=4362291">Sun Bug
+ href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4362291">Sun Bug
#4362291</a>. As a result, this solution will only work when running
ProGuard in a different thread, e.g. from its GUI.</dd>
@@ -394,7 +326,8 @@ Should ProGuard crash while processing your application:
</dl>
<p>
-<h2><a name="afterprocessing">Unexpected observations after processing</a></h2>
+<a name="afterprocessing">&nbsp;</a>
+<h2>Unexpected observations after processing</h2>
If ProGuard seems to run fine, but your processed code doesn't look right,
there might be a couple of reasons:
@@ -430,13 +363,7 @@ there might be a couple of reasons:
<p>
If you are using marker interfaces to keep other classes, the marker
interfaces themselves are probably being removed in the shrinking step.
- You should therefore always explicitly keep any marker interfaces, with
- an option like "<code>-keep interface MyMarkerInterface</code>".
- <p>
- Similarly, if you are keeping classes based on annotations, you may have to
- avoid that the annotation classes themselves are removed in the shrinking
- step. You can explicitly keep all annotation classes in your program code
- with an option like "<code>-keep @interface *</code>".<dd>
+ You should therefore always explicitly keep any marker interfaces.</dd>
<dt><a name="notobfuscated"><b>Variable names not being obfuscated</b></a></dt>
@@ -450,37 +377,8 @@ there might be a couple of reasons:
</dl>
-<h2><a name="dalvik">Problems while converting to Android Dalvik bytecode</a></h2>
-
-If ProGuard seems to run fine, but the dx tool in the Android SDK subsequently
-fails with an error:
-
-<dl>
-<dt><a name="simexception"><b>SimException: local variable type mismatch</b></a></dt>
-
-<dd>This error indicates that ProGuard's optimization step has not been able
- to maintain the correct debug information about local variables. This can
- happen if some code is optimized radically. Possible work-arounds: let the
- java compiler not produce debug information (<code>-g:none</code>), or let
- ProGuard's obfuscation step remove the debug information again
- (by <i>not</i> keeping the attributes <code>LocalVariableTable</code>
- and <code>LocalVariableTypeTable</code>
- with <a href="usage.html#keepattributes"><code>-keepattributes</code></a>),
- or otherwise just disable optimization
- (<a href="usage.html#dontoptimize"><code>-dontoptimize</code></a>).</dd>
-
-<dt><a name="conversionerror"><b>Conversion to Dalvik format failed with error 1</b></a></dt>
-
-<dd>This error may have various causes, but if dx is tripping over some code
- processed by ProGuard, you should make sure that you are using the latest
- version of ProGuard. You can just copy the ProGuard jars
- to <code>android-sdk/tools/proguard/lib</code>. If that doesn't help,
- please report the problem, preferably with the simplest example that still
- brings out the error.</dd>
-
-</dl>
-
-<h2><a name="preverifying">Problems while preverifying for Java Micro Edition</a></h2>
+<a name="preverifying">&nbsp;</a>
+<h2>Problems while preverifying for Java Micro Edition</h2>
If ProGuard seems to run fine, but the external preverifier subsequently
produces errors, it's usually for a single reason:
@@ -511,7 +409,8 @@ Note that it is no longer necessary to use an external preverifier. With the
ProGuard will preverify the class files for Java Micro Edition.
<p>
-<h2><a name="runtime">Problems at run-time</a></h2>
+<a name="runtime">&nbsp;</a>
+<h2>Problems at run-time</h2>
If ProGuard runs fine, but your processed application doesn't work, there
might be several reasons:
@@ -544,15 +443,10 @@ might be several reasons:
<dd>Your code is probably calling something like
<code>myClass.getMethod</code>, trying to find some method dynamically.
- Since ProGuard can't always detect this automatically, you have to keep
- the missing method in using the appropriate <a
+ Since ProGuard isn't detecting this (yet), you have to keep the missing
+ method in using the appropriate <a
href="usage.html#keep"><code>-keep</code></a> option, e.g. "<code>-keep
- class mypackage.MyClass { void myMethod(); }</code>".
- <p>
- More specifically, if the method reported as missing is
- <code>values</code> or <code>valueOf</code>, you probably have to keep
- some methods related to <a
- href="examples.html#enumerations">enumerations</a>.</dd>
+ class mypackage.MyClass { void myMethod(); }</code>".</dd>
<dt><a name="missingresourceexception"><b>MissingResourceException</b> or <b>NullPointerException</b></a></dt>
@@ -566,18 +460,7 @@ might be several reasons:
<p>
Furthermore, directory entries in jar files aren't copied, unless you
specify the option <a
- href="usage.html#keepdirectories"><code>-keepdirectories</code></a>.
- Note that Sun advises against calling <code>Class.getResource()</code> for
- directories (<a href="http://bugs.sun.com/view_bug.do?bug_id=4761949">Sun
- Bug #4761949</a>).</dd>
-
-<dt><a name="disappearingannotations"><b>Disappearing annotations</b></a></dt>
-
-<dd>By default, the obfuscation step removes all annotations. If your
- application relies on annotations to function properly, you should
- explicitly keep them with
- <code><a href="usage.html#keepattributes">-keepattributes</a>
- *Annotation*</code>.</dd>
+ href="usage.html#keepdirectories"><code>-keepdirectories</code></a>.</dd>
<dt><a name="invalidjarfile"><b>Invalid or corrupt jarfile</b></a></dt>
@@ -591,17 +474,6 @@ might be several reasons:
manifest file is the one that is copied (the first manifest file that is
encountered), and that the main class is kept in your configuration,</dd>
-<dt><a name="invalidjarindexexception"><b>InvalidJarIndexException: Invalid index</b></a></dt>
-
-<dd>At least one of your processed jar files contains an index file
- <code>META-INF/INDEX.LIST</code>, listing all class files in the jar.
- ProGuard by default copies files like these unchanged. ProGuard may however
- remove or rename classes, thus invalidating the file. You should filter the
- index file out of the input
- (<code>-injars in.jar(!META-INF/INDEX.LIST)</code>) or update the file
- after having applied ProGuard (<code>jar -i out.jar</code>).
- </dd>
-
<dt><a name="invalidclassexception2"><b>InvalidClassException</b>, <b>class loading error</b>, or <b>verification error</b> (in Java Micro Edition)</a></dt>
<dd>If you get such an error in Java Micro Edition, you may have forgotten to
@@ -654,7 +526,7 @@ might be several reasons:
<dd>You may have forgotten to sign your program jar <i>after</i> having
processed it with ProGuard.</dd>
-<dt><a name="classcastexception"><b>ClassCastException: class not an enum</b>, or <br /><b>IllegalArgumentException: class not an enum type</b></a></dt>
+<dt><a name="classcastexception"><b>ClassCastException: class not an enum</b>, or <br><b>IllegalArgumentException: class not an enum type</b></a></dt>
<dd>You should make sure you're preserving the special methods of enumeration
types, which the run-time environment calls by introspection. The required
@@ -676,7 +548,7 @@ might be several reasons:
<code>sun.tools.java.MethodSet.add</code> in Sun's JDK 1.2.2, which is
used for (dynamic) compilation. You should then avoid this option.</dd>
-<dt><a name="classformaterror1"><b>ClassFormatError: repetitive field name/signature</b></a></dt>
+<dt><a name="classformaterror"><b>ClassFormatError: repetitive field name/signature</b></a></dt>
<dd>You are probably processing some code that has been obfuscated before with
the <a
@@ -684,14 +556,6 @@ might be several reasons:
option. You should then use the same option again in the second processing
round.</dd>
-<dt><a name="classformaterror2"><b>ClassFormatError: Invalid index in LocalVariableTable in class file</b></a></dt>
-
-<dd>If you are keeping the <code>LocalVariableTable</code> or
- <code>LocalVariableTypeTable</code> attributes, ProGuard's optimizing step
- is sometimes unable to update them consistently. You should then let the
- obfuscation step remove these attributes or disable the optimization
- step.</dd>
-
<dt><a name="nosuchmethoderror"><b>NoSuchMethodError</b> or <b>AbstractMethodError</b></a></dt>
<dd>You should make sure you're not writing your output class files to a
@@ -719,11 +583,10 @@ might be several reasons:
</dl>
-<hr />
-<noscript><div><a target="_top" href="../index.html" class="button">Show menu</a></div></noscript>
+<hr>
<address>
-Copyright &copy; 2002-2011
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2009
+<a href="http://www.graphics.cornell.edu/~eric/">Eric Lafortune</a>.
</address>
</body>
</html>