安卓:Proguard NoSuchMethodError

3

我最近在我的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和-dontoptimize选项。使用-dontoptimize,应用程序可以无错误启动。 但仍然很有趣,究竟是什么导致了这个特定的错误。
4个回答

1
Proguard文档自豪地宣称:“ProGuard工具通过删除未使用的代码和重命名类来缩小、优化和混淆您的代码。”但是,由于出现了像您描述的运行时错误,我放弃了其中的“缩小”部分。我添加了以下这行代码:
-dontshrink

到proguard.cfg文件中

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


谢谢您指引我这个。我尝试了-dontshrink选项,但错误仍然相同。但是,使用-dontoptimize,应用程序可以无错误启动。我已相应地编辑了我的问题。 - Manuel

1

我意外地发现了一个可能的解决方案。在我的情况下,它完全有效,因此这是原始问题的解决方案: 今天,我使用了 @Override 注释实现了一些代码,但起初并没有起作用。幸运的是,其他人已经遇到了同样的问题,并提供了一个简单的与 Eclipse 相关的解决方案: '导入项目到 Eclipse 后出现“必须覆盖超类方法”错误

现在,我想,既然我以前总是使用 Java 1.5 级别,为什么不再尝试一下 ProGuard 呢?这次我将其设置为 1.6,而不使用 -dontoptimize 选项。无妨尝试一下...

我要说的是,现在应用程序启动了,当在一个方法中调用 EditText.length() 时,我不再遇到奇怪的错误。


0

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


0
我遇到了与楼主类似的问题,最后发现是我设置的proguard配置选项-allowaccessmodification导致的,删除这个选项解决了问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接