前言
隨著廠里的業(yè)務(wù)越來越多,需求也越來越多,導(dǎo)致開發(fā)的項(xiàng)目也會(huì)隨之變大。因我廠的項(xiàng)目是類似于電商這種的,前段時(shí)間項(xiàng)目有個(gè)新需求,加移動(dòng)客服功能(類似淘寶客服)。在網(wǎng)上找到一些第三方平臺(tái),如環(huán)信,融云都是不錯(cuò)的選擇。結(jié)合開發(fā)者的比較,最后選定了環(huán)信作為這次需求的主力軍。一星期后需求按計(jì)劃完成,也按時(shí)上線給客戶使用。 但是剛上線不久,工作群中很多客戶反應(yīng)不能安裝,這可是個(gè)很嚴(yán)重的問題。當(dāng)時(shí)我很納悶,但奇怪的是也沒有Bug Reporter,而且開發(fā)過程中也一直沒問題,測(cè)試那邊也是通過的。根據(jù)上報(bào)的幾個(gè)用戶的機(jī)型,我初步推斷都是5.0以下的設(shè)備無法啟動(dòng)App,通過優(yōu)測(cè)和云測(cè)的真機(jī)模擬打印出Log后得出判斷,錯(cuò)誤異常居然是這個(gè):

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)
折騰了我好久,因?yàn)長(zhǎng)og打印的是某個(gè)類沒有找到,開始以為是該類的代碼問題,仔細(xì)檢查后發(fā)現(xiàn)根本不應(yīng)該是這個(gè)類引發(fā)的問題。而分別打的兩個(gè)正式包(5.0以上的手以,和5.0以下的手機(jī))設(shè)備報(bào)錯(cuò)都不是同一個(gè)類。剛開始Google的時(shí)候,關(guān)鍵字是NoClassDefFoundError Android,StackoverFlow上網(wǎng)友遇到的是Eclipse的路徑配置問題,和我遇到的不是同一個(gè)Bug,還有就是導(dǎo)入第三方依賴module,的時(shí)候出現(xiàn)的問題。我反反復(fù)復(fù)檢查好好幾遍,也按官方的文檔配制還是沒有解決。為此我還特意的的去請(qǐng)教了第三方的技術(shù)之持,但是他們直接說你不是我們正式用戶有問題自行解決,就在希望快崩潰的時(shí)候,再次Google NoClassDefFoundError Android Studio發(fā)現(xiàn)該問題描述和我遇到的一模一樣,回想在起平安科技時(shí)遇到過Configure Apps with Over 64K Methods該問題,檢查后發(fā)現(xiàn)Application并沒繼承MultiDexApplication。
解決方法:
一、配置build.gradle (app)
android {
??????? compileSdkVersion 22
???????? buildToolsVersion "23.3.0"
defaultConfig {
????????? minSdkVersion 15
????????? targetSdkVersion 22
????????? // Enabling multidex support. 開關(guān)
????????????? multiDexEnabled true
}
dependencies {
?????? // 添加依賴
????????? compile 'com.android.support:multidex:1.0.0'
}
二、使用自定義的Application繼承MultiDexApplication這個(gè)類,或者重寫Application的方法attachBaseContext(),并調(diào)用MultiDex.install();
@Override
protected voidattachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(base);
}
三、到項(xiàng)目的根目錄下執(zhí)行? ./gradlew clean build
總結(jié):
隨著互聯(lián)網(wǎng)發(fā)展的越來越快,公司迭代項(xiàng)目也會(huì)越來越快,用到第三方的框架也越來越多。因此,遇到的問題也會(huì)各種奇葩。Android 5.0以下出現(xiàn) java.lang.NoClassDefFoundError:這個(gè)問題糾結(jié)了我快兩天,試了各種方法,也請(qǐng)教了朋友。在此把它分享出來,希望在開發(fā)的過程中有遇到如此情況的朋友給予幫助。