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。
---------------------------------------优雅的分割线-------------------