2012年3月27日 星期二

更新 Eclipse 後造成 NoClassDefFoundError 或 VerifyError 錯誤的原因和解決方式

早上收到 Facebook 寄來的 Facebook Android SDK 1.2.1 更新通知,就想說來把更新套用到 Bunny Note 裡面好了。打開 Eclipse 後,一如既往地執行 Eclipse 本身的更新和 Android SDK Manager 更新,完成後才把最新版的 Facebook Android SDK 1.2.1 套用進去。嗯,然後試 run 看看有沒有問題,隨便拍張照片、打一些文字準備上傳到 Facebook,沒想到,就在按下「確定」上傳的瞬間,程式掛掉了... WTF,這什麼情況呀!!??難道是 Facebook Android SDK 1.2.1 有問題!?

檢查了一下記錄檔,發現內容有一些奇怪的地方:
03-27 11:43:47.581: W/dalvikvm(4005): VFY: unable to find class referenced in signature (Lcom/dropbox/client2/DropboxAPI;)
03-27 11:43:47.593: I/dalvikvm(4005): Could not find method com.dropbox.client2.DropboxAPI.putFileOverwrite, referenced from method tw.iii.android.project.UploadActivity.uploadItemToDropbox
03-27 11:43:47.597: W/dalvikvm(4005): VFY: unable to resolve virtual method 1203: Lcom/dropbox/client2/DropboxAPI;.putFileOverwrite (Ljava/lang/String;Ljava/io/InputStream;JLcom/dropbox/client2/ProgressListener;)Lcom/dropbox/client2/DropboxAPI$Entry;
03-27 11:43:47.597: D/dalvikvm(4005): VFY: replacing opcode 0x74 at 0x0031
03-27 11:43:47.597: W/dalvikvm(4005): VFY: unable to resolve exception class 353 (Lcom/dropbox/client2/exception/DropboxUnlinkedException;)
03-27 11:43:47.597: W/dalvikvm(4005): VFY: unable to find exception handler at addr 0x115
03-27 11:43:47.597: W/dalvikvm(4005): VFY:  rejected Ltw/iii/android/project/UploadActivity;.uploadItemToDropbox (Ljava/util/HashMap;)Ljava/lang/String;
03-27 11:43:47.597: W/dalvikvm(4005): VFY:  rejecting opcode 0x0d at 0x0115
03-27 11:43:47.597: W/dalvikvm(4005): VFY:  rejected Ltw/iii/android/project/UploadActivity;.uploadItemToDropbox (Ljava/util/HashMap;)Ljava/lang/String;
03-27 11:43:47.597: W/dalvikvm(4005): Verifier rejected class Ltw/iii/android/project/UploadActivity;
03-27 11:43:47.597: W/dalvikvm(4005): Class init failed in newInstance call (Ltw/iii/android/project/UploadActivity;)
03-27 11:43:47.601: D/AndroidRuntime(4005): Shutting down VM
03-27 11:43:47.601: W/dalvikvm(4005): threadid=1: thread exiting with uncaught exception (group=0x40a6a1f8)
03-27 11:43:47.605: E/AndroidRuntime(4005): FATAL EXCEPTION: main
03-27 11:43:47.605: E/AndroidRuntime(4005): java.lang.VerifyError: tw/iii/android/project/UploadActivity
03-27 11:43:47.605: E/AndroidRuntime(4005):  at java.lang.Class.newInstanceImpl(Native Method)
03-27 11:43:47.605: E/AndroidRuntime(4005):  at java.lang.Class.newInstance(Class.java:1319)
03-27 11:43:47.605: E/AndroidRuntime(4005):  at android.app.Instrumentation.newActivity(Instrumentation.java:1023)
03-27 11:43:47.605: E/AndroidRuntime(4005):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1871)
03-27 11:43:47.605: E/AndroidRuntime(4005):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
03-27 11:43:47.605: E/AndroidRuntime(4005):  at android.app.ActivityThread.access$600(ActivityThread.java:123)
03-27 11:43:47.605: E/AndroidRuntime(4005):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
03-27 11:43:47.605: E/AndroidRuntime(4005):  at android.os.Handler.dispatchMessage(Handler.java:99)
03-27 11:43:47.605: E/AndroidRuntime(4005):  at android.os.Looper.loop(Looper.java:137)
03-27 11:43:47.605: E/AndroidRuntime(4005):  at android.app.ActivityThread.main(ActivityThread.java:4424)
03-27 11:43:47.605: E/AndroidRuntime(4005):  at java.lang.reflect.Method.invokeNative(Native Method)
03-27 11:43:47.605: E/AndroidRuntime(4005):  at java.lang.reflect.Method.invoke(Method.java:511)
03-27 11:43:47.605: E/AndroidRuntime(4005):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
03-27 11:43:47.605: E/AndroidRuntime(4005):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
03-27 11:43:47.605: E/AndroidRuntime(4005):  at dalvik.system.NativeStart.main(Native Method)
竟然找不到 DropboxAPI 的位置?我根本沒動過它呀!難道是 Android SDK Manager 更新後的內容搞的鬼?於是便 google 了一下,找到這篇文章,證明我的推測沒錯(針對協力廠商的 jar,ADT 17 中加入了嚴謹的相依性支援,才導致這次的問題。Google 官方的說明文件在這裡),根據文章中的解決方式,就是在 Eclipse 中刪掉原本 Android Dependencies 目錄裡的 jar,然後在專案根目錄下另外建立一個 libs 目錄(如果原本已經有 lib 目錄的則是要將其改名為 libs),然後把所需的 jar 複製進去,如此 Eclipse 便會自行在 Android Dependencies 目錄下新增這些 jar,然後再 clean(不做應該也可以)即可。

↑原本我的 Libraries 索引標籤內有這麼多東西,但是要全部刪掉,只留下最後兩項(Android x.x 和 Android Dependencies)就好

↑修改後的樣子

2 則留言:

匿名 提到...

感謝,遇到同樣問題,有解

匿名 提到...

感謝您,又過了一關。