【问题标题】:How to fix proguard NoSuchMethodException on Android如何在 Android 上修复 proguard NoSuchMethodException
【发布时间】:2011-06-30 02:01:48
【问题描述】:

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

根据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 行中的包名称,因为它是一个引用库。

我有什么遗漏吗?谢谢。

【问题讨论】:

  • 好的,我找到了解决方案。我必须在字符串参数的前面添加“java.lang”。 -保持公共类 com.mycompany.appName.myClass { java.lang.String myMethod(java.lang.String, java.lang.String, java.lang.String); }

标签: android obfuscation proguard


【解决方案1】:

我发现调试 ProGuard 是一种黑魔法,您可能需要验证 keep 参数是否确实按照它们的意图进行。

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

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 {
    *;
}

【讨论】:

  • 确保你的通配符也正确 - 例如,如果你想让你的上面保持更通用,你会去 -keep class com.mycompany.appName.** { *; }
  • 谢谢 CaspNZ,对于那些想要在他们的 proguard 路径上走捷径的人来说,这是一个很好的提示。
  • @CaspNZ 我遇到了同样的问题,但是 -keep class com.mycompany.appName.** { *;不工作..任何想法为什么?看我的帖子:stackoverflow.com/questions/20818301/…
【解决方案2】:

除了 Jeremy 的从保留整个类开始的解决方案之外,我的具体解决方案是在字符串参数的前面添加“java.lang”。

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

【讨论】:

    猜你喜欢
    • 2020-09-06
    • 1970-01-01
    • 2016-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多