文档章节

在android开发中使用multdex的方法-IT蓝豹为你整理

抉择很难
 抉择很难
发布于 2015/12/04 11:08
字数 1413
阅读 179
收藏 5

在android开发中使用multdex的方法-IT蓝豹为你整理

Android系统在安装应用时,往往需要优化Dex,而由于处理工具DexOpt对id数目的限制,导致其处理的数目不能超过65536个,因此在Android开发中,需要使用到MultiDex来解决这个问题,MultiDex可以配合Android Studio实现一个apk包含多个dex的功能,现在就让我们来看看MultiDex究竟是怎么一回事?

 

1、MultiDex的工作原理

关于这个问题,以APK中有两个dex文件为例,第二个dex文件为classes2.dex。

在 Android应用安装中,兼容包在Applicaion实例化之后,会检查系统版本是否支持 multidex,classes2.dex是否需要安装,如果需要安装则会从APK中解压出classes2.dex并将其拷贝到应用的沙盒目录下。通 过反射将classes2.dex注入到当前的classloader中。

2、APP的函数方法超过65K

随着Android设备的发展,App包含的功能将越来越完善,其大小势必会变得越来越大。当在开发App的时候由于报的大小和引用库的原因,编译项目时候通常会遇到下面这个错误:

Conversion <spanclass="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> <spanclass="hljs-title">not</span> <spanclass="hljs-title">in</span> [0, 0<spanclass="hljs-title">xffff</span>]:</span> <spanclass="hljs-number">65536</span>

当然,也有一些系统设备会出现以下log信息,不过反馈的都是同一个问题:

trouble writingoutput: Too many field references: <spanclass="hljs-number">131000</span>; <spanclass="hljs-built_in">max</span> is <spanclass="hljs-number">65536.</span> You may <spanclass="hljs-keyword">try</span> <spanclass="hljs-keyword">using</span> <spanclass="hljs-comment">--multi-dex option.</span>

这两个错误条件显示一个共同的数字:65536。这个数字,它表示的是你在一个dex包中的函数方法超过了65535个。

如果你已经构建了一个AndroidApp时,并收到了这个错误,那么表示你有很多代码!为什么会出现这个问题,而这个问题又怎么解决呢?且看下面分析。

3、关于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文件和它们所包含的代码。

4、避免65K限制

当确定使用multidex的分包策略时,除了确保你的代码是优秀的代码以外,还需要做到以下两个步骤:

去掉一些未使用的import和library

使用ProGuard去掉一些未使用的代码

5、用Gradle配置使用Multidex

Android 的 Gradle插件在 Android Build Tool 21.1开始就支持使用multidex了。

在应用程序中设置multidex配置,需要对对程序做以下修改:

修改Gradle的配置,支持multidex

修改你的manifest。让其支持multidexapplication类

修改Gradle的build如下:

android { compileSdkVersion <spanclass="hljs-number">21</span> buildToolsVersion <spanclass="hljs-string">"21.1.0"</span> defaultConfig { <spanclass="hljs-keyword">...</span> minSdkVersion <span class="hljs-number">14</span> targetSdkVersion <spanclass="hljs-number">21</span> <spanclass="hljs-keyword">...</span> // Enabling multidex support. multiDexEnabled true } <span class="hljs-keyword">...</span> } dependencies { compile <spanclass="hljs-string">'com.android.support:multidex:1.0.0'</span>}

在manifest文件中,添加MultidexApplication Class的引用,IT蓝豹为你演示:

<?xmlversion=<span class="hljs-string">"1.0"</span>encoding=<spanclass="hljs-string">"utf-8"</span>?><manifest xmlns:android=<spanclass="hljs-string">"http://schemas.android.com/apk/res/android"</span> package=<spanclass="hljs-string">"com.example.android.multidex.myapplication"</span>> <application <spanclass="hljs-keyword">...</span> android:name=<spanclass="hljs-string">"android.support.multidex.MultiDexApplication"</span>> <spanclass="hljs-keyword">...</span> </application> </manifest>

当然,如果重写了 Application,就对自定义Application的继承方式做一个修改。

6、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的原理及使用方法的简单介绍,如果在Android开发中,遇到65K方法限制,可以尝试使用MultiDex来解决。


本文作者:《IT蓝豹》:www.itlanbao.com

© 著作权归作者所有

抉择很难
粉丝 6
博文 51
码字总数 26157
作品 0
海淀
程序员
私信 提问
IT蓝豹强烈推荐:符合1-2年工作经验,开发中的难点及相关优化:

IT蓝豹强烈推荐:符合1-2年工作经验,开发中的难点及相关优化: IT蓝豹 ------------------> sqlite数据库版本升级 1.sqlite升级步骤: 1.自己写一个类继承自SqliteOpenHelper 2.会实现Sqlit...

抉择很难
2015/10/29
169
0
Android开发学习路线图扎实学好每一步-IT蓝豹为你规划。

Android开发学习路线图扎实学好每一步-IT蓝豹为你规划。 一些没有接触过Android知识又想学习Android开发的人,看到一行行密密麻麻的代码会感觉到压力,失去学习的信心。其实Android开发并没有...

拼一把
2015/12/04
141
0
Android 工程师如何快速学会web前段

Android 工程师如何快速学会web前段 今天主要聊一下本人最近在学习web前段的感受,最近html5是越来越火了,前段时间公司做了一个项目然后让我们“android”的程序猿过去帮忙把客户 端框架搭建...

抉择很难
2015/11/19
107
0
程序员挑战高薪,你必须会的十大面试题《一》

程序员挑战高薪,你必须会的十大面试题《一》 IT蓝豹 1:Android中五种数据存储方式分别是什么?他们的特点? (1)SharedPreference,存放较少的五种类型的数据,只能在同一个包内使 用,生成...

抉择很难
2015/11/18
193
0
如何解决:Android中 Error generating final archive: D...

问题概述: 在导入一个app后提示如下错误: “Error generating final archive: Debug Certificate expired on 10/09/18 16:30” 原因分析: android要求所有的程序必须有签名,否则就不会安...

岭南六少
2012/04/18
280
0

没有更多内容

加载失败,请刷新页面

加载更多

32位与64位Linux系统下各类型长度对比

64 位的优点:64 位的应用程序可以直接访问 4EB 的内存和文件大小最大达到4 EB(2 的 63 次幂);可以访问大型数据库。本文介绍的是64位下C语言开发程序注意事项。 1. 32 位和 64 位C数据类型...

mskk
30分钟前
6
0
Vue 实现点击空白处隐藏某节点(三种方式:指令、普通、遮罩)

在项目中往往会有这样的需求: 弹出框(或Popover)在 show 后,点击空白处可以将其 hide。 针对此需求,整理了三种实现方式,大家按实际情况选择。 当然,我们做项目肯定会用到 UI 框架,常...

张兴华ZHero
36分钟前
7
0
SpringBoot激活profiles你知道几种方式?

多环境是最常见的配置隔离方式之一,可以根据不同的运行环境提供不同的配置信息来应对不同的业务场景,在SpringBoot内支持了多种配置隔离的方式,可以激活单个或者多个配置文件。 激活Profi...

恒宇少年
38分钟前
8
0
PDF修改文字的方法有哪些?怎么修改PDF文件中的文字

PDF修改文字一直以来都是一个难以解决的问题,很多的办公族在办公的时候会有修改PDF文件中的文字的需要,可是PDF文件一般是不能进行编辑和修改的,难道就没有什么办法解决这个问题了嘛?不要...

趣味办公社
41分钟前
5
0
企业组织中采用服务网格的挑战

作者:Christian Posta 译者:罗广明 原文:https://blog.christianposta.com/challenges-of-adopting-service-mesh-in-enterprise-organizations/ 编者按 本文作者介绍了企业组织采用服务网...

jimmysong
50分钟前
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部