1. 程式人生 > >Android分包MultiDex:NoClassDefFoundError引發的血案

Android分包MultiDex:NoClassDefFoundError引發的血案

一件thing

holl,hello, helo,咳咳。是的大家又見到了我,沒錯。最近我特麼真的高產似母豬,沒辦法專案問題真的多。專案是一個關於融合跑腿,滴滴打車類似功能的APP。所以引入的第三方包很多。

一個Bug

此時就出現了一個巨大的Bug:

java.lang.NoClassDefFoundError: rx.subscriptions.CompositeSubscription
    at rx.internal.schedulers.CachedThreadScheduler$CachedWorkerPool.<init>(CachedThreadScheduler.java
:60) at rx.internal.schedulers.CachedThreadScheduler.<clinit>(CachedThreadScheduler.java:42) at rx.plugins.RxJavaSchedulersHook.createIoScheduler(RxJavaSchedulersHook.java:90) at rx.plugins.RxJavaSchedulersHook.createIoScheduler(RxJavaSchedulersHook.java:76) at rx.schedulers.Schedulers
.<init>(Schedulers.java:90) at rx.schedulers.Schedulers.getInstance(Schedulers.java:66) at rx.schedulers.Schedulers.io(Schedulers.java:160)

一種cause

由Android Studio的錯誤提醒:java.lang.NoClassDefFoundError , 可以得知是由於分包出現的錯誤,dex/field/class這三個檔案的個數在android裡面都是有限制的,為65535個。而現在由於我在開始的時候就如下面所示進行了設定,於是便沒有65535出現,只有上面所示的錯誤了。

  defaultConfig {
        applicationId "cn.jiayou.dsf.delivery"
        minSdkVersion 16
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"

        multiDexEnabled = true //表示可以進行分包, 用於啟用MultiDex
    }

一個method

  1. 在defaultConfig中新增multiDexEnabled = true

  2. 匯入分包support庫compile ‘com.android.support:multidex:1.0.1’

  3. 用MultiDexApplication替代Application,或者在你application的attachBaseContext()方法中呼叫MultiDex.install()。

OVER,這樣子就解決了!

程式碼_1:

    multiDexEnabled = true //表示可以進行分包, 用於啟用MultiDex

程式碼_2:

 compile 'com.android.support:multidex:1.0.1' //支援包用於5.0以下系統

程式碼_3:

public class MyApp extends Application{
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }

     @Override
    public void onCreate() {
        super.onCreate();
        mContext = this;

女神棒棒噠!

參考文章: