MultiDex 解决方法数越界

MultiDex

解决方法数越界

资料

Android 开发艺术探索 - 任玉刚

配置

  • 在模组的gradle中配置
android {
    defaultConfig {
        // enable multidex support
        multiDexEnabled true
    }
}
  • Android 5.0 以下需要导包
dependencies {
    compile 'com.android.support:multidex:1.0.1'
}

用法

  • 在自定义Application中初始化,继续加载其他的 dex
  • Application的成员变量和代码块初始化在attachBaseContext方法之前,故不能访问未在主dex中打包的类
@Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
    MultiDex.install(this);
}
  • 或者,直接使用 MultiDexApplication
  • 或者,继承使用 MultiDexApplication

自定义Dex

  • multidex的9个类必须打包到主dex,否则无法继续加载其他dex
  • maindexlist.txt格式,通过脚本或手动生成
com/test/multidextest/TestApplication.class
com/test/multidextest/MainActivity.class

// multidex
android/support/multidex/MultiDex.class
android/support/multidex/MultiDexApplication.class
android/support/multidex/MultiDexExtractor.class
android/support/multidex/MultiDexExtractor$1.class
android/support/multidex/MultiDex$V4.class
android/support/multidex/MultiDex$V14.class
android/support/multidex/MultiDex$V19.class
android/support/multidex/ZipUtil.class
android/support/multidex/ZipUtil$CentralDirectory.class
  • 自定义maindexlist.txt指定主dex中包含的类
afterEvaluate {
    println "afterEvaluate"
    tasks.matching {
        it.name.startsWith('dex')
    }.each { dx ->
        def listFile = project.rootDir.absolutePath + '/app/maindexlist.txt'
        println "root dir:" + project.rootDir.absolutePath
        println "dex task found: " + dx.name
        if (dx.additionalParameters == null) {
            dx.additionalParameters = []
        }
        dx.additionalParameters += '--multi-dex'  // 越界时产生分dex
        dx.additionalParameters += '--main-dex-list=' + listFile  // 主dex中打包的类列表
        dx.additionalParameters += '--minimal-main-dex'  // 只有指定的类才打包到主dex
    }
}

你可能感兴趣的:(MultiDex 解决方法数越界)