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