我最近为我的 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 应用程序启动时不会出现错误。不过,究竟是什么导致了这个特定的错误,这还是很有趣的。