当使用proguard构建我的android应用程序时,我得到以下错误,一旦第一个活动显示给用户,应用程序就完全崩溃了:
java.lang.NoSuchMethodError: android.content.res.XmlResourceParser.i
at ActivityNewUserSetup.OnClickOKButton()
at ActivityNewUserSetup.onCreate()
at android.app.Activity.performCreate(Activity.java:5231)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
at android.app.ActivityThread.access$800(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5017)
at java.lang.reflect.Method.invokeNative(Method.java)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(NativeStart.java)
它引用的代码在ActivityNewUserSetup类中:
@Override
protected void onCreate(Bundle savedInstanceState)
{
...code omitted for clarity
Button btnOK = (Button) findViewById(R.id.btn_Confirm_Selection);
btnOK.setOnClickListener(OnClickOKButton());
}
View.OnClickListener OnClickOKButton()
{
return new View.OnClickListener()
{
public void onClick(View v)
{
...code omitted for clarity
}
}
}
我已经使用了基本的proguard模板配置文件:
Android: Proguard的推荐配置是什么?如果是侦听器触发函数,我需要在proguard文件中添加什么来阻止它?
我的proguard版本是4.7
得到答案后,错误消息是转移注意力。Robert Rowntree的回答让我知道了第三方软件包可能会发生什么。
在这个活动中,我使用ksoap2-android-assembly-3.2.0.jar,通过将以下内容添加到proguard-project.txt
-ignorewarnings
-keep class org.kobjects.** { *; }
-keep class org.ksoap2.** { *; }
-keep class org.kxml2.** { *; }
-keep class org.xmlpull.** { *; }
它现在可以工作了,所以这里的教训是查看您的第三方Jar文件,并尝试在proguard-project.txt中放入一些KEEP语句,以排除这种可能性。虽然严格来说罗伯特·朗特里并没有给出这个问题的答案,但他提供了一些线索,所以他会得到正确的答案。由于人
可能是android sdk的lib jar…
-libraryjars /usr/local/src/android-sdk-linux/platforms/android-19/android.jar
-libraryjars <java.home>/lib/rt.jar
或
对于像你的解析器这样的开源api,你可以为这些包指定'keep',就像下面使用大量OSS的项目中的示例一样。
-keep class ch.boye.httpclientandroidlib.** { *; }
-keep public class com.mobeta.android.** { *; }
-keep class com.slidingmenu.lib.** { *; }
-keep class org.codehaus.jackson.** { *; }
-keep class org.joda.time.** { *; }
-keep class com.google.android.gms.** { *; }
-keep class com.google.sample.castcompanionlibrary.cast.callbacks** { *; }
-keep class com.google.sample.castcompanionlibrary.cast.dialog.video** { *; }
-keep class com.google.sample.castcompanionlibrary.cast.exceptions** { *; }
-keep class com.google.sample.castcompanionlibrary.cast.player** { *; }
-keep class com.google.sample.castcompanionlibrary.notification** { *; }
-keep class com.google.sample.castcompanionlibrary.remotecontrol** { *; }
-keep class com.google.sample.castcompanionlibrary.utils** { *; }
-keep class com.google.sample.castcompanionlibrary.widgets** { *; }
-keep class android.support.v13.** { *; }
-keep class android.support.v7.** { *; }
-keep class android.support.v4.** { *; }
-keep class com.actionbarsherlock.** { *; }
-keep class com.androidquery.** { *; }
你也可以阅读api的proguard技巧
我试过你的代码,它为我工作。我发布了什么为我工作,唯一的变化是我在onclick侦听器上添加了一个分号,我没有在你的代码中看到。下面是代码:
public class Sample extends Activity {
Button button1;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.sample);
button1 = (Button) findViewById(R.id.button1);
button1.setOnClickListener(OnClickOKButton());
}
View.OnClickListener OnClickOKButton() {
return new View.OnClickListener() {
public void onClick(View v) {
Toast.makeText(Sample.this, "clicked", Toast.LENGTH_SHORT)
.show();
}
};//added semicolon here
}
}
我的猜测是该函数在编译时可用,但在运行时不可用(虽然不大可能)。