Android热补丁的实现,类的动态替换

本文介绍了Android热补丁的实现原理,通过动态替换dex文件中的类来修复线上bug,避免应用频繁更新。详细阐述了从工程结构、类加载机制到实际操作的步骤,包括创建额外dex文件、加载新dex以及处理类转换过程中的问题。
摘要由CSDN通过智能技术生成

Android系统下,一个企业级的软件如果出bug了怎么办,呵呵,线上错误你敢出一个试试,一但出了,就需要修改bug、打包、重新发布,用户也需要更新软件,不管你怎么想,我是很不爽总是更新。那么有没有方法动态的替换安装后的某些文件,进而达到热补丁的效果?必须有啊!

最近学性大发,学习了一下android动态打补丁的东东。说起来很惭愧,android系统的编程都还ok,但是系统底层的原理却知之甚少,昨天就迈着极度艰难的脚步,照猫画虎实现了热补丁。

简单介绍一下原理,然后我再给出具体的实现过程。

在远古时期。。。。不对,也就几年吧,Android系统下的开发有一个障碍,即工程的函数数量不能超过一65536个,这绝逼是个坑,企业级的工程只能是功能越来越多,随之而来的就是函数方法越来越多,这种增长绝大多数情况下不可逆,所以65536就不够用鸟! so,65536这是为嘛?

android打包的时候会把所有的类文件打包成一个dex,再封成apk,因为索引太短,一个dex文件也就65536这么牛逼,某个版本后,android引入了mutidex技术,也就是可以把类们打包在不同的dex文件下,这就解决了单一dex文件方法数有限的问题。

(我靠,你说这么多废话和热补丁有啥关系。。。。)憋bibi,android系统在加载类的时候就有讲究了。它将这些dex文件作为一个有序列,需要加载一个类时从该序列头开始寻找,一个一个dex文件过,找到了就返回,不再往后找了。像这样:


假设我们有一个类com.hehe.bug类是有问题的,而且已经被打包进了dex文件,那么代码中对bug.class的引用都会调用这个dex中的bug类,但是如果我们动态在这个序列头插入一个新dex叫new_dex,其中包含一个我们已经修复过的同名类com.hehe.bug,当加载类的时候,第一个找到的是修改过的类,就不会再去用后面那个有bug的类了,这就是我们打热补丁的原理,很简单,并不是替换原有的类,而是让系统不去用那个类。


网上也有诸多相关的文章,关于热补丁也有很多现成的框架,原理虽说就这么简单,但是做起来还是要注意很多问题的,有兴趣参考一下:HotFix

---------------------------------------优雅的分割线-------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值