MultiDex

原文转自:http://coolpers.github.io/multidex/2015/04/13/multidex.html


1.MultiDex的产生背景

当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的功能,详见。

2.MultiDex的简要原理

我们以APK中有两个dex文件为例,第二个dex文件为classes2.dex。

1、 兼容包在Applicaion实例化之后,会检查系统版本是否支持 multidex,classes2.dex是否需要安装。

2、 如果需要安装则会从APK中解压出classes2.dex并将其拷贝到应用的沙盒目录下。

3、 通过反射将classes2.dex注入到当前的classloader中。

3.MultiDex的使用

一、应用程序的修改:

引入multidex兼容包,如果自定义了Application类,则使其继承自MultiDexApplication。否则在manifest文件的application标签中增加android:name=”android.support.multidex.MultiDexApplication”

二、构建脚本修改:

AndroidStudio使用的构建工具是gradle,而我们使用的是ant,所以需要在目前的ant脚本中增加对multidex的支持,步骤如下:

1、 更新AndroidSDK,确保build-tools有21.1.2版本,proguard在4.10以上,并将其添加到系统的环境变量。

2、 运行dx –help如下结果:

–multi-dex选项,开始认为只要将它打开就可以了,但打完包启动后会崩溃,查看log发现有的类在Application类初始化的时候没有被加载,这些类被打包在了第二个dex文件中。

继续看上面的选项列表,–multi-dex选项后面有两个可选的选项。

–main-dex-list=<file>:参数是一个类列表的文件,在该文件中的类会被打包在第一个dex中。

–minimal-main-dex:只有在–main-dex-list文件中指定的类被打包在第一个dex,其余的都在第二个dex文件中。

我们只需要使用–main-dex-list,将Application初始化所需要的类放在一个文件中即可。

3、 生成main-dex-list列表:</br>Android SDK的build-tools中有一个mainDexClasses脚本。

该脚本要求输入一个文件组(包含编译后的目录或jar包),然后分析文件组中的类并写入到–output所指定的文件中,如classes_to_kepp_in_main_dex文件。

4、 –set-max-idx-number:这个选项没有被列出,其能够限定每个dex文件中最大的方法数,这里设置每个dex的最大方法数为52900。

5、 将第二个dex打包到APK中:使用aapt命令,aapt add 。

综上所属,修改后的脚本如下:

<condition property="multi-dex-ospath"value="${basedir}\${outdir}"else="${basedir}/${outdir}" ><os family="windows"/>
</condition>	
<condition property="mainDexClasses" value="${android-build-tools}/mainDexClasses.bat" else="${android-build-tools}/mainDexClasses" ><os family="windows"/>
</condition>	
<path id="commonjars"><fileset dir="${external-libs}"><include name="android-support-*.jar"></include><include name="imageloader_*.jar"></include><include name="clientupdate_*.jar"></include><include name="MaRuntime_*.jar"></include><include name="pushservice-*.jar"></include></fileset>
</path>
<target name="multidex" depends="compile"><echo>dex:Converting compiled files and external libraries into ${outdir}...</echo><path id="inputdir"><pathelement location="${outdir-classes}"/><path refid="commonjars"/></path><property name="files" refid="inputdir"/><condition property="realfiles" value=""${files}"" else="${files}" ><os family="windows"/></condition><exec executable="${mainDexClasses}" failonerror="true" ><arg line="--output ${multi-dex-ospath}/classes_to_kepp_in_main_dex"/><arg value="${realfiles}"/></exec><apply executable="${dx}" failonerror="true" parallel="true"><arg value="--dex" /><arg value="--multi-dex" /><arg value="--main-dex-list=${multi-dex-ospath}/classes_to_kepp_in_main_dex"/><arg value="--set-max-idx-number=52900" /><arg value="--output=${multi-dex-ospath}" /><arg path="${outdir-classes}" /><fileset dir="${external-libs}" includes="*.jar"/><fileset dir="${appsearch-ui-path}/libs" includes="*.jar"><exclude name="android-support-v4.jar"/></fileset></apply>
</target>	
<property name="second_dex" value="classes2.dex" />
<property name="second_dex_path" value="${multi-dex-ospath}/${second_dex}" />	
<target name="seconddex-check"><condition property="has-second"><available file="${second_dex_path}" /></condition>
</target>

打包后运行,程序正常启动。

4. 遇到的问题

1、 mainDexClasses脚本在windows和linux下文件组的参数形式不同。 在windows下,脚本中的shift会将文件分隔符“;”替换成空格,导致参数获取错误,在文件组外部增加双引号,解决了该问题。

2、 生成文件组的jar包通配符问题,使用path和fileset解决了该问题。

3、 multidex兼容包创建目录失败的问题,参见:https://code.google.com/p/android/issues/detail?id=79388&q=multidex%20Failed%20to%20create%20dir&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars

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

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

相关文章

PYTHON得到pdf页数、遍历当前文件夹

#第一步安装PyPDF2 pip install PyPDF2#第二步导入相应的模块 from PyPDF2 import PdfFileReader#第三步&#xff1a;定义相对应的函数 def get_num_pages(file_path):"""获取文件总页码:param file_path: 文件路径:return:"""reader PdfFileRe…

LeetCode 814. 二叉树剪枝(递归)

文章目录1. 题目2. 递归解题1. 题目 给定二叉树根结点 root &#xff0c;此外树的每个结点的值要么是 0&#xff0c;要么是 1。 返回移除了所有不包含 1 的子树的原二叉树。 把只包含0的子树删除&#xff08;断开&#xff09; 来源&#xff1a;力扣&#xff08;LeetCode&…

怎样缓解灾难性遗忘?持续学习最新综述三篇

本文转载自公众号“夕小瑶的卖萌屋”&#xff0c;专业带逛互联网算法圈的神操作 -----》我是传送门 关注后&#xff0c;回复以下口令&#xff1a; 回复【789】 &#xff1a;领取深度学习全栈手册&#xff08;含NLP、CV海量综述、必刷论文解读&#xff09; 回复【入群】&#xf…

美团点评技术年货:900+页电子书,覆盖前端、后台、大数据、算法……

新年将至&#xff0c;年味渐浓。 美团点评技术年货如期而至。 从2013年12月4日发布第一篇文章&#xff0c;一直到今天&#xff0c;美团技术团队官方博客已经走过了6个春秋。 截止目前&#xff0c;我们共发布376篇技术文章&#xff0c;微信公众号&#xff08;meituantech&#x…

论文浅尝 | 基于用户反馈的交互式自然语言回答系统提升机制

本文转载自公众号&#xff1a;图谱学苑。今天介绍的工作是An Interactive Mechanism to Improve Question Answering Systems via Feedback&#xff0c;作者&#xff1a;张欣勃&#xff0c;邹磊&#xff0c;胡森&#xff0c;被CIKM2019接收。本文是一篇与知识库自然语言问答系统…

Android控件默认风格解析之SeekBar

在我们开发的时候常常需要更改原生控件的默认效果&#xff0c;有时候某些控件改起来挺费劲的&#xff0c;比如SeekBar的背景与其ProgressBar的进度粗细或者thumb居中现实与否如果弄错&#xff0c;都是个大麻烦&#xff0c;我曾经就为thumb的居中显示问题浪费了很多很多的时间&a…

基于模板的文字识别结果结构化处理技术

原文链接&#xff1a;https://cloud.tencent.com/developer/article/1425800 嘉宾 | 向宇波编辑 | suiling来源 | AI科技大本营在线公开课出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;随着行业的发展和技术的成熟&#xff0c;文字识别&#xff08;OCR&…

LeetCode 1008. 先序遍历构造二叉树(已知先序,求二叉搜索树)

文章目录1. 题目2. 解题1. 题目 返回与给定先序遍历 preorder 相匹配的二叉搜索树&#xff08;binary search tree&#xff09;的根结点。 示例&#xff1a;输入&#xff1a;[8,5,1,7,10,12]&#xff0c;已知二叉搜索树的先序&#xff08;根左右&#xff09; 输出&#xff1a…

美团开源 Logan Web:前端日志在 Web 端的实现

1.前言 Logan 是美团点评推出的大前端日志系统&#xff0c;支持多端环境运行&#xff0c;可为客户端、Web、小程序等用户端环境提供前端日志的存储、收集、上报及分析能力&#xff0c;能够帮助开发人员快速定位并解决端上问题&#xff0c;便于及时响应用户反馈与排除异常。 201…

推荐一个快速定位深度学习代码bug的炼丹神器!

文 | McGL源 | 知乎写深度学习网络代码&#xff0c;最大的挑战之一&#xff0c;尤其对新手来说&#xff0c;就是把所有的张量维度正确对齐。如果以前就有TensorSensor这个工具&#xff0c;相信我的头发一定比现在更浓密茂盛&#xff01;TensorSensor&#xff0c;码痴教授 Teren…

研讨会 | 知识图谱引领认知智能+

本文转载自公众号&#xff1a;中国计算机学会。本论坛将于 CNCC2019 中国计算机大会第一天&#xff08;10月17日&#xff09;在苏州金鸡湖国际会议中心 A102 会议室举行&#xff0c;共邀微软、阿里巴巴、华为、小米、浙江大学、苏州大学等机构的专家与你探讨。知识图谱是一种用…

LeetCode 617. 合并二叉树

文章目录1. 题目2. 递归解题1. 题目 给定两个二叉树&#xff0c;想象当你将它们中的一个覆盖到另一个上时&#xff0c;两个二叉树的一些节点便会重叠。 你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠&#xff0c;那么将他们的值相加作为节点合并后的新值&…

BIO,NIO,AIO

BIO,NIO,AIO 介绍一、背景1.1 说明1.2 通信技术整体解决的问题二、Java的I/O演进之路2.1 I/O 模型基本说明2.2 I/O模型Java BIOJava NIOJava AIO2.3 BIO、NIO、AIO 适用场景分析三、BIO,NIO,AIO总结一、背景 1.1 说明 ​ 在Java的软件设计开发中&#xff0c;通信架构是不可避…

学PyTorch还是TensorFlow?

在机器学习领域&#xff0c;面对各类复杂多变的业务问题&#xff0c;构建灵活易调整的模型是高阶机器学习工程师必备的工作能力。然而&#xff0c;许多工程师还是有一个想法上的误区&#xff0c;以为只要掌握了一种深度学习的框架就能走遍天下了。事实上&#xff0c;在机器学习…

Bifrost微前端框架及其在美团闪购中的实践

Bifrost&#xff08;英 [‘bi:frɔst]&#xff09;原意彩虹桥&#xff0c;北欧神话中是连通天地的一条通道。而在漫威电影《雷神》中&#xff0c;Bifrost是神域——阿斯加德&#xff08;Asgard&#xff09;的出入口&#xff0c;神域的人通过它自由穿梭于“九界”&#xff08;指…

设计模式之观察者模式在Listview中的应用

有时候我们会有这么一个需求&#xff0c;在Listview的某个Item上有个按钮&#xff0c;点击这个按钮之后呢&#xff0c;需要对其它的item做一些操作&#xff0c;就像下面这个&#xff1a; 采纳按钮点击之前&#xff1a;采纳按钮点击之后&#xff1a; 简单介绍一下这两张图的意…

新书速递 | 《知识图谱:方法、实践与应用》

本文转载自公众号&#xff1a;博文视点Broadview 。互联网促成了大数据的集聚&#xff0c;大数据进而促进了人工智能算法的进步。近年来知识图谱作为AI领域底层技术被越来越多的人谈起。知识图谱的升温得益于新数据和新算法为规模化知识图谱构建提供了新的技术基础和发展条件&a…

Github Star过万的阿里学长独家干货分享

浅梦是我认识的一位浙大计算机系的学长&#xff0c;目前在阿里从事算法相关的工作。无论在学校还是工作中&#xff0c;他都保持着对新知识的学习和分享。他的github star 1w&#xff0c;世界排名700&#xff0c;参与开发的项目下载量接近30w次。主要涉及「推荐系统」&#xff0…

React Native在美团外卖客户端的实践

MRN简介 MRN&#xff08;Meituan React Native&#xff09; 是基于开源的React Native框架改造并完善而成的一套动态化方案&#xff0c;在开发体验上基本能与原生RN保持一致&#xff0c;同时从业务需求的角度满足从开发、构建、测试、部署、运维的工程化需要。解决了一系列痛点…

论文浅尝 | 使用预训练深度模型和迁移学习方法的端到端模糊实体匹配

论文笔记整理&#xff1a;高凤宁&#xff0c;南京大学硕士&#xff0c;研究方向为知识图谱、实体消解。链接&#xff1a;https://doi.org/10.1145/3308558.3313578动机目前实体匹配过程中实体之间的差异比较微妙&#xff0c;不同的情况下可能会有不同的决策结果&#xff0c;导致…