Android google Multidex分包 gradle 3.1.0 坑

项目在很早之前方法数就超过65535,就加了google的Multidex。在第一次加入的无非就是根据api文档中的一步一步的加入到项目中:

基本方案

1、配置APP的build.gradle

在配置文件中增加:

 defaultConfig {

        // Enabling multidex support.
        multiDexEnabled true
}
afterEvaluate {
tasks.matching {
    it.name.startsWith('dex')
}.each { dx ->
    if (dx.additionalParameters == null) {
        dx.additionalParameters = []
    }
    dx.additionalParameters += '--multi-dex'
}

2、在代码中的Application中通过复写attachBaseContext方法中,调用MultiDex.install(this)
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }

当然对于这里网上还有许多优化方案,大家可以针对这边做优化。我这里不在去copy。

这样就可以将项目分成好几个dex文件了,但是这个dex文件里面的方法数是随机的,但是不会超过65535。

问题

今天我想说的坑是最近遇到的配置文件中的问题。由于百度加固中要求每个dex的方法数不要超过65530。之前打出来的三个dex,其中有一个恰好是65532,好吧,每次利用百度加固都不成功,没办法只能去解决限制dex中方法的数量。

通过查找网上各种资料,发现有两种方法:

1、使用gradle中增加--set-max-idx-number=48000

2、第三方的dexnkife,github地址:https://github.com/ceabie/DexKnifePlugin。使用这种方式没有成功,就决定采用第一种方式。

在gradle中增加了

afterEvaluate {
tasks.matching {
    it.name.startsWith('dex')
}.each { dx ->
    if (dx.additionalParameters == null) {
        dx.additionalParameters = []
    }
    dx.additionalParameters += '--multi-dex'
   dx.additionalParameters += '--set-max-idx-number=48000'
}

发现不起任何作用,好吧又查找资料发现这种方式gradle1.5.0之后分包的方式已经换成下面这种方式

    dexOptions {
        javaMaxHeapSize "3g"
        preDexLibraries  false
        additionalParameters '-multi-dex',
                                '--set-max-idx-number=48000'
    }

加了之后发现还是不起作用,顿时感觉好崩溃。

好在看到了从gradle3.1.0之后dex编译采用D8。所以导致这种分包不成功。将gradle的版本降到3.0.0之后,分包成功,每个dex的方法都不超过48000。

另外也可以采用gradle3.1.0,然后将项目的gradle配置android.enableD8=false //暂时关闭

所以今天的目标就是看看3.1.0之后到底应该怎么设置,才能完成限制分包大小的功能

猜你喜欢

转载自blog.csdn.net/nihaomabmt/article/details/80117706