隨着廠裏的業務越來越多,需求也越來越多,導致開發的項目也會隨之變大。因我廠的項目是類似於電商這種的,前段時間項目有個新需求,加移動客服功能(類似淘寶客服)。在網上找到一些第三方平臺,如環信,融雲都是不錯的選擇。結合開發者的比較,最後選定了環信作爲這次需求的主力軍。一星期後需求按計劃完成,也按時上線給客戶使用。 但是剛上線不久,工作羣中很多客戶反應不能安裝,這可是個很嚴重的問題。當時我很納悶,但奇怪的是也沒有Bug Reporter,而且開發過程中也一直沒問題,測試那邊也是通過的。根據上報的幾個用戶的機型,我初步推斷都是5.0以下的設備無法啓動App,通過優測和雲測的真機模擬打印出Log後得出判斷,錯誤異常居然是這個:
工作羣反應手機不能安裝app
java.lang.NoClassDefFoundError:
09-30 15:21:59.889 17700-17700/?E/AndroidRuntime: FATAL EXCEPTION: main
Process: your package,PID: 17700
java.lang.NoClassDefFoundError: com.easemob.chat.EMChatConfig
at com.easemob.chat.EMChat.setAppkey(Unknown Source)
at com.easemob.chat.KefuChat.setAppkey(KefuChat.java:126)
at your package.UI.config.BayeApp.initEMChat(BayeApp.java:98)
at your package.UI.config.BayeApp.onCreate(BayeApp.java:51)
atandroid.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1007)
atandroid.app.ActivityThread.handleBindApplication(ActivityThread.java:4440)
at android.app.ActivityThread.access$1500(ActivityThread.java:141)
atandroid.app.ActivityThread$H.handleMessage(ActivityThread.java:1272)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5113)
at java.lang.reflect.Method.invokeNative(Native Method)
atjava.lang.reflect.Method.invoke(Method.java:515)
atcom.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
atcom.android.internal.os.ZygoteInit.main(ZygoteInit.java:609)
at dalvik.system.NativeStart.main(Native Method)
折騰了我好久,因爲Log打印的是某個類沒有找到,開始以爲是該類的代碼問題,仔細檢查後發現根本不應該是這個類引發的問題。而分別打的兩個正式包(5.0以上的手以,和5.0以下的手機)設備報錯都不是同一個類。剛開始Google的時候,關鍵字是NoClassDefFoundError Android,StackoverFlow上網友遇到的是Eclipse的路徑配置問題,和我遇到的不是同一個Bug,還有就是導入第三方依賴module,的時候出現的問題。我反反覆覆檢查好好幾遍,也按官方的文檔配製還是沒有解決。爲此我還特意的的去請教了第三方的技術之持,但是他們直接說你不是我們正式用戶有問題自行解決,就在希望快崩潰的時候,再次Google NoClassDefFoundError Android Studio發現該問題描述和我遇到的一模一樣,回想在起平安科技時遇到過Configure Apps with Over 64K Methods該問題,檢查後發現Application並沒繼承MultiDexApplication。
解決方法:
一、配置build.gradle (app)
android {
compileSdkVersion 22
buildToolsVersion "23.3.0"
defaultConfig {
minSdkVersion 15
targetSdkVersion 22
// Enabling multidex support. 開關
multiDexEnabledtrue
}
dependencies {
// 添加依賴
compile 'com.android.support:multidex:1.0.0'
}
二、使用自定義的Application繼承MultiDexApplication這個類,或者重寫Application的方法attachBaseContext(),並調用MultiDex.install();
@Override
protected voidattachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(base);
}
三、到項目的根目錄下執行 ./gradlew clean build
總結:
隨着互聯網發展的越來越快,公司迭代項目也會越來越快,用到第三方的框架也越來越多。因此,遇到的問題也會各種奇葩。Android 5.0以下出現 java.lang.NoClassDefFoundError:這個問題糾結了我快兩天,試了各種方法,也請教了朋友。在此把它分享出來,希望在開發的過程中有遇到如此情況的朋友給予幫助。