如何修复Android上的proguard NoSuchMethodException

时间:2011-06-30 02:01:48

标签: android obfuscation proguard

我混淆了Lite和一个引用库项目的完整项目。在运行时我得到“NoSuchMethodException myMethod”错误

根据http://proguard.sourceforge.net/index.html#/manual/troubleshooting.html,我必须将以下内容添加到proguard.cfg

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

我的方法返回一个String并接受3个String参数,所以我将以下内容添加到proguard.cfg

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

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

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

有什么我想念的吗?感谢。

2 个答案:

答案 0 :(得分:5)

我发现调试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 {
    *;
}

答案 1 :(得分:0)

添加Jeremy开始保持整个类的解决方案,对我来说,具体的解决方案是在String参数的前面添加“java.lang”。

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