Andfix热修复框架原理及源码解析-上篇

热补丁介绍及Andfix的使用

Andfix热修复框架原理及源码解析-上篇

Andfix热修复框架原理及源码解析-下篇

1.不知道如何使用的同学,建议看看我上一篇写的介绍热补丁和Andfix的使用,这样你才有一个大概的框架。通过使用Andfix,其实我们心中会有一个大概的轮廓,它的工作原理,大概就是,所谓的补丁文件,就是通过打包工具apkpatch比对新的apk和旧的apk之间的差异。然后让我们的旧包运行的时候,就加载它,把以前的一些信息替换掉。我们现在就抱着这个大方向去深入源码探个究竟!!首先看下Demo里面Application的代码。

2.一开始实例化PatchManager,然后调用init()这个方法,我们跟进去看看。我注释的很详细,大致就是从SharedPreferences读取以前存的版本和你传过来的版本进行比对,如果两者版本不一致就删除本地patch,否则调用initPatchs()这个方法。

3.分析下initPatchs()它做了什么,其实代码很简单,就是把mPatchDir文件夹下的文件作为参数传给了addPatch(File)方法,然后调用addPatch()方法,addPatch方法的作用看下面的注释,写的很清楚。

4.我们可以看到addPatch()方法里面会实例化Patch,我们跟进去看看实例化过程中,它又干了什么事。

它里面调用了init()方法,可以看到里面有JarFile, JarEntry, Manifest, Attributes,通过它们一层层的从Jar文件中获取相应的值,提到这里大家可能会奇怪,明明是.patch文件,怎么又变成Jar文件了?其实是通过阿里打补丁包工具生成补丁的时候写入相应的值,补丁文件其实就相到于jar包,只不过它们的扩展名不同而已。提到这里我们就来单独的探索下,补丁文件是怎么一步步生成的。因为阿里没有对打补丁工具进行加密和混淆,我们可以使用jdgui打开查看。所需相应的工具代码demo等我都统一放在下面的下载链接里面。有需要的自行取下。

5.好了,我们现在来分析下补丁文件如何生成的,用jdgui打开apkpatch-1.0.3。先从main方法开始。

可以看到:下图1部分就是我们前面介绍如何使用命令行打补丁包的命令,检查命令行是否有那些参数,如果没有要求的参数,就给用户相应的提示。第二部分,我们在打正式包的时候,会指定keystore,password,alias,entry相关参数。另外name就是最后生成的文件,可以忽略。

Main函数最后一个方法是我们的大头戏,上面的参数传给ApkPatch进行初始化,然后调用doPatch()方法。

我们再跟进去,看看ApkPatch初始化的过程中,做了什么。

调用了父类的方法,我们再看看父类Build.

干的事情其实比较简单,就是给变量进行赋值。可以看到out,我们的输出文件就是这么来的,没有的话,它会自己创建一个。

然后我们再回到apkPatch.doPatch()这个方法。看看这个方法里面是什么。

这个方法主要做的就是在我们的out输出文件中生成一个smali文件夹,还有diff.dex, diff.apatch文件。可以找到你的输出文件确认下。

DiffInfo相当于一个存储新包和旧包差异信息的容器来,通过diff方法将二者的差异信息给info.然后就是三个最重要的方法,buildCode(),
build(),release()。我们接下来一个个的看下,他们究竟为何这么重要。

看到baksmali和smali,反编译过apk的同学一定不陌生,这就是dex的打包工具和解包工具,关于这个具体就不深入了,有兴趣的同学可以深入了解下。这个方法的返回值将DiffInfo中新添加的classes和修改过的classes做了一个重命名,然后保存了起来,同时,将相关内容写入smali文件中。为什么要进行重命名,其实是为了防止和之前安装的Dex文件名字冲突。

接下来看看build(outFile, dexFile),首先从keystone里面获取应用相关签名,将getMeta()中获取的Manifest内容写入"META-INF/PATCH.MF"文件中。getMeta()方法上面,实例化PatchBuilder,然后调用writeMeta(getMeta())。我们走进去先看看。

这个就是将dexFile和签名相关信息写入classes.dex文件中,可以有点蒙。我们就看看writeFile()方法。

SignedJarBuilder的构造方法做了一些初始化和赋值操作,提到这个是方便能够理解writeFile()这个方法。writeFile里面调用了writeEntry(),我们看看它。

这个方法就是从input输入流中读取buffer数据然后写入到entry。然后联系到我上面提到的将dexfile和签名相关信息写入到classes.dex里面。应该能好理解点。

上面提了一大堆,我们的东西准备的差不多了,现在就看看最后一个方法ApkPatch release(this.out, dexFile, outFile)

这个方法就是将dexFile进行md5加密,把build(outFile, dexFile);函数中生成的outFile重命名。哈哈,看到”.patch”有没有很激动!!我们的补丁包一开始的命名就是一长串。好了,到这里,补丁文件就生成了!接下来我们看看,怎么来使用它。坚持就是胜利,马上你就要熬过头了...没办法,别人团队花了这么长时间做的,想分析就得花时间。

相关资料工具及demo下载地址:http://pan.baidu.com/s/1hsdcs7a

转载请注明转自:http://blog.csdn.net/u011176685/article/details/50984796

时间: 2024-11-10 00:54:33

Andfix热修复框架原理及源码解析-上篇的相关文章

Andfix热修复框架原理及源码解析-下篇

热补丁介绍及Andfix的使用 Andfix热修复框架原理及源码解析-上篇 Andfix热修复框架原理及源码解析-下篇 如果没有看过上篇的建议从上篇看起.先大概回忆下,上一篇分析了mPatchManager.init("1.0"),addPatch()方法.还有通过分析打补丁工具,了解补丁文件是怎么生成的.下面就来讲讲我们如何去读它.思绪回到Application的loadPatch()方法. 这个方法就是遍历mPatchs,就是上篇介绍的存储patch的一个集合.根据补丁名找到对应的

AndFix Bug热修复框架原理及源码解析

?? AndFix原理 AndFix的原理就是方法的替换,把有bug的方法替换成补丁文件中的方法.  注:在Native层使用指针替换的方式替换bug方法,已达到修复bug的目的. 使用AndFix修复热修复的整体流程: 方法替换过程: 源码解析 解析源码从使用的方法一一解析. 在自定义Application中初始化PatchManger: PatchManager mPatchManager = new PatchManager(); 1 1 直接实例化了一个PatchManger实例对象,接

Android-AndFix 热修复框架原理及源码解析

AndFix原理 AndFix的原理就是通过c++指针进行方法的替换,把有bug的方法替换成补丁文件中的方法.  注:在Native层使用指针替换的方式替换bug方法,已达到修复bug的目的. 使用AndFix修复热修复的整体流程: 方法替换过程: 源码解析 解析源码从使用的方法一一解析. 在自定义Application中初始化PatchManger: PatchManager mPatchManager = new PatchManager(); 1 1 直接实例化了一个PatchManger

AndFix Bug 热修复框架原理及源码解析

作为阿里巴巴开源的 Android APP--热修复工具AndFix ,帮助 Anroid 开发者修复应用的线上问题.Andfix 是 "Android hot-fix" 的缩写. 1.什么是AndFix?AndFix是阿里巴巴出的一个专门针对Android的热修复框架,那什么是热修复呢?就是不需要重新安装APK而达到修复bugs的目的.看看阿里巴巴官方对AndFix的描述:英文好的可以看官网说明文档(有翻译不妥欢迎指出)1.AndFix是一个Android库,它是在线解决bugs,而

AndFix热修复 —— 实战与源码解析

转载请注明:http://www.cnblogs.com/soaringEveryday/p/5338214.html 当你的应用发布后第二天却发现一个重要的bug要修复,头疼的同时你可能想着赶紧修复重新打个包发布出去,让用户收到自动更新重新下载.但是万事皆有可能,万一隔一天又发现一个急需修复的bug呢?难道再次发布打扰用户一次? 这个时候就是热修复技术该登场的时候了,它可以让你在无需发布新版本的前提下修复小范围的问题.最近研究了下几个热修复的开源框架,其中Nuwa等框架的原理是修改了gradl

Andfix热修复框架原理及源代码解析-上篇

热补丁介绍及Andfix的使用 Andfix热修复框架原理及源代码解析-上篇 Andfix热修复框架原理及源代码解析-下篇 1.不知道怎样使用的同学,建议看看我上一篇写的介绍热补丁和Andfix的使用,这样你才有一个大概的框架.通过使用Andfix,事实上我们心中会有一个大概的轮廓,它的工作原理,大概就是.所谓的补丁文件.就是通过打包工具apkpatch比对新的apk和旧的apk之间的差异. 然后让我们的旧包执行的时候.就载入它,把曾经的一些信息替换掉. 我们如今就抱着这个慷慨向去深入源代码探个

深入springMVC------文件上传源码解析(上篇)

最近在项目中,使用springmvc 进行上传文件时,出现了一个问题: org.springframework.web.multipart.MultipartException: The current request is not a multipart request .... 以上堆栈信息省略. 乍看一下,没啥值得讨论的地方,就是说当前这个请求不是一个multipart request,也就是说不是上传文件的请求.但是,这结果还是令我稍感意外,为什么呢?因为,我本意是将文件这个参数作为非必

深入springMVC源码------文件上传源码解析(下篇)

在上篇<深入springMVC------文件上传源码解析(上篇) >中,介绍了springmvc文件上传相关.那么本篇呢,将进一步介绍springmvc 上传文件的效率问题. 相信大部分人在处理文件上传逻辑的时候会直接获取输入流直接进行操作,伪代码类似这样: @RequestMapping(value = "/upload", method = RequestMethod.POST) public ResultView upload(@RequestParam("

Android 热修复Nuwa的原理及Gradle插件源码解析

现在,热修复的具体实现方案开源的也有很多,原理也大同小异,本篇文章以Nuwa为例,深入剖析. Nuwa的github地址 https://github.com/jasonross/Nuwa 以及用于hotpatch生成的gradle插件地址 https://github.com/jasonross/NuwaGradle 而Nuwa的具体实现是根据QQ空间的热修复方案来实现的.安卓App热补丁动态修复技术介绍.在阅读本篇文章之前,请先阅读该文章. 从QQ空间终端开发团队的文章中可以总结出要进行热更