- 1、本文档共20页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
MultiDex工作原理分析和优化方案动态加载技术(插件化)系列已经坑了有一段时间了,不过UP主我并没有放弃治疗哈,相信在不就的未来就可以看到“系统Api Hook模式”和插件化框架Frontia的更新了。今天要讲的是动态加载技术的亲戚 —— MultiDex。他们的核心原理之一都是dex文件的加载。作者:Kaede来源:segmentfault|2016-12-13 22:51?收藏??分享动态加载技术(插件化)系列已经坑了有一段时间了,不过UP主我并没有放弃治疗哈,相信在不就的未来就可以看到“系统Api Hook模式”和插件化框架Frontia的更新了。今天要讲的是动态加载技术的亲戚 —— MultiDex。他们的核心原理之一都是dex文件的加载。MultiDex是Google为了解决“65535方法数超标”以及“INSTALL_FAILED_DEXOPT”问题而开发的一个Support库,具体如何使用MultiDex现在市面已经有一大堆教程(可以参考给 App 启用MultiDex功能),这里不再赘述。这篇日志主要是配合源码分析MultiDex的工作原理,以及提供一些MultiDex优化的方案。Dex的工作机制等等,这个章节讲的不是MultiDex吗,怎么变成Dex了?没错哈,没有Dex,哪来的MultiDex。在Android中,对Dex文件操作对应的类叫做DexFile。在CLASSLOADER 的工作机制中,我们说到:对于 Java 程序来说,编写程序就是编写类,运行程序也就是运行类(编译得到的class文件),其中起到关键作用的就是类加载器ClassLoader。Android程序的每一个Class都是由ClassLoader#loadClass方法加载进内存的,更准确来说,一个ClassLoader实例会有一个或者多个DexFile实例,调用了ClassLoader#loadClass之后,ClassLoader会通过类名,在自己的DexFile数组里面查找有没有那个DexFile对象里面存在这个类,如果都没有就抛ClassNotFound异常。ClassLoader通过调用DexFile的一个叫defineClass的Native方法去加载指定的类,这点与JVM略有不同,后者是直接调用ClassLoader#defineCLass方法,反正最后实际加载类的方法都叫defineClass就没错了??。创建DexFile对象首先来看看造DexFile对象的构方法。public?final?class?DexFile?{?????private?int?mCookie;?????private?final?String?mFileName;?????...??????public?DexFile(File?file)?throws?IOException?{?????????this(file.getPath());?????}?????????public?DexFile(String?fileName)?throws?IOException?{?????????mCookie?=?openDexFile(fileName,?null,?0);?????????mFileName?=?fileName;?????????guard.open(close);?????}?????????private?DexFile(String?sourceName,?String?outputName,?int?flags)?throws?IOException?{?????????mCookie?=?openDexFile(sourceName,?outputName,?flags);?????????mFileName?=?sourceName;?????????guard.open(close);?????}??????static?public?DexFile?loadDex(String?sourcePathName,?String?outputPathName,?????????int?flags)?throws?IOException?{?????????return?new?DexFile(sourcePathName,?outputPathName,?flags);?????}????????public?Class?loadClass(String?name,?ClassLoader?loader)?{?????????String?slashName?=?name.replace(.,?/);?????????return?loadClassBinaryName(slashName,?loader);??
您可能关注的文档
- Linu的x内核复习.docx
- linu的x常见命令.doc
- linux驱的动基础知识讲解.pptx
- Linux驱动开发入门的与实战.ppt
- Li的nux常用命令大全.pdf
- Li的nux虚拟内存管理基础v2.ppt
- LG的A-4100产品安装调试及日常维护.ppt
- LoadRun的ner压力测试笔试题.doc
- Load的Runner压力测试实例步骤.doc
- Load的runner接口压力测试步骤.docx
- 2023年江苏省镇江市润州区中考生物二模试卷+答案解析.pdf
- 2023年江苏省徐州市邳州市运河中学中考生物二模试卷+答案解析.pdf
- 2023年江苏省苏州市吴中区中考冲刺数学模拟预测卷+答案解析.pdf
- 2023年江苏省南通市崇川区田家炳中学中考数学四模试卷+答案解析.pdf
- 2023年江西省吉安市中考物理模拟试卷(一)+答案解析.pdf
- 2023年江苏省泰州市海陵区九年级(下)中考三模数学试卷+答案解析.pdf
- 2023年江苏省苏州市高新二中中考数学二模试卷+答案解析.pdf
- 2023年江苏省南通市九年级数学中考复习模拟卷+答案解析.pdf
- 2023年江苏省南通市海安市九年级数学模拟卷+答案解析.pdf
- 2023年江苏省泰州市靖江外国语学校中考数学一调试卷+答案解析.pdf
文档评论(0)