Young

MultiDex 手动指定 maindexlist

https://developer.android.com/tools/building/multidex.html

官方在build tool 21.1.0后正式推出分包打包解决方法数量超标65535问题。

dex分包原理:

http://android-developers.blogspot.com/2011/07/custom-class-loading-in-dalvik.html

原理既在编译期将dex分散在多个中,运行期,解压出其他dex并让classloader尝试加载

主要步骤:

增加依赖

compile 'com.android.support:multidex:1.0.0'

配置开关

defaultConfig {
    multiDexEnabled true
}

相比在该版本推出前,打包过程多了几个步骤,

收集所有类(package)
压缩所有类(shrink)
创建mainDexList(建立主dex列表,减小在Application初始化前由于找不到类导致崩溃的可能性)
项目中遇到的问题是在主工程的Application调用了其他aar中的初始化操作,

build tool未检测出来该初始化操作所需要的类,导致初始化无法找到该类。

解决方案:

在主公程build/intermediates/multi-dex中找出maindexlist,

拷贝出来。

自行增加没有被包含进去的类。

增加自定义maindexlist代码。让dex工具强行使用我们生成的maindexlist

afterEvaluate {
    tasks.matching {
        it.name.startsWith('dex')
    }.each { dx ->
        if (dx.additionalParameters == null) {
            dx.additionalParameters = []
        }

        // optional
        dx.additionalParameters += "--main-dex-list=$projectDir/maindexlist.txt".toString() // enable the main-dex-list
        dx.additionalParameters += "--minimal-main-dex" // enable the main-dex-list
    }
}

评论

Proudly published with Hexo