Android开发之nuwa热修复

相信每个开发者在app版本上线后才发现有一个致命性崩溃的bug时,心中是一万只草泥马在奔跑!

每次发现这种bug,都只好立马上个小版本修复。这种体验着实糟糕。

那我们能不能动态加载一小部分代码来修复这个bug呢?

今天给大家带来了女娲nuwa热修复

一、什么是热修复?

热修复补丁(hotfix),又称为patch,指能够修复软件漏洞的一些代码,是一种快速、低成本修复产品软件版本缺陷的方式。

具体原理可以查看鹅厂qq空间热修复


二、如何使用?

从QQ空间终端开发团队的文章中可以总结出要进行热更新只需要满足下面两点就可以了:
1.动态加载补丁dex,并将补丁dex插入到dexElements最前面
2.要实现热更新,需要热更新的类要防止被打上ISPREVERIFIED标记,关于这个标记,请阅读上面QQ空间团队的文章。
对于第一点,实现很简单,通过DexClassLoader对象,将补丁dex对象加载进来,再通过反射将补丁dex插入到dexElements最前面即可。具体可参考谷歌的Multidex的实现。

而对于第二点,关键就是如何防止类被打上ISPREVERIFIED这个标记。

简单来说,就是将所有类的构造函数中,引用另一个hack.dex中的类,这个类叫Hack.class,然后在加载补丁patch.dex前动态加载这个hack.dex,但是有一个类的构造函数中不能引用Hack.class,这个类就是Application类的子类,一旦这个类的构造函数中加入Hack.class这个类,那么程序运行时就会找不到Hack.class这个类,因为还没有被加载。也就是说,一个类直接引用到的类不在同一个dex中即可。这样,就能防止类被打上ISPREVERIFIED标记并能进行热更新。

至于具体怎么使用,网上很多,请点击该链接


三、有哪些坑?

1.Application类尽可能少引用其他类,以免造成该类被打伤标记无法进行热修复;

2.热修复无法修复xml(特别是manifest)、资源,所以如果你的布局或者manifest出错,尽量看看能否在代码里修改,不能的话那就放弃热修复还是使用常规升级修复;

3.使用命令生成patch.jar时,有修改的类会连同向下依赖的类一起打包进去,因此打出来包比你想象中大点,如果没有打进去,可能会造成ClassNotFoundException错误;


如有转载,请注明出处:http://blog.csdn.net/hjhrq1991

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值