现在热修复、插件化是一个比较流行的趋势。qq空间的超级补丁方案、微信的Tinker前提都是需要分包。网上找了很多资料,大多都是eclipse中的分包方法。
查看dex方法数的一个网址:http://inloop.github.io/apk-method-count/
下面给出AS中的一个分包方法。
首先gradle的配置:
defaultConfig {
。。。。。
multiDexEnabled = true
}
只要设置true就行,我的是AS2.1 和 gradle2.1.0,不需要额外complie multidex包了,编译器会自动导入最新的multidex包。
这里我们使用一个第三方的包dexnkife来完成分包的配置:
https://github.com/ceabie/DexKnifePlugin
配置方法:
在project的build.gradle加入
buildscript {
....
dependencies {
....
classpath 'com.android.tools.build:gradle:2.2.0-beta2' // or other
classpath 'com.ceabie.dextools:gradle-dexknife-plugin:1.5.6'
}
}
在app的build.gradle加入
apply plugin: 'com.ceabie.dexnkife'
在project的新建dexknife.txt文件,在其中添加dex的分包配置。
# 如果你想要某个包路径在maindex中,则使用 -keep 选项,即使他已经在分包的路径中.
-keep android.support.v4.view.**
# 这条配置可以指定这个包下类在第二dex中.
android.support.v?.**
com.fooww.soft.android.**
# 使用.class后缀,代表单个类.
-keep android.support.v7.app.AppCompatDialogFragment.class
-keep com.fooww.soft.android.Presentation.SplashScreenActivity.class
-keep com.fooww.soft.android.Application.App.class
-keep com.fooww.soft.android.Application.BaseActivity.class
-keep net.bither.util.NativeUtil.class
# 不包含Android gradle 插件自动生成的miandex列表.
-donot-use-suggest
# 不进行dex分包, 直到 dex 的id数量超过 65536.
-auto-maindex
# dex 扩展参数, 例如 --set-max-idx-number=50000
# 如果出现 DexException: Too many classes in --main-dex-list, main dex capacity exceeded,则需要调大数值
-dex-param --set-max-idx-number=50000
# 显示miandex的日志.
-log-mainlist
如果我们想让某个class放在主包,剩下的都在其他包,我们可以先通过先输入包名,指定某个包下的所以class都在第二个dex中,再通过-keep指令,指定某个class在第一个包,这样可以达到了指定某个class在主包的效果。
接下来就只需要编译就行了。系统会自动生成maindexlist.txt也就是主包中的class列表。
这样分包就完成了。
方法二:
由于以上方式不支持as 3.0以上,所以我们这里使用google官方的方法
创建文件multidex.pro,以Proguard的方式手动加入要放到Main.dex中的类。
例如tinker集成时候的配置:
-keep class android.support.multidex.** {*;} -keep class com.tencent.tinker.** {*;}
这样指定的文件就会添加到maindexlist
https://developer.android.com/studio/build/multidex
android { compileSdkVersion globalConfiguration.android.compileSdkVersion defaultConfig { multiDexEnabled true multiDexKeepProguard file('multidex.pro') } }
或者我们可以直接指定maindexlist文件,如下配置即可
android { defaultConfig { multiDexEnabled true }
dexOptions { preDexLibraries = false javaMaxHeapSize "4g" //增加java堆内存大小 additionalParameters = [//dex参数详见 dx --help '--multi-dex',//多分包 '--set-max-idx-number=60000',//每个包内方法数上限 '--main-dex-list='+projectDir+'/maindexlist.txt',//打包进主classes.dex的文件列表 '--minimal-main-dex'//使上一句生效 ] }
}