2011-06-30 64 views
3

我有混淆Lite和一个完整的项目都引用一个库项目。在运行时,我得到“NoSuchMethodException myMethod的”错误如何解决Android上的proguard NoSuchMethodException

根据http://proguard.sourceforge.net/index.html#/manual/troubleshooting.html我有以下添加到proguard.cfg

-keep class mypackage.MyClass { void myMethod(); } 

我的方法返回一个字符串,并接受3个字符串参数,所以我加入下面的proguard.cfg

-keep public class com.mycompany.appName.MyClass { 
    String myMethod(String, String, String); 
} 

但我仍然得到同样的错误。

假设我正在构建精简版版本com.mycompany.appName.lite,我假设我不必在添加到proguard.cfg的行中更改程序包名称,因为它是引用的库。

有什么我失踪?谢谢。

+0

好的,我找到了解决方案。我不得不添加String参数的“java.lang”infront。 -keep public class com.mycompany.appName.myClass {java.lang.String myMethod(java.lang.String,java.lang.String); } – Dittimon

回答

4

我发现调试ProGuard是黑魔法,你可能需要验证保持参数是否确实在做他们打算做的。

我用探针法是我创建:

http://code.google.com/p/android-beryl/source/browse/beryl-core/src/org/beryl/diagnostics/Log.java

Log.inspectClass(MyClass.class); 

什么话,我要做的就是监控倾倒真实出来logcat的类定义。您还可以查看proguard /目录中的文件来确定发生了什么。但我觉得这很困难。

你的情况我会先从一个非常宽松的事情开始,先把所有事情都做好,然后再努力收紧这个班级。

-keep class com.mycompany.appName.MyClass { 
    *; 
} 
+2

确保你的通配符也是正确的 - 例如,如果你想让你的上面保持更一般,你可以去保持类com.mycompany.appName。** {*;}。 } –

+0

谢谢CaspNZ,对于那些想要在他们的proguard路径上使用快捷方式的人来说,这是一个很好的提示。 – tos

+0

@CaspNZ我遇到了同样的问题,但是-keep class com.mycompany.appName。** {*; }不工作..任何想法为什么?看到我的线程:http://stackoverflow.com/questions/20818301/app-crashes-on-production-but-not-in-development/20818347?noredirect=1#comment31218866_20818347 –

0

加入Jeremy的解决方案,开始保留整个类,具体解决方案是添加String参数的“java.lang”infront。

-keep public class com.mycompany.appName.myClass { 
    java.lang.String myMethod(java.lang.String, java.lang.String, java.lang.String); 
}