2014-06-07 80 views
0

當使用ProGuard儘快的第一個活動是顯示給用戶建立自己的Android應用程序,我得到以下錯誤,那麼應用程序徹底崩潰了:的NoSuchMethodError錯誤時Proguard的爲OnClickListener

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: What are the recommended configurations for Proguard?

如果是監聽程序正在跳轉功能,我需要在proguard文件中添加什麼來停止該功能?

我ProGuard的版本是4.7

回答

1

可能對Android SDK中的lib罐子...

-libraryjars /usr/local/src/android-sdk-linux/platforms/android-19/android.jar 
-libraryjars <java.home>/lib/rt.jar 

OR

對於開源API,如解析器,你可以指定「保留'這些軟件包,如下面的示例所示,這些軟件包使用大量的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提示。

+0

感謝您的線索羅伯特這是一個第三方JAR扔東西關閉 – Hevski

1

我試過你的代碼,它適用於我。我發佈什麼對我有用唯一的變化是我在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 
} 
} 

我的猜測是,該功能可在編譯時間,但不能在運行時(preety雖然不太可能)。

+0

感謝您的答案,我有問題的錯誤是一點點的紅鯡魚。 – Hevski

3

得到了答案,錯誤信息是一個紅色的鯡魚。 Robert Rowntree的回答讓我知道第三方軟件包可能會發生什麼。

在本活動中我使用kso​​ap2,機器人組裝-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語句來排除這種可能性。儘管羅伯特朗特里提供了線索來解決這個問題,但答案並不嚴格,所以他會得到正確的答案。謝謝你們

+0

謝謝,解決了我的問題:) –