安卓开发扩展(四)简单热修复

版权声明: https://blog.csdn.net/cmwly/article/details/79474593

热修复这个东西说实话只是一种辅助工具,一种应急措施,就像应急通道的情况,不管你楼建的怎么样好,怎么样烂,都必须要留有应急通道,否则一旦出问题就会无法挽救,除非花大力气修补,补完了再让人使用,但是这样的话就会耽误了很长时间, 于是就需要用到热修复了!

最早出现热修复的文章是请求空间的热修复,后续阿里微信等平台也相继推出了热修复的功能,本文讲的是QQ空间方式的热修复更新,参考了文章:简书作者:weex暴走青年–https://www.jianshu.com/p/d17519d4952e

我将这篇文章读下来感觉这个热修复其实就是相当于插队,如果把每一个方法都看做一个人的话,那么没有问题的方法就是正常人,有问题的方法就是残疾人,而修复问题就是克隆了一个残疾人同时将残疾问题解决了变成了一个正常人之后将这个正常人插队到残疾人的前面,当轮到这个残疾人的时候首当其冲的便是看到了这个正常人,既然找到了人那么就回去复命了,至于后面的残疾人就不用管了,说实话,大家觉得是不是很残忍,但是没办法,社会就是这么残酷地,当然了,这么做也会激起来反抗的,所以有的手机热修复就无法成功的!

下面是我看文章中的代码部分整理出来的修复过程,大家看看,有问题提出来,说实话,有些地方的原理我还不太明白,后续有时间还会继续整理的:

  1. 检测补丁文件是否存在;
  2. 检测补丁格式;
  3. 复制补丁到软件私有目录下;
  4. 创建dex优化文件目录,
  5. 获取自身dex的ClassLoader,就是未修复时的dex;
  6. 获取修复dex的ClassLoader,就是修复包的dex;
  7. 分别通过Field反射获取到各个classloader中的pathList字段;
  8. 分别通过Field反射获取到各个pathList中的dexElements,这个就是要排队的两个列表;
  9. 将要修复的列表插入到原本自身的列表的前面;
  10. 重新设置自身的dex;

其实总的来说就是读取两个dex,然后将内部方法优先级重排,然后在重新写入进去。

上面这只是代码部分,接下来就是来说怎么制作修复用的补丁包了,首先,想要做补丁包,首先就要了解到补丁包的格式,如果这个都不知道的话那么还怎么做补丁包啊,层级关系如下;

   补丁包格式:.dex-------<<<生成补丁包的格式:.class-------<<<生成class文件的格式:java

看到这里大家应该都明白怎么回事了,java文件是咱们开发中的最基础的文件,而class文件是java文件在转成可被机器识别的机器语言中间的一个过度文件,最后dex文件就是安卓程序最后要运行的程序了!

其实在安卓开发的过程当中编译器已经会自动生成class文件了,就不用去使用命令行javac test.java去生成class文件了,以我使用的Android Studio为例,生成class的位置如下(红框所示位置):

既然找到了class文件的位置那么接下来就要生成修复的dex文件了,具体分为以下几步:

第一步:找到dex.bat文件的位置,具体是在androidsdk的安装目录下的AndroidSdk\build-tools文件夹下里面有不同版本吧的build-tools,一般情况下选择最新版本的文件夹的就可以了,进入最新版本的文件夹下面就能看见bat脚本文件了;

第二步:定义一个路径,用来存储生成的dex修复文件,例如:E:\Project_WorkSpace\YuDaoPro\app\classes_fix.dex

第三步:找到要生成dex文件的class文件的路径,这个路径不能包括APP程序的包名,同时在包名下面最好只放要修复的文件,但是文件的层级关系一定不要变;例如要修复的class文件的路径为E:\Project_WorkSpace\MyApplication111\hotfixtest\build\intermediates\classes\debug\com\hotfixtest\android\TestClass.class这时候我们要取的路径为E:\Project_WorkSpace\MyApplication111\hotfixtest\build\intermediates\classes\debug\,如果取得路径为E:\Project_WorkSpace\MyApplication111\hotfixtest\build\intermediates\classes\debug\com\hotfixtest\android\这个的话可能会导致错误PARSE ERROR:
class name (com/hotfixtest/android/R$id) does not match path (R$id.class)
,这个问题一定要注意,

第四步:这一步其实就是最终要的一步,马上就要生成了dex文件了,需要执行命令dx.bat --dex --output=E:\Project_WorkSpace\MyApplication111\app\user.dex E:\Project_WorkSpace\MyApplication111\hotfixtest\build\intermediates\classes\debug来生成dex文件,output其实就是dex文件输出位置,而后面的路径是要打包成dex文件的class文件所处的路径;

猜你喜欢

转载自blog.csdn.net/cmwly/article/details/79474593