您的位置:首页 > 移动开发 > Android开发

Android Studio中Dex分包方案

2016-10-20 10:00 316 查看
现在热修复、插件化是一个比较流行的趋势。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的分包配置。

<span style="color:#ff0000;"># 如果你想要某个包路径在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</span>

# 不包含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列表。



编译前:


编译后:


这样分包就完成了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息