Troubleshooting |
---|
(MyClass)Class.forName(variable).newInstance()
", ProGuard
will list them. Depending on your application, you may need to keep the
mentioned classes with something like "-keep class MyClass
",
or their implementations with something like "-keep class *
implements MyClass
". You can switch off these notes by specifying
the -dontnote
option.
ProGuard may terminate with warnings in a couple of cases:
-keep
options, you either forgot them 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 mark all class files as unused,
and your output jar would be empty.
-libraryjars
option.
If the class that is reported as missing is a non-public library class,
you should specify the -dontskipnonpubliclibraryclasses
option.
If you're missing a library and you're absolutely sure it isn't used
anyway, you can try your luck with the -ignorewarnings
option, or even the -dontwarn
option.
Should ProGuard crash while processing your application:
-verbose
option).
NoClassDefFoundError
, your class path is
probably incorrect. It should at least contain all library jars and, of
course, your processed program jar.
ClassNotFoundException
, your code is
probably calling Class.forName
, trying to create the missing
class dynamically. ProGuard can only detect constant name arguments, like
Class.forName("mypackage.MyClass")
. For variable name
arguments like Class.forName(someClass)
, you have to keep all
possible classes using the -keep
option, e.g. "-keep
class mypackage.MyClass
" or "-keep class * implements
mypackage.MyInterface
".
NoSuchMethodException
, your code is
probably calling something like myClass.getMethod
, trying to
find some method dynamically. Since ProGuard isn't detecting this (yet),
you have to keep the missing method in using the -keep
option, e.g. "-keep class mypackage.MyClass { void myMethod();
}
".
NullPointerException
or if you don't see
any icons, your processed code may be unable to find some resource files.
ProGuard currently simply copies resource files over from the input jars
to the output jar. Their names and contents remain unchanged. If you've
used the -defaultpackage
option, the package names of some
classes may have changed, and along with them, the directory in which they
look for their resource files. It's better not to use this option in these
circumstances.
NoSuchMethodError
or an
AbstractMethodError
, perhaps there's a bug in ProGuard
(gasp!). If so, please contact me, preferably with the simplest example on
which you can find ProGuard to fail.