我最近为我的 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/