Android Stido配置MultiDex解决65k问题

gradle配置:

android {
    ...

    defaultConfig {
        ...
        //支持multidex
        multiDexEnabled true
    }
    ...
    // 保证其他的lib没有被preDex
    dexOptions {
        preDexLibraries = false
    }
}

dependencies {
    ...
    //支持multidex
    implementation 'com.android.support:multidex:1.0.3'
}

代码配置:
第一种,Application直接继承MultiDexApplication(针对没有Application父类的)

public class GlobalApplication extends MultiDexApplication {
...
}

第二种,重写attachBaseContext(针对已有Application父类的)

public class MyApplication extends GlobalApplication {
    ...
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        //支持multidex
        MultiDex.install(this);
    }
}

使用MultiDex的最低版本要求是:

  compileSdkVersion 21
  buildToolsVersion "21.1.0"

可能遇到的问题:NoClassDefFoundError

有些类没有直接引用而并没有打包到dex当中导致classes not found出错,这是在开启multiDex时,多个dex文件中的类是被gradle脚本分配的,而且app在启动时,首先加载的是MainDex。

Android SDK Build Tools 21.1 或者更高版本中的 Gradle Android 插件有对 multidex 的支持。这个插件使用 Proguard 来分析你的项目并在 [buildDir]/intermediates/multi-dex/[buildType]/maindexlist.txt文件中生成一个 app 启动 classes 的列表。但是这个列表并不是100%准确,可能会丢失一些app启动所需的 classes 。

有时候我们需要设定某些类被放到MainDex中避免NoClassDefFoundError错误, 在build.gradle中开启multiDex,并指定配置文件:

android {
    ...

    defaultConfig {
        ...
        //支持multidex
        multiDexEnabled true
        multiDexKeepProguard file('multiDexKeep.pro') // keep specific classes using proguard syntax
        multiDexKeepFile file('multiDexKeep.txt') // keep specific classes
    }
}

注意multiDexKeep.pro和multiDexKeep.txt文件需要自己创建,放在项目的app文件夹下

配置multiDexKeep.pro文件(语法和proguard-rules.pro一样,作用也是混淆相关)

-keepclassmembers class fqcn.of.javascript.interface.for.webview {  
   public *;  
} 

配置multiDexKeep.txt文件,指定类即可,这个是保留在MainDex里的类

扫描二维码关注公众号,回复: 2886794 查看本文章
android/support/design/widget/BaseTransientBottomBar$Behavior.class
android/support/v7/widget/RecyclerView$6.class
android/support/v4/app/FrameMetricsAggregator$MetricType.class
com/transitionseverywhere/Slide$GravityFlag.class
android/support/v7/view/menu/CascadingMenuPopup$3.class
android/support/annotation/VisibleForTesting.class
android/support/v4/media/session/MediaSessionCompatApi21.class
android/support/v4/view/ViewCompat$ViewCompatApi26Impl.class
android/support/v4/view/ViewCompat$ScrollAxis.class
android/support/v4/view/ViewCompat$ViewCompatApi19Impl.class
com/bumptech/glide/annotation/GlideType.class

还有一种方法是将multiDexKeep.txt放到项目的根目录下,在根目录的gradle中添加配置:

// 保证multidex-keep文件中指定的文件都加载到Main Dex中
afterEvaluate {
    tasks.matching {
        it.name.startsWith('dex')
    }.each { dx ->
        if (dx.additionalParameters == null) {
            dx.additionalParameters = []
        }
        dx.additionalParameters += '--multi-dex'
        dx.additionalParameters += "--main-dex-list=$projectDir/multidex-keep.txt".toString()
    }
}

猜你喜欢

转载自blog.csdn.net/lyabc123456/article/details/81868147