Android Studio中Dex分包方案

现在热修复、插件化是一个比较流行的趋势。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列表。

Android Studio中Dex分包方案_第1张图片

编译前:Android Studio中Dex分包方案_第2张图片

编译后:Android Studio中Dex分包方案_第3张图片

这样分包就完成了。

方法二:

由于以上方式不支持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'//使上一句生效
    ]
}
}

 

你可能感兴趣的:(android常见问题)