dex分包之--------multidex包的配置使用

目录:
  • 一、前言
  • 二、产生原因
  • 三、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中注册,与方案二的注册相同。



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/447049.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android Studio打包和引用aar

一、简介 Android 库在结构上与 Android 应用模块相同。它可以提供构建应用所需的一切内容,包括源代码、资源文件和 Android 清单。不过,Android 库将编译到您可以用作 Android 应用模块依赖项的 Android 归档 (AAR) 文件,而不是在设备上运行…

C++有限状态机的实现

//待完善 有限状态机是一个很常用的技术,在流程控制和游戏AI中都比较实用,因为状态机编程简单又很符合直觉。与有限状态机类似的是设计模式中的状态模式。本文是参考《Programming Game AI by Example》 一、 记得最开始工作时候也接触过有限状态机&…

C++ unsigned char*转化为string的形式

unsigned char*转化为string int main(int argc,char **argv){//unsigned char * 转化为string//参考链接 https://www.itdaan.com/tw/4ff531a5e6651468a5b7c6d95927ba3dunsigned char *foo;unsigned char str[] "Hello world";string strHH;foo str;strHH.append…

我的职业生涯规划(软件工程)

以后笔记先在语雀整理 方便一点https://www.yuque.com/juhao-pqdor/goeie3 整理一下自己的笔记 弥补一下以前没写博客的遗憾吧 二十载求学路将尽,行文至此,思绪万千。求学之路始于家乡,竿转热河,而今终于石门。一路行之如人饮水…

Android设计模式之——Builder模式

一、介绍 Builder模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细的控制对象的构造流程。该模式是为了将构建复杂对象的过程和它的部件解耦,使得构建过程和部件的表示隔离开来。 因为一个复…

Android设计模式之——原型模式

一、介绍 原型模式是一个创建型的模式。原型二字表明了该模型应该有一个样板实例,用户从这个样板对象中复制出一个内部属性一致的对象,这个过程也就是我们俗称的“克隆”。被复制的实例就是我们所称的“原型”,这个原型也是可定制的。原型模…

针对C++异常的学习

源码 头文件 sdf_exception.h #pragma once#include <exception> #include <string>namespace sdf {namespace common{using sdf_error_code_t uint32_t;class SdfException : std::exception{public:explicit SdfException(sdf_error_code_t errorCode) : erro…

Android设计模式之——抽象工厂模式

一、介绍 抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;&#xff0c;也是创建型设计模式之一。前一节我们已经了解了工厂方法模式&#xff0c;那么这个抽象工厂又是怎么一回事呢&#xff1f;大家联想一下现实生活中的工厂肯定都是具体的&#xff0c;也就是说…

Android设计模式之——策略模式

一、介绍 在软件开发中也常常遇到这样的情况&#xff1a;实现某一个功能可以有多种算法或者策略&#xff0c;我们根据实际情况选择不同的算法或者策略来完成该功能。例如&#xff0c;排序算法&#xff0c;可以使用插入排序、归并排序、冒泡排序等。 针对这种情况&#xff0c;…

密码学在区块链隐私保护中的应用学习

身份隐私保护技术 混淆服务 混淆服务的目的在于混淆消息双方的联系&#xff08;如 图 2 所示&#xff09;。当发送方需要告知接收方消息 M 时&#xff0c; 它会首先用接收方的公钥 KB 加密 M&#xff0c;并在密文后 附带真实接收地址 R。为了借助第三方&#xff08;图 2 中的…

值类型和引用类型的区别

一、定义 引用类型表示你操作的数据是同一个&#xff0c;也就是说当你传一个参数给另一个方法时&#xff0c;你在另一个方法中改变这个变量的值&#xff0c;那么调用这个方法是传入的变量的值也将改变。 值类型表示复制一个当前变量传给方法&#xff0c;当你在这个方法中改变…

面向区块链的高效物化视图维护和可信查询论文学习

物化视图介绍 如何维护物化视图仍旧是一个开放问题.在关系数据库中,增量刷新的物化视图维护策略可划分为立即维护和延迟维护两大类.立即维护策略的优点是实现较为简单,在单数据源下不 存在一致性问题;然而该策略将物化视图维护过程嵌入到更新事务之中,延长了更新事务的提交时间…

密码学数字信封的介绍

对称密码和非对称密码 对称密码&#xff1a;加解密运算非常快&#xff0c;适合处理大批量数据&#xff0c;但其密码的分发与管理比较复杂非对称密码&#xff1a;公钥和私钥分离&#xff0c;非常适合密钥的分发和管理 数字信封的定义 如果将对称密码算法和非对称密码算法的优点…

Android设计模式之——状态模式

一、介绍 状态模式中的行为是由状态来决定的&#xff0c;不同的状态下有不同的行为。状态模式和策略模式的结构几乎完全一样&#xff0c;但它们的目的、本质却完全不一样。状态模式的行为是平行的、不可替换的&#xff0c;策略模式的行为是彼此独立、可相互替换的。用一句话来…

Android设计模式之——责任链模式

一、介绍 责任链模式&#xff08;Iterator Pattern&#xff09;&#xff0c;是行为型设计模式之一。什么是”链“&#xff1f;我们将多个节点首尾相连所构成的模型称为链&#xff0c;比如生活中常见的锁链&#xff0c;就是由一个个圆角长方形的铁环串起来的结构。对于链式结构…

目前基于区块链的档案防篡改系统的设计如何实现防篡改

架构设计图 分析 为了保障档案数据的安全性和隐私性&#xff0c;存储档案附件和档案属性存储加密存储在私有IPFS集群&#xff0c;档案的IPFS地址和数字指纹存储在私有区块链上。公有区块链定期存储和检查私有区块链最新不可逆区块的高度和哈希值&#xff0c;以保障私有区块链上…

IPFS的文件存储模式

IPFS是如何进行文件存储的 IPFS采用的索引结构是DHT&#xff08;分布式哈希表&#xff09;&#xff0c;数据结构是MerkleDAG&#xff08;Merkle有向无环图&#xff09; DHT(分布式哈希表) 参考链接MerkleDAG&#xff08;Merkle有向无环图&#xff09; 参考链接MerkleDAG功能…

Android设计模式之——解释器模式

一、介绍 解释器模式&#xff08;Interpreter Pattern&#xff09;是一种用的比较少的行为型模式&#xff0c;其提供了一种解释语言的语法或表达式的方式&#xff0c;该模式定义了一个表达式接口&#xff0c;通过该接口解释一个特定的上下文。在这么多的设计模式中&#xff0c…

在Docker里面安装Ubuntu,并且使用ssh进行连接

创建Ubuntu镜像 1&#xff0c;拉取Ubuntu系统的镜像 docker pull ubuntu2、查看拉取是否成功 docker images3&#xff0c;运行容器 docker run --name 新建的容器的名字 -ti -v /AAA:/BBB -d -p 3316:22 ubuntu(这个是镜像的名字)宿主机根目录中的AAA文件夹就映射到了容器…

Android设计模式之——命令模式

一、介绍 命令模式&#xff08;Command Pattern&#xff09;&#xff0c;是行为型设计模式之一。命令模式相对于其他的设计模式来说并没有那么多的条条框框&#xff0c;其实它不是一个很”规范“的模式&#xff0c;不过&#xff0c;就是基于这一点&#xff0c;命令模式相对于其…