Andfix热修复框架原理及源代码解析-上篇
热补丁介绍及Andfix的使用
Andfix热修复框架原理及源代码解析-上篇
1.不知道怎样使用的同学,建议看看我上一篇写的介绍热补丁和Andfix的使用,这样你才有一个大概的框架。通过使用Andfix,事实上我们心中会有一个大概的轮廓,它的工作原理,大概就是。所谓的补丁文件。就是通过打包工具apkpatch比对新的apk和旧的apk之间的差异。
然后让我们的旧包执行的时候。就载入它,把曾经的一些信息替换掉。
我们如今就抱着这个慷慨向去深入源代码探个到底!
。首先看下Demo里面Application的代码。
2.一開始实例化PatchManager。然后调用init()这种方法,我们跟进去看看。
我凝视的非常具体,大致就是从SharedPreferences读取曾经存的版本号和你传过来的版本号进行比对,假设两者版本号不一致就删除本地patch。否则调用initPatchs()这种方法。
3.分析下initPatchs()它做了什么,事实上代码非常easy,就是把mPatchDir目录下的文件作为參数传给了addPatch(File)方法,然后调用addPatch()方法。addPatch方法的作用看以下的凝视,写的非常清楚。
4.我们能够看到addPatch()方法里面会实例化Patch,我们跟进去看看实例化过程中,它又干了什么事。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" height="635" width="600">
它里面调用了init()方法,能够看到里面有JarFile, JarEntry, Manifest, Attributes,通过它们一层层的从Jar文件里获取对应的值,提到这里大家可能会奇怪,明明是.patch文件,怎么又变成Jar文件了?事实上是通过阿里打补丁包工具生成补丁的时候写入对应的值。补丁文件事实上就相到于jar包。仅仅只是它们的扩展名不同而已。提到这里我们就来单独的探索下,补丁文件是怎么一步步生成的。由于阿里没有对打补丁工具进行加密和混淆。我们能够使用jdgui打开查看。
所需对应的工具代码demo等我都统一放在以下的下载链接里面。有须要的自行取下。
5.好了,我们如今来分析下补丁文件怎样生成的,用jdgui打开apkpatch-1.0.3。先从main方法開始。
能够看到:下图1部分就是我们前面介绍怎样使用命令行打补丁包的命令,检查命令行是否有那些參数。假设没有要求的參数,就给用户对应的提示。
第二部分。我们在打正式包的时候,会指定keystore,password,alias,entry相关參数。
另外name就是最后生成的文件,能够忽略。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" height="763" width="687">
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())。我们走进去先看看。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" height="451" width="741">
这个就是将dexFile和签名相关信息写入classes.dex文件里。能够有点蒙。
我们就看看writeFile()方法。
SignedJarBuilder的构造方法做了一些初始化和赋值操作。提到这个是方便可以理解writeFile()这种方法。
writeFile里面调用了writeEntry(),我们看看它。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" height="532" width="661">
这种方法就是从input输入流中读取buffer数据然后写入到entry。然后联系到我上面提到的将dexfile和签名相关信息写入到classes.dex里面。应该能好理解点。
上面提了一大堆,我们的东西准备的差点儿相同了,如今就看看最后一个方法ApkPatch release(this.out, dexFile, outFile)
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" height="405" width="640">
这种方法就是将dexFile进行md5加密,把build(outFile, dexFile);函数中生成的outFile重命名。哈哈。看到”.patch”有没有非常激动!
!
我们的补丁包一開始的命名就是一长串。好了,到这里,补丁文件就生成了。接下来我们看看,怎么来使用它。
坚持就是胜利,立即你就要熬过头了...没办法。别人团队花了这么长时间做的,想分析就得花时间。
相关资料工具及demo下载地址:http://pan.baidu.com/s/1hsdcs7a
转载请注明转自:http://blog.csdn.net/u011176685/article/details/50984796
欢迎关注个人微信公众号,专注于Android深度文章和移动前沿技术分享
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
Andfix热修复框架原理及源代码解析-上篇的更多相关文章
- AndFix Bug 热修复框架原理及源码解析
作为阿里巴巴开源的 Android 应用热修复工具——AndFix,帮助 Anroid 开发者修复应用的线上问题.Andfix 是 “Android hot-fix” 的缩写. 1.什么是AndFix ...
- 阿里 AndFix 热修复框架简介
阿里AndFix热修复框架简介 热修复原理: Android的类加载机制 Android的类加载器分为两种,PathClassLoader和DexClassLoader,两者都继承自BaseDexCl ...
- AndFix热修复 —— 实战与源码解析
当你的应用发布后第二天却发现一个重要的bug要修复,头疼的同时你可能想着赶紧修复重新打个包发布出去,让用户收到自动更新重新下载.但是万事皆有可能,万一隔一天又发现一个急需修复的bug呢?难道再次发布打 ...
- Andfix热修复原理
一.前言 最近腾讯弄出一个Tinker热修复框架,那么本文先不介绍这个框架,先来介绍一下阿里的一个热修复框架AndFix,这个框架出来已经很长时间了,但是看网上没有太多非常详细的讲解,这里就来做一次分 ...
- android--------阿里 AndFix 热修复
AndFix,全称是Android hot-fix.是阿里开源的一个热补丁框架,允许APP在不重新发布版本的情况下修复线上的bug. 支持Android 2.3 到 6.0,并且支持arm 与 X86 ...
- Andfix热修复技术使用
AndFix,全称是Android hot-fix.是阿里开源的一个Android热补丁框架,允许APP在不重新发版本的情况下修复线上的bug.支持Android 2.3 到 6.0. andfix的 ...
- 安卓热修复之AndFIX
我致力于最新的前沿安卓技术分析和使用教学,不打算将很多很深的东西,因为有多少人愿意沉下你的心境去学习难点?我一般只会简单提及.文字错漏在所难免还希望同学们喜欢 热修复介绍 热修复是什么? 如果你一个项 ...
- 热修复干货| AndFix热补丁动态修复框架使用教程
本篇文章会与大家一起学习使用阿里的AndFix热修复框架,可以说AndFix是国内热修复技术的开山始祖,尽管现在阿里已经放弃了对这个项目的维护,但是后来很多的热修复技术都借鉴了这一框架的实现思路. 1 ...
- 美团热修复Robust-源码篇
上一篇主要分析了Robust的使用方法,这一篇就来总结一下Robust的源码分析. 我个人倾向于将Robust框架分为两个部分,自动插入代码和动态加载Patch. 一.Robust源码分析 目前我的分 ...
随机推荐
- win7分盘(复制)
1/10 右击“计算机”选择“管理” 2/10 打开管理之后点击“磁盘管理器”,在想要新建磁盘的分区上右击,点击“压缩卷” 3/10 在“输入压缩空间量”后面输入需要新建磁盘的大小,输入的单位为MB( ...
- 【bzoj4810】[Ynoi2017]由乃的玉米田 莫队算法+STL-bitset
题目描述 由乃在自己的农田边散步,她突然发现田里的一排玉米非常的不美.这排玉米一共有N株,它们的高度参差不齐. 由乃认为玉米田不美,所以她决定出个数据结构题 这个题是这样的: 给你一个序列a,长度为n ...
- 【bzoj4869】[Shoi2017]相逢是问候 扩展欧拉定理+并查集+树状数组
题目描述 Informatik verbindet dich und mich. 信息将你我连结. B君希望以维护一个长度为n的数组,这个数组的下标为从1到n的正整数.一共有m个操作,可以分为两种:0 ...
- IDEA 注册问题,创建 和 删除项目
目录 .....2016.3/2017.1 IDEA 注册码 .....IDEA 创建项目 .....IDEA 删除项目 IDEA 注册码 复制使用别人的注册码,启动选择如下: 复制粘贴如下代码: 这 ...
- react 基础语法复习2- react入门以及JSX
引入 react 以及 ReactDom import React from 'react'; import ReactDOM from 'react-dom'; 将react组件渲染到真实dom节点 ...
- PAT 天梯赛 L1-043 阅览室
L1-043. 阅览室 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 天梯图书阅览室请你编写一个简单的图书借阅统计程序.当读者 ...
- SQL索引基础
原文发布时间为:2011-02-19 -- 来源于本人的百度文章 [由搬家工具导入] 一、深入浅出理解索引结构 实际上,您可以把索引理解为一种特殊的目录。微软的SQL SERVER提供了两种索 ...
- 遍历简单XML节点
原文发布时间为:2009-08-26 -- 来源于本人的百度文章 [由搬家工具导入] <?xml version="1.0" encoding="gb2312&qu ...
- HttpHandler,HttpApplication, HttpModule
选择HttpHandler还是HttpModule? HttpHandler和HttpModule之间有什么差别 之所以有这个疑问,是因为在这二类对象中都可以访问Request, Response对象 ...
- bzoj 1228 [SDOI2009]E&D SG函数打表 找规律
题目链接 Description 桌子上有2n 堆石子,编号为1..2n.将第2k-1 堆与第2k 堆(1 ≤ k ≤ n)为同一组.第i堆的石子个数用一个正整数Si表示.一次分割操作指的是,从桌子上 ...