在android开发中使用multdex的方法-IT蓝豹为你整理
在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
转载于:https://blog.51cto.com/10716910/1719461
在android开发中使用multdex的方法-IT蓝豹为你整理相关推荐
- dagger android,在Android开发中使用Dagger2的方法
在Android开发中使用Dagger2的方法 发布时间:2020-12-08 17:12:38 来源:亿速云 阅读:236 作者:Leah 在Android开发中使用Dagger2的方法?相信很多没 ...
- Android 开发中Handle 没有handleMessage方法
Android 开发中Handle 没有handleMessage方法 原因是,导入到包不对,应该导入Android的包 import android.os.Handler; 而不是java的包
- android motionevent 坐标,Android开发中MotionEvent坐标获取方法分析
本文实例讲述了Android开发中MotionEvent坐标获取方法.分享给大家供大家参考,具体如下: Android MotionEvent中getX()与getRawX()都是获取屏幕坐标(横), ...
- Android开发中API的查看方法
方法一:可以使用网页版访问:http://developer.android.com/ 方法二:可以使用本地查看的方法,只需在ADT中安装文件即可,如下图所示点击箭头所示按钮Android SDK M ...
- Android开发中调用系统窗口的方法
//直接拨号 Intent callIntent = new Intent(Intent.ACTION_CALL,Uri.parse("tel:12345678")); start ...
- Android开发中遇到的问题(四)——Android中WARNING: Application does not specify an API level requirement!的解决方法
Android开发中遇到的问题(四)--Android中WARNING: Application does not specify an API level requirement!的解决方法 参考文 ...
- Android开发中常见的内存泄露案例以及解决方法总结
Android开发中常见的内存泄露案例以及解决方法总结 参考文章: (1)Android开发中常见的内存泄露案例以及解决方法总结 (2)https://www.cnblogs.com/shen-hua ...
- Android开发中保存数据的四种方法方法
本文来自:安卓航班网 在Android开发中我们会接触到四种数据存储方式,每种存储方式都各有不同:以下安卓航班分别列举了Android开发中的不同存储方式的特点. 一,Preferences Pref ...
- 关于android开发中startActivityForResult废弃的替换方法调用
关于android开发中startActivityForResult废弃的替换方法调用 在最近一段时间中,能在开发时看到在android studio中,startActivityForResult方 ...
最新文章
- [Silverlight] UI 测试/UI 自动化相关知识
- python k线合成_手把手教你写一个Python版的K线合成函数
- 高智商孩子14个独有的特点
- 数学建模亚太赛优秀论文_2019亚太地区大学生数学建模竞赛志愿者等级评定结果公布!...
- 让windows cmd也用上linux命令
- java thread 几个状态_Java-Thread 线程的几种状态
- api token 什么意思_还分不清 Cookie、Session、Token、JWT?
- Sql Server中清空所有数据表中的记录
- Opencv环境配置
- .net dll反编译出现的问题,以及部分修复的方法
- 怎么使用USB Redirector远程共享软件加密狗
- mt管理器主题修改教程_手机全局主题:美乐蒂
- 中国移动的呼叫转移呼叫等待等设置方法 USSD MMI
- 颜色值RGB转换为HEX(十六进制)
- python中quadratic,Python: Using CVXOPT for quadratic programming
- Laravel 6 结合网易/阿里邮箱基本邮件发送功能使用
- 【华为OD机试】1038 - 学英语
- Win硬件 - 西部数据绿盘、蓝盘、黑盘、红盘和紫盘有什么区别?
- Chromium for windows (2015)
- 恐惧贪婪指数(Fear Greed Index)