在Android系统中安装应用的时候,须要对Dex进行优化,但因为其处理工具DexOpt的限制,致使其id的数目不可以超过65536个。而MultiDex兼容包的出现,就很好的解决了这个问题,它能够配合Android Studio实现一个APK包含多个dex的功能。今天小编就和你们详细分享下MultiDex相关概念及具体使用方法。android
一、MultiDex是怎么工做的?编程
对于这个问题,咱们经过具体实例为你们进行分享,以APK中有两个dex文件为例,第二个dex文件为classes2.dex。app
在Android应用安装中,兼容包在Applicaion实例化以后,会检查系统版本是否支持 multidex,classes2.dex是否须要安装。若是须要安装则会从APK中解压出classes2.dex并将其拷贝到应用的沙盒目录下。经过反射将classes2.dex注入到当前的classloader中。ide
二、APP的函数方法超过65K函数
随着Android设备的发展,App包含的功能将愈来愈完善,其大小势必会变得愈来愈大。当咱们在开发App的时候因为报的大小和引用库的缘由,编译项目时候一般会遇到下面这个错误:工具
Conversion <span class="hljs-keyword">to</span> Dalvik format failed: Unable <span class="hljs-keyword">to</span> execute dex: <span class="hljs-function"><span class="hljs-keyword">method</span> <span class="hljs-title">ID</span> <span class="hljs-title">not</span> <span class="hljs-title">in</span> [0, 0<span class="hljs-title">xffff</span>]:</span> <span class="hljs-number">65536</span>测试
固然,也有一些系统设备会出现如下log信息,不过反馈的都是同一个问题:优化
trouble writing output: Too many field references: <span class="hljs-number">131000</span>; <span class="hljs-built_in">max</span> is <span class="hljs-number">65536.</span> You may <span class="hljs-keyword">try</span> <span class="hljs-keyword">using</span> <span class="hljs-comment">--multi-dex option.</span>ui
这两个错误条件显示一个共同的数字:65536。这个数字,它表示的是你在一个dex包中的函数方法超过了65535个。spa
若是你已经构建了一个Android App时,并收到了这个错误,那么表示你有不少代码!为何会出现这个问题,而这个问题又怎么解决呢?且看下面分析。
三、关于65K方法限制
Android开发人员应该都清楚,Android的全部可执行文件都存在dex文件中,其中包含已编译的代码来运行你的应用程序。Dalvik虚拟机对可执行dex文件的规格是有方法限制的,即一个单一的dex文件的方法总数最多为65536,包括:
引用的Android Framework方法、library的方法及编程中写入代码的方法等。
怎么突破限制呢?很简单,就是多生成几个dex文件,而这个多个dex文件,就是multidex方案配置。
Multidex支持Android 5.0以前使用Dalvik Runtime执行程序代码的版本。默认状况下,限制应用到一个单一的classes.dex。
Dalvik字节码文件没APK,为了绕过这个限制,你可使用multidex支持库,成为你的应用程序的主要部分和DEX文件进行管理,得到额外的dex文件,它们包含的代码。
四、避免65K限制
当肯定使用multidex的分包策略时,除了确保你的代码是优秀的代码之外,还须要作到如下两个步骤:
去掉一些未使用的import和library
使用ProGuard去掉一些未使用的代码
五、用Gradle配置使用Multidex
Android 的 Gradle插件在 Android Build Tool 21.1开始就支持使用multidex了。
在应用程序中设置multidex配置,须要对对程序作如下修改:
修改Gradle的配置,支持multidex
修改你的manifest。让其支持multidexapplication类
修改Gradle的build以下:
android { compileSdkVersion <span class="hljs-number">21</span> buildToolsVersion <span class="hljs-string">"21.1.0"</span> defaultConfig { <span class="hljs-keyword">...</span> minSdkVersion <span class="hljs-number">14</span> targetSdkVersion <span class="hljs-number">21</span> <span class="hljs-keyword">...</span> // Enabling multidex support. multiDexEnabled true } <span class="hljs-keyword">...</span> } dependencies { compile <span class="hljs-string">'com.android.support:multidex:1.0.0'</span> }
Tips: 你能够在Gradle配置文件中的 multiDexEnabled 在 defaultConfig、buildType、productFlavor选项设置。
在manifest文件中,添加MultidexApplication Class的引用,以下所示:
<?xml version=<span class="hljs-string">"1.0"</span> encoding=<span class="hljs-string">"utf-8"</span>?> <manifest xmlns:android=<span class="hljs-string">"http://schemas.android.com/apk/res/android"</span> package=<span class="hljs-string">"com.example.android.multidex.myapplication"</span>> <application <span class="hljs-keyword">...</span> android:name=<span class="hljs-string">"android.support.multidex.MultiDexApplication"</span>> <span class="hljs-keyword">...</span> </application> </manifest>
固然,若是你重写了 Application,就对自定义Application的继承方式作一个修改。
六、Multidex的方式的局限性
在上面的介绍中,multidex看起来感受很棒,虽然如此,但multidex仍是存在一些局限性,具体以下:
(1)若是DEX文件太大,安装分割dex文件是一个复杂的过程,可能会致使应用程序无响应(ANR)的错误。在这种状况下,你应该尽可能的减少dex文件的大小和删除无用的逻辑,而不是彻底依赖于multidex。
(2)在Android 4.0设备(API Level 14)以前,因为Dalvik linearalloc bug(问题22586),multidex极可能是没法运行的。若是但愿运行在Level 14以前的Android系统版本,请先确保完整的测试和使用。
(3)应用程序使用了multiedex配置的,会形成使用比较大的内存。固然,可能还会引发dalvik虚拟机的崩溃(issue 78035)。
(4)对于应用程序比较复杂的,存在较多的library的项目。multidex可能会形成不一样依赖项目间的dex文件函数相互调用,找不到方法。
以上就是安卓系统分包MultiDex的原理及使用方法的简单介绍,你们若是在开发中,遇到65K方法限制,不妨可使用这个方法来解决。