Android:Proguard NoSuchMethodError

时间:2011-01-17 10:08:18

标签: android eclipse proguard nosuchmethoderror

我最近为Eclipse Android项目激活了ProGuard。在将外部库和动态引用的类添加到proguard.cfg之后,构建apk时我没有遇到任何错误。但是当我尝试启动已安装的应用程序时,我得到了NoSuchMethodError。

我将其缩小为主要活动的onCreate方法中调用的特定方法。为简化起见,这里是类和方法的样子(我遗漏了很多代码,但我认为这应该说明它):

public class TestMain extends TabActivity implements OnSharedPreferenceChangeListener{
    ...

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...
        testMethod();
    }
}

testMethod()定义如下:

private void testMethod() {
    int charsLeft = maxPostMessageLength - someEditText.length();
    ...
}

当我删除“someEditText.length()”部分时,应用程序启动。所以,我看到它的方法,无法找到的方法是EditText.length()方法。但奇怪的是,当我从testMethod中删除“someEditText.length()”并将其直接放入onCreate方法时,应用程序也会启动:

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        test = someEditText.length();
        testMethod();
    }

有谁知道如何摆脱这个错误以及为什么我可以直接在onCreate方法中调用someEditText.length()而不是在onCreate方法调用的方法中? 不使用Proguard,应用程序当然可以正常工作。

编辑: 我在proguard.cfg中尝试了-dontshrink,-dontobfuscate和-dontoptimzie选项。使用-dontoptimize,应用程序启动时没有错误。 但是,究竟是什么导致这个特定错误会很有趣。

4 个答案:

答案 0 :(得分:1)

Proguard文档自豪地说:“ProGuard工具通过删除未使用的代码和重命名类来缩小,优化和混淆代码”。

好吧,在收到你描述的运行时错误之后,我放弃了它的'缩小'部分。我添加了一行

-dontshrink

到proguard.cfg

您可以通过检查文件usage.txt来查看已从代码中删除的例程。 我很高兴地说,在我的项目中它始终缺失,这意味着代码被混淆但没有被删除。我现在没有遇到任何运行时错误。

答案 1 :(得分:1)

我偶然发现了一个可能的解决方案。嗯,它完全适用于我的情况,所以这是原始问题的解决方案: 今天,我首先使用@Override注释实现了一些代码,这些代码不起作用。幸运的是,其他人已经遇到了同样的问题和一个简单的Eclipse相关解决方案: 'Must Override a Superclass Method' Errors after importing a project into Eclipse

现在,我想,如果我之前总是使用Java级别1.5,为什么不再使用-dontoptimize选项再次尝试ProGuard,现在我将其设置为1.6。不能伤害......

我能说什么,现在应用程序启动了,当在方法中调用EditText.length()时,我没有得到奇怪的错误。

答案 2 :(得分:0)

如果得出该方法没有任何副作用的结论,优化器可以删除方法调用和方法。它应该永远不会创建不一致的代码,我不知道这样的问题。您应该检查它是否与最新版本的ProGuard一起存在。否则,您应该在ProGuard网站上提交错误报告,最好用一个小例子说明问题。

答案 3 :(得分:0)

我有一个与OP类似的问题,它最终成为了我设置-allowaccessmodification的proguard配置选项,删除它解决了这个问题。