目录:

  • 一、前言
  • 二、产生原因
  • 三、MultiDex的简要原理
  • 四、MultiDex的使用

一、前言

首先说一下我遇到的情况,最近接手了一个项目是在已有的项目里进行更新添加一些功能,然后该项目导了N多的包,在我使用Android Studio的run”App”直接安装到手机上运行是正常的,然后正式打包安装后就崩溃了,当时觉得很奇怪,然后一看日志:

trouble writing output: 
Too many field references: 131000; max is 65536. 
You may try using --multi-dex option.

很明显,方法数65536上限了,那为什么直接运行又没问题呢?

没办法只好查资料:

Note: While using Instant Run, Android Studio automatically configures your app for multidex when your app's minSdkVersion is set to 21 or higher. Because Instant Run only works with the debug version of your app, you still need to configure your release build for multidex to avoid the 64K limit.

大概意思就是:

如果使用Instant Run,当app的minSdkVersion大于或等于21时,Android Studio会自动配置支持multidex,但是仅debug版本有效,release版仍然需要配置multidex来突破64K限制。

原来当android sdk大于21的时候debug自动支持multidex;好了回到正文multidex分包

二、产生原因

在Android系统中,一个App的所有代码都在一个Dex文件里面。Dex是一个类似Jar的存储了多有Java编译字节码的归档文件。因为Android系统使用Dalvik虚拟机,所以需要把使用Java Compiler编译之后的class文件转换成Dalvik能够执行的class文件。这里需要强调的是,Dex和Jar一样是一个归档文件,里面仍然是Java代码对应的字节码文件。当Android系统启动一个应用的时候,有一步是对Dex进行优化,这个过程有一个专门的工具来处理,叫DexOpt。DexOpt的执行过程是在第一次加载Dex文件的时候执行的。这个过程会生成一个ODEX文件,即Optimised Dex。执行ODex的效率会比直接执行Dex文件的效率要高很多。但是在早期的Android系统中,DexOpt有一个问题,也就是这篇文章想要说明并解决的问题。DexOpt会把每一个类的方法id检索起来,存在一个链表结构里面。但是这个链表的长度是用一个short类型来保存的,导致了方法id的数目不能够超过65536个。当一个项目足够大的时候,显然这个方法数的上限是不够的。尽管在新版本的Android系统中,DexOpt修复了这个问题,但是我们仍然需要对低版本的Android系统做兼容。
为了解决方法数超限的问题,需要将该dex文件拆成两个或多个,为此谷歌官方推出了multidex兼容包,配合AndroidStudio实现了一个APK包含多个dex的功能。

三、MultiDex的简要原理

我们以APK中有两个dex文件为例,第二个dex文件为classes2.dex。 
兼容包在Applicaion实例化之后,会检查系统版本是否支持 multidex,classes2.dex是否需要安装。 
如果需要安装则会从APK中解压出classes2.dex并将其拷贝到应用的沙盒目录下。 
通过反射将classes2.dex注入到当前的classloader中。 
下面引入一下官方的文档: 
https://developer.android.com/tools/building/multidex.html#about

四、MultiDex的使用

1、在Gradle中配置使用Multidex

由于Android的Gradle插件在Android Build Tool 21.1开始支持使用multidex,所以我们需要使用Android Build Tools 21.1及以上版本,修改app目录下的build.gradle文件,有两点需要修改。

(1)在defaultConfig中添加multiDexEnabled true这个配置项。 
(2)在dependencies中添加multidex的依赖: 
compile ‘com.android.support:multidex:1.0.1’

2、在Gradle中配置好之后,我们还需要在代码中加入支持multidex的功能,有三种方案可选

方案一:在manifest文件中指定Application为MultiDexApplication,如下:

方案二:写一个Application类并继承MultiDexApplication,并在AndroidManifest.xml的application标签中进行注册(在application标签中增加name属性,并添加自己的Application类名即可),如果不是想重写MultiDexApplication中一些方法的话,还是方案一更方便些。如下:

注册如下:

方案三:如果不想按方案二继承,我们可以重写Application的attachBaseContext方法,注意,这个方法比onCreate方法先执行。具体方法是创建一个新类,继承Application,然后重写attachBaseContext方法,并在AndroidManifest.xml的application标签中进行注册(与方案二注册相同)如下:

对于在AndroidManifest.xml中注册,与方案二的注册相同。

dex分包之--------multidex包的配置使用相关推荐

  1. dex分包方案概述与multidex包的配置使用

    参考资料: Android dex分包方案 Android分包MultiDex原理 <Android开发艺术探索> 博客中间会涉及到dex文件的反编译,参考博文: dex文件的反编译-de ...

  2. Android Multidex(dex分包)

    Android Multidex(dex分包) 分包: 一个dex分成多个dex 什么要分包 单个 Dalvik Executable (DEX) 中, 可调用的最大的引用总数为 65536 ,若超过 ...

  3. 【Android 热修复】热修复原理 ( 多 Dex 打包机制 | 多 Dex 支持 | Dex 分包设置 | 开发和产品风格设置 | 源码资源 )

    文章目录 一.Dex 打包设置 1.多 Dex 支持 2.Dex 分包设置 3.开发和产品风格设置 ( 非必须 ) 二.完整 build.gradle 配置 1.build.gradle 配置 2.d ...

  4. Android dex分包方案 (多dex)

    原文地址: http://my.oschina.net/853294317/blog/308583 当一个app的功能越来越复杂,代码量越来越多,也许有一天便会突然遇到下列现象: 1. 生成的apk在 ...

  5. 微信小程序分包和主包

    微信小程序主包和分包之间的引用关系 一.什么是分包 为什么要分包 分包后项目的构成 分包的加载规则 分包的体积限制 二.普通分包 1. 配置普通分包 2.打包原则 3. 普通分包以及主包之间引用原则 ...

  6. android集成sdk 马甲包,Android配置马甲包

    神马马甲包?可以穿的么?人可以穿么? 无鞋... 大家听得最多的还是马甲账号,道理差不多,注册在多账号,注册的人还是你自己. 这里的马甲由宿主APP,通过配置gradle,生成与原APP除了包名.包I ...

  7. java jar 最大内存大小_Java运行Jar包内存配置的操作

    Java运行Jar包内存配置的操作,内存,大小,空间,最小,这是 Java运行Jar包内存配置的操作 易采站长站,站长之家为您整理了Java运行Jar包内存配置的操作的相关内容. 如下: java - ...

  8. 基于SSM + MySQL的服饰服装购物平台系统的设计与实现源码+论文+包安装配置+讲解视频

    下载:https://download.csdn.net/download/nike8x/83598568 项目介绍: 基于SSM + MySQL的服饰服装购物平台系统的设计与实现源码+论文+包安装配 ...

  9. java mysql SSM实现的校园门户平台网站系统源码+含开题报告与需求分析+包安装配置

    下载地址:https://download.csdn.net/download/ouyangxiaobai123/22174377 项目介绍: java mysql SSM实现的校园门户平台网站系统源 ...

最新文章

  1. 软RAID创建手册-win2003
  2. 42.递归算法---数的划分
  3. python leetcode_leetcode 刷题经验,主力 python
  4. java list 获取索引_java – 获取arrayList中元素的索引
  5. 信号与槽是如何实现的_如何解决wifi信号不好,实现全面覆盖
  6. 邮件怎发送HTML,请问怎么发送HTML电子邮件
  7. snprintf/strncpy/strlcpy速度测试
  8. C++卡常数之内存优化
  9. 单机:Oracle 19C 数据库一键安装
  10. 欢迎体验 | Android 12 开发者预览版 3
  11. 使用POI为Word文档设置阿拉伯数字形式、罗马数字形式的页脚
  12. Python网络爬虫和信息提取
  13. vue3.0导出excel带格式
  14. 手机投屏电脑的开源软件
  15. 基于VBA实现Excel十字交叉高亮显示
  16. 【zotero】从知网万方维普WOS等数据库上导出格式引文-引文格式到zotero中
  17. 国内运营商DM功能介绍
  18. 为什么有争议的王坚把阿里云做起来了?
  19. c语言如何输入输出string类型的数据
  20. python跳一跳脚本详解_微信跳一跳游戏 python脚本辅助得高分

热门文章

  1. 【转】ABP源码分析四十一:ZERO的Audit,Setting,Background Job
  2. Sharepoint学习笔记—ECM系列--4 根据位置设置的默认元数据值(Location-Based Metadata Defaults)
  3. QWidget::size()和QResizeEvent::size()不一定相同!
  4. java中sql之count_按SQL Server中的count()子句分组
  5. if shell 条件语句简写_Shell if条件判断语句用法详解
  6. CCNA-第一篇-基础入门概念
  7. 【LeetCode 2】两数相加(链表)
  8. 【2019南昌邀请赛现场赛 - G】Winner(建图,tarjan缩点 或 贪心)
  9. 【CodeForces - 920E】Connected Components? (dsu,补图连通块,STLset+map,bfs 或bitset)
  10. 【CodeForces - 803D】Magazine Ad(二分答案)