android MultiDex multidex原理原理下遇见的N个深坑(二)
android MultiDex 原理下遇见的N个深坑(二)
这是在一个论坛看到的问题,其实你不知道MultiDex到底有多坑。
不了解的可以先看上篇文章:android MultiDex multidex原理(一)
解决和遇到的其它问题,请见下一篇文章:android MultiDex 原理下超出方法数的限制问题(三)
遭遇multidex
愉快地写着Android代码的总悟君往工程里引入了一个默默无闻的jar然后Run了一下~~~~ 经过漫长的等待AndroidStudio构建失败了。 看起来是:在试图将 classes和jar塞进一个Dex文件的过程中产生了错误。 第一回合 天真的官方补丁方案 还是先解决打包问题,回头再研究那些高深的动态化加载技术。偷懒一下咯考虑到投入产出比,决定使用Google官方的multiDex解决。(Google的补丁方案啊,不会再有坑了吧?后面才发现还是太天真) 该方案有两步: 步骤2. manifest声明修改 如果有自己的Application,继承MulitDexApplication。如果当前代码已经继承自其它Application没办法修改那也行,就重写 Application的attachBaseContext()这个方法。 run一下,可以了!但是dex过程好像变慢了。。。 文档还写明了multiDex support lib 的局限。瞄一下是什么: 感觉这就是个坑啊。补丁方案又引入一些问题。但是插件化方案要求对现有代码有比较大的改动,代价太大,而且动态化加载框架意味着维护成本更高,会有更多潜在bug。所以先测试,遇到有问题的版本再解决。 第二回合 啥?dexopt failed? 呵呵,部分低端2.3机型(话说2.3版本的android机有高端机型么)安装失败!INSTALL_FAILED_DEXOPT。这个就是前面说的Issue 22586问题。 第三回合 ANR的意思就是Application Not Responding 问题又来了!这次不仅仅是2.3 的机型!还有一些中档配置的4.x系统的机型。问题现象是:第一次安装后,点击图标,1s,2s,3s... 程序没有任何反应就好像你没点图标一样。 第四回合 换一种思路 考虑到刚才说的2,3原因,先不要急着动手写分析脚本。总悟君期望找到更好的方案。问题到现在变成了:既希望在Application的attachContext()方法里同步加载secondary.dex,又不希望卡住UI线程。如果思路限制在线程异步化上,确实不可能实现。于是发现了微信开发团队的这篇文章。该文章介绍了关于这一问题 FB/QQ/微信的解决方案。FB的解决思路特别赞,让Launcher Activity在另外一个进程启动!当然这个Launcher Activity就是用来load dex 的 ,load完成就启动Main Activity。 流程图如下 在Application里面(这里不要再继承自MultiApplication了,我们要手动加载Dex): 这里使用了classes(N).dex的方式保存了后面的dex而不是像微信目前的做法放到assest文件夹。前面有说到ART模式会将多个dex优化合并成oat文件。如果放置在asset里面就没有这个好处了。 替换Activity默认的出现动画 R.anim.null_anim 文件的定义: 如微信开发团队的这篇文章所说,application启动了LoadDexActivity之后,自身不再是前台进程所以怎么hold 线程都不会ANR。 系统何时会对apk进行dexopt总悟君其实并没有十分明白。通过查看安装运行的日志发现,安装的时候packageManagerService会对classes.dex 进行dexopt 。在调用MultiDex.install()加载 secondary.dex的时候,也会进行一次dexopt 。 这背后的流程到底是怎样的?dexopt是如何在另外一个进程执行的?如果是另外一个进程执行为何会阻塞主app的UI进程? 官方文档并没有详细介绍这个,那就RTFSC一探究竟吧. 源代码跟踪比较长,移步到这里看吧。 最终章碎碎念 MultiDex的问题难点在:要持续解决好几个bug才能最终解决问题。进一步的,想要仔细分辨且解决这些bug,就必须持续探索一些关联性的概念和原理 【dex 分包是靠gradle 脚本完成的,如果是第一次安装并且没有点击App图标启动,在没有dexopt 的情况下,非Activity组件启动了Applicatiion就会导致LoadResActivity 出现。 |
-
22.png (58.99 KB, 下载次数: 0)
-
33.png (66.11 KB, 下载次数: 0)
-
4.png (47.88 KB, 下载次数: 0)
-
000.png (15.6 KB, 下载次数: 0)
android MultiDex multidex原理原理下遇见的N个深坑(二)相关推荐
- Android系统在超级终端下必会的命令大全(二)
Android系统在超级终端下必会的命令大全(二) 安装和登录命令 reboot1.作用 reboot命令的作用是重新启动计算机,它的使用权限是系统管理者. 2.格式 reboot [-n] [-w] ...
- Android系统在超级终端下命令大全
Android系统在超级终端下必会的命令大全(一) busybox BusyBox 是标准 Linux 工具的一个单个可执行实现.BusyBox 包含了一些简单的工具,例如 cat 和 echo,还包 ...
- Android分包MultiDex原理详解
MultiDex的产生背景 当Android系统安装一个应用的时候,有一步是对Dex进行优化,这个过程有一个专门的工具来处理,叫DexOpt.DexOpt的执行过程是在第一次加载Dex文件的时候执行的 ...
- [读书笔记] 深入探索Android热修复技术原理 (手淘技术团队)
热修复技术介绍 探索之路 最开始,手淘是基于Xposed进行了改进,产生了针对Android Dalvik虚拟机运行时的Java Method Hook技术--Dexposed. 但该方案对于底层Da ...
- android动画的实现原理,Android动画的实现原理 .
1.动画运行模式 独行模式 中断模式 2.Animation类 每个动画都重载了父类的applyTransformation方法这个方法的主要作用是把一些属性组装成一个Transformation类, ...
- 包含c语言的序列化字符,Android Serializable与Parcelable原理与区别
一.序列化.反序列化是什么? (1) 名词解释 对象的序列化 : 把Java对象转换为字节序列并存储至一个储存媒介的过程. 对象的反序列化:把字节序列恢复为Java对象的过程. (2) 序列化详细解释 ...
- android 版本更新原理,Android系统Recovery工作原理之使用update.zip升级过程分析(二)...
Android系统Recovery工作原理之使用update.zip升级过程分析(二)---update.zip差分包问题的解决 在上一篇末尾提到的生成差分包时出现的问题,现已解决,由于最近比较忙,相 ...
- Android Handler与Looper原理简析
一直感觉自己简直就是一个弱智,最近越来越感觉是这样了,真的希望自己有一天能够认同自己,认同自己. 本文转载于:https://juejin.im/post/59083d7fda2f60005d14ef ...
- Android系统Recovery工作原理之使用update.zip升级过程分析(五)
Android系统Recovery工作原理之使用update.zip升级过程分析(五)---update.zip包从上层进入Recovery服务文章开头我们就提到update.zip包来源有两种,一个 ...
最新文章
- java教学目标_成为Java高手的25个学习目标
- 一个罐子统治一切:Apache TomEE + Shrinkwrap == JavaEE引导
- js 页面所有超链接后加随机数 基于jquery
- Juqery Html(),append()等方法的Bug
- linux简介ubuntu,Linux文件系统简介(基于Ubuntu)
- rstudio的数据集怎么建立和保存_这个40M的小工具助你在windows下处理数据如虎添翼...
- C++ 中结构体的继承关系
- pdd本质上来说,没有什么壁垒
- wordpress functions.php 在哪,实用WordPress functions.php代码收藏 – 来自WordPress Answers
- vSphere与Workstation虚拟机交互的几种方法(四)
- Atitit.信息论原理概论attilax总结
- 基于PC-DIMS脱机软件 的海克斯康三坐标机脱机编程软件手册。
- linux退出热键_LINUX常用快捷键
- matlab好看的字体,最佳50个新鲜+漂亮的字体(2011)
- 基于Windows XP SP3系统下MS08067漏洞攻击
- 计算机培训课堂感言,信息技术培训学习感言.docx
- 这个用PHP开发的全开源商城系统可免费商用
- 菜狗centos7.6安装CDH6.1.1(5.13.2)离线集群安装步骤和遇到的各种坑(笔记)
- 【渝粤教育】广东开放大学 广东开放大学学习指引 形成性考核 (28)
- 和平之翼代码生成器 SHCEU 版 4.0.0 Beta2 版 千年隼公布
热门文章
- lnmp一键安装包 安装php-fpm,LNMP一键安装包的Nginx 502 Bad Gateway错误可能原因及解决方法...
- stable-diffusion-webui 启动服务,卡在浏览器loading中, 重定向解决
- 【干货#001】小程序使用有赞ZanUI
- 发现GDCA USBKey(电子钥匙)的CSP数字签名实现存在缺陷
- 单光感pid巡线_单光感巡线教学设计
- python入门教程之五元组
- iOS OC uibutton添加背景图片后看不到
- 基于netty 实现 ws协议的 im 组件(一)
- Strapi-API服务器 超详细配置使用攻略
- 《ICNet for Real-Time Semantic Segmentation on High-Resolution Images》论文笔记