聊聊android nuwa使用热修复Nuwa有哪些坑

Android 热修复总结
前段时间热修复这个词非常火,当时只是大体看了一下,今天抽空好好看了一下具体原理.
什么是热修复?简单的说就是用户不用重新下载一个新的apk安装,而是直接下载一个补丁包,通过补丁来替换一些出现bug的类, 当然下载补丁的过程用户一般是感觉不到的,表面上看是直接修复了bug.
原理类似与插件开发,关于插件开发原理,看这篇,其中介绍了一下java中的类加载器和android中的类加载器. 热修复就是利用android中的 DexClassLoader类加载器,动态加载补丁dex,替换有bug的类
已有的热修复解决方案:
这几个库的原理都类似,具体描述可以查看这篇.
切入点想修复方法? 方法在哪里? 方法都包含在类中. 类在哪里? 类被包含在dex中,而
最根本的来源是下面这段代码:
123456789101112public Class findClass(String name) {
for (Element element : dexElements) {
DexFile dex = element.dexF
if (dex != null) {
Class clazz = dex.loadClassBinaryName(name, definingContext);
if (clazz != null) {
return null;}可以看出呢,BaseDexClassLoader中有个pathList对象,pathList中包含一个DexFile的集合dexElements,而对于类加载呢,就是遍历这个集合,通过DexFile去寻找,一个ClassLoader可以包含多个dex文件,每个dex文件是一个Element,多个dex文件排列成一个有序的数组dexElements,当找类的时候,会按顺序遍历dex文件,然后从当前遍历的dex文件中找类,如果找类则返回,如果找不到从下一个dex文件继续查找。
简单来说: 首先找到pathList对象,然后通过反射改变dexElements数组.但是遇到的以下问题: 也就是类被打上了 CLASS_ISPREVERIFIED 标志
1java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation根据QQ空间的文章, 这个错误是因为虚拟机加载类的时候, 当一个类中的直接方法(Direct Method)来自与同一个dex中,那么这个类就会被加上 CLASS_ISPREVERIFIED 标志, 再次通过类加载器加载会出现上面的错误.
解决方案: 在需要加载的类中,引用一个别的dex中的类.这样这个类就不会被加上 CLASS_ISPREVERIFIED 标志了,然后就可以再次加载了. 上面一个开源库的普遍方案就是在类的 默认构造方法 上面添加一个其他dex的引用.
总结于是总体步骤如下:
可能出现bug的类中,引用一下别的dex中的类.
因为1中引用了别的dex,需要先将别的dex加载进来.
现在可以替换bug的类了,加载补丁,通过反射将补丁中的dex放到pathList对象的dexElements数组的前面,完成打补丁.
其中两个注意点:
防止类被加上 CLASS_ISPREVERIFIED 标志(通过修改类默认构造方法)
生成补丁dex(通过dx工具)
若发现bug或建议,欢迎您还未登录!|||
银联基于OpenStack开源技术的金融云平台已运行5年,目前已达数千台级物理服务器规模,本文详解了中国银联基于软件定义网络的下一代金融云研究探索。
本文通过分享美团酒店前端在应用Node进行全栈开发的过程中一些心得,重点介绍了我美团酒店事业部的前后端分离架构,线上内存泄露问题的排查,和所使用的Node服务监控平台PM2.5。
这次更新,引入了Rust的开发者叫它“中间层”(midlevel intermediate representation,MIR)的步骤,这是编译过程中额外的一个步骤,在分析源代码和类型检查之后,LLVM编译器框架和转换成机器码之前。
我们邀请到了国家电网、民生银行、招商银行、长安汽车、广发证券、中国银联、顺丰等企业的云技术掌门人,请他们分享在技术选型、迁移部署、运维实施等方面的经验和心得。
Pivotal’s GemFire的基于内存数据存储团队最近发布了一种新的数据库解决方案,叫做SnappyData,基于GemFire和Apache Spark。
本文为《程序员》无人驾驶技术系列文章的第一篇,深入解析光学雷达(LiDAR)在无人车研发中的应用,包括光学雷达的工作原理,在地图绘制、定位以及障碍物检测等环节的应用,以及面临的挑战。
几个月前,我们讨论到 Uber 决定将原有的整体单一式代码库更换成模块化、更具灵活性的微服务架构。从那时起,Uber 有许多工程师投入了数千小时,改造拓展 Uber 微服务的生态环境。
SQLite是非常优秀的数据库,能够在真实的生产环境中完成一些真正的工作。本文将列出五个作者认为在2016年应当选用 SQLite 的原因。
现在实现GBP的项目比较多,比如OpenStack的GBP,OpenDaylight的GBP和思科的ACI。OpenStack 的GBP除了可以驱动Neutron外,还能和OpenDaylight GBP和思科的ACI集成。本文针对OpenStack的GBP进行阐述。
Multimodal Learning用于面部表情识别,多模态分别表现为图像数据和标记点数据,使用Multimodal Learning对二者融合的意义在于更全面地表现表情信息以及区分不同模态的数据对表情识别的影响。
4月29日,计算机视觉混合现实公司appMagics宣布获得数千万元A轮融资,由极客帮创投领投,紫辉创投跟投,并正式发布FaceMagic SDK 1.0版本。
Hadoop2.x.x版本的底层实现中作了很多优化:用状态机对各种对象生命周期和状态转移进行管理;采用事件机制避免线程同步与阻塞;采用Protocol Buffers优化RPC性能;采用Apache Avro优化日志等。
通过公司的实例来介绍Atlassian工具集在持续交付过程中的优秀应用实践及全面敏捷开发实践+Docker DevOps等话题,帮助团队回归敏捷活动,提高管理能力、并固化敏捷流程,持续进行精准的过程改进。
Mozilla通过在Firefox浏览器中使用并行提高了WebAssembly字节码和asm.js的JavaScript子集的性能,并行使原来顺序执行的程序分成若干个小任务,然后交给不同的CPU去执行。“如果你的程序使用了N个核心,那么速度就可以提升N倍。”
今天我们采访的是国防科学技术大学计算机学院研究员,天河系列超级计算机的骨干研究人员谭郁松。
React Flux 是创建UI 组件的技术框架,而mongoosejs是使得操作mongodb更方便快速,最后通过一个真实的项目可以让学员具备中大型项目的开发经验。
通俗易懂的面向对象编程技术,详细讲解C#.NET编程原理,.NET框架,辅以编程实例,具体的项目案例。从基础知识到项目开发,由入门到精通。 以形象的描术,把...
本课程是以华为指定的ICT认证培训教材《华为路由器学习指南》为主线,全面录制的全实战视频课程。主要内容包括华为AR G3系列路由器所支持的静态NAT、动态NA...
看好编程工资高,也想跨行加入?又因高额的学费而打退堂鼓?现在有个0元入学的机会,还在等什么...
一年又一年,看着别人的薪资都是节节攀升,可自己的薪资却永远都是那么低。也许你只是缺少一次机...
“高薪”是程序员挥之不去的光环,新手程序员月薪就能15000,他们到底都在做什么?
主要内容:VR开发从何入手,走进VR游戏开发的世界,VR硬件演进与其游戏开发注意事项,从0到1 一号店通用推荐平台的搭建,基于ROS的无人驾驶系统,Node.js学习指南等
感受CSDN丰富的服务}

我要回帖

更多关于 android 热补丁 nuwa 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信