安卓:Proguard NoSuchMethodError

标签 android eclipse proguard nosuchmethoderror

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

我将其缩小到在主 Activity 的 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 应用程序启动时没有错误。 尽管如此,到底是什么导致了这个特定的错误还是很有趣的。

最佳答案

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

好吧,在遇到您描述的运行时错误后,我放弃了它的“收缩”部分。我添加了行

-dontshrink

到proguard.cfg

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

关于安卓:Proguard NoSuchMethodError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4711942/

相关文章:

Android Studio 4.1 ANDROID_AAPT_IGNORE

Eclipse WTP 不发布 Maven 依赖项

java - Eclipse 中的搜索按钮

java - 在另一个布局上访问 textview

android - 跨多行显示两个 TextViews

android - java.lang.VerifyError : Verifier rejected class: Constructor returning without calling superclass constructor 错误

android - 调试从 Android 开发者控制台错误报告中提取的混淆堆栈跟踪

java - Kotlin与Proguard的反射(reflection)失败

android - Kotlin - 互联网和位置权限问题

java - 测试表的最大值时出错?