如何在Android上修复Proguard NoSuchMethodException

Dit*_*mon 3 obfuscation android proguard

我已经混淆了Lite和一个完整的项目,它们都引用了一个库项目。在运行时,我收到“ NoSuchMethodException myMethod”错误

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

-keep class mypackage.MyClass { void myMethod(); }
Run Code Online (Sandbox Code Playgroud)

我的方法返回一个String并接受3个String参数,因此我在proguard.cfg中添加了以下内容

-keep public class com.mycompany.appName.MyClass { 
  String myMethod(String, String, String); 
}
Run Code Online (Sandbox Code Playgroud)

但是我仍然遇到同样的错误。

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

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

Jer*_*rds 5

我发现调试ProGuard是不可思议的事情,您可能需要验证keep参数是否确实在按预期进行。

我一直在使用我创建的探测方法:

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

Log.inspectClass(MyClass.class);
Run Code Online (Sandbox Code Playgroud)

然后,我要做的就是监视转储到LogCat的类定义。您也可以查看proguard /目录中的文件以了解发生了什么。但是我觉得这很困难。

对于您的情况,我会从一个非常宽松的地方开始,先保留所有内容,然后再努力加强课堂教学。

-keep class com.mycompany.appName.MyClass {
    *;
}
Run Code Online (Sandbox Code Playgroud)

  • 确保您的通配符也正确无误-例如,如果您想使以上内容更通用,则可以使用-keep类com.mycompany.appName。** {*; } (2认同)