一、热修复技术作用

线上app BUG紧急修复,不重新发版,不重新安装,在线远程修复问题

二、局限性与适用场景

补丁只能针对单一客户端版本,随着版本差异变大补丁体积也会增大;

补丁不能支持所有的修改,例如AndroidManifest;

补丁无论对代码还是资源的更新成功率都无法达到100%。

既然补丁技术无法完全代替升级,那它适合使用在哪些场景呢?

1.轻量而快速的升级

2.远端调试

3.数据统计

4.其他(Instant Run)

Android官方也使用热补丁技术实现Instant Run。它分为Hot Swap、Warm Swap与Cold Swap三种方式。

三、热修复的原理

1、通过更改dex加载顺序实现热修复(下载补丁后app需要重启,而后才会加载补丁生效)

通过更改含有bug的dex文件的加载顺序;在dex的加载中,若已找到方法则不会继续查找,所以如果能让修复之后的方法在含有bug的方法之前加载就能达到修复bug的目的。把有问题的类修复后,放到一个单独的dex,通过反射插入到dexElements数组的最前面,让虚拟机优先加载打完补丁的class。

实践中,会发现运行加载类的时候报preverified错误,原来在DexPrepare.cpp,将dex转化成odex的过程中,会在DexVerify.cpp进行校验,验证直接引用的类和clazz是否在同一个dex,如果是,则会打上CLASS_ISPREVERIFIED标志。通过在所有类(Application除外,当时还没加载自定义类的代码)的构造函数插入一个对在单独的dex的类的引用,就可以解决这个问题。空间使用了javaassist进行编译时字节码插入。

隐患:虚拟机在安装期间为类打上CLASS_ISPREVERIFIED标志是为了提高性能的,我们强制防止类被打上标志多少会影响app的性能。但是在大项目中拆分dex的问题已经比较严重,很多类都没有被打上这个标志。

开源实现有Nuwa, HotFix, DroidFix。实际应用案例:QQ空间

2、通过Native替换方法指针的方式实现热修复(下载补丁后app不需要重启,即可加载补丁生效)

主要是阿里开源的两个热修复框架:Dexpost AndFix。它们都是通过Native层使用指针替换的方法替换bug,达到修复bug的目的,具体可参考其github文章。

(1)基于Xposed的AOP框架,方法级粒度,可以进行AOP编程、插桩、热补丁、SDK hook等功能。

Xposed需要Root权限,是因为它要修改其他应用、系统的行为,而对单个应用来说,其实不需要root。 Xposed通过修改Android Dalvik运行时的Zygote进程,并使用Xposed Bridge来hook方法并注入自己的代码,实现非侵入式的runtime修改。

我们知道,应用启动的时候,都会fork zygote进程,装载class和invoke各种初始化方法,Xposed就是在这个过程中,替换了app_process,hook了各种入口级方法(比如handleBindApplication、ServerThread、ActivityThread、ApplicationPackageManager的getResourcesForApplication等),加载XposedBridge.jar提供动态hook基础。

方法级的替换是指,可以在方法前、方法后插入代码,或者直接替换方法。只能针对java方法做拦截,不支持C的方法。

硬伤是不支持art,不支持art,不支持art。

(2)AndFix同样是方法的hook,AndFix不像Dexposed从Method入手,而是以Field为切入点。dalvik和art都支持

使用上,直接写一个新的类,会由补丁工具会生成注解,描述其与要打补丁的类和方法的对应关系。

3、微信热补丁方案(下载补丁后app需要重启,而后才会加载补丁生效)

思想是全量替换新的Dex。即完全使用新的Dex,这样既不出现Art地址错乱的问题,在Dalvik也无须插桩。考虑到补丁包的体积,不能直接将新的Dex放在里面。但可以将新旧两个Dex的差异放到补丁包中,最简单可以采用BsDiff算法。

简单来说,在编译时通过新旧两个Dex生成差异path.dex。在运行时,将差异patch.dex重新跟原始安装包的旧Dex还原为新的Dex。这个过程可能比较耗费时间与内存,所以我们是单独放在一个后台进程:patch中。为了补丁包尽量的小,微信自研了DexDiff算法,它深度利用Dex的格式来减少差异的大小。它的粒度是Dex格式的每一项,可以充分利用原本Dex的信息,而BsDiff的粒度是文件,AndFix/QZone的粒度为class。

在最极端的情况,由于利用了原本dex的信息完全替换一个13M的Dex,我们的补丁大小也仅仅只有6.6M。

但是这套方案并非没有缺点,它带来的问题有两个:

(1)占用Rom体积;这边大约是你修改Dex数量的1.5倍(dexopt与dex压缩成jar)的大小。

(2)一个额外的合成过程;虽然我们单独放在一个进程上处理,但是合成时间的长短与内存消耗也会影响最终的成功率。

微信的热补丁方案叫做Tinker,也算缅怀一下Dota中的地精修补匠,希望能做到无限刷新。

若不care性能损耗与补丁包大小,QZone方案是最简单且成功率最高的方案(没有单独的合成过程)。相对Tinker来说,它的占用Rom体积也更小。另一方面,QZone与Tinker的成功率大约相差3%左右。

事实上,一个完整的框架应该也是一个容易使用的框架。Tinker对补丁版本管理、进程管理、安全校验等都有着很好的支持。同时我们也支持gradle与命名行两种接入方式。希望在不久的将来,它可以很快的跟大家见面。

https://www.cnblogs.com/aademeng/articles/6883861.html

http://www.bbs0101.com/archives/1437.html(讲解和总结的很好,包含是否需要重启)

https://www.jianshu.com/p/52cacc0f23fa

https://www.cnblogs.com/fanfu1/p/5506149.html

android热更新框架nuwa,Android热更新技术——Tinker、nuwa、AndFix、Dexposed相关推荐

  1. 视频教程-热更新框架设计之热更流程与热补丁视频课程-Unity3D

    热更新框架设计之热更流程与热补丁视频课程 二十多年的软件开发与教学经验IT技术布道者,资深软件工程师.具备深厚编程语言经验,在国内上市企业做项目经理.研发经理,熟悉企业大型软件运作管理过程.软件架构设 ...

  2. android应用程序框架图,Android系统框架图详解

    Android系统从下至上分为4层:Linux内核.Android程序库及Android运行时.Android应用程序框架,以及应用程序等. 图1-1 Android系统框架 1. Linux内核(L ...

  3. android热更新框架选型,Android热更新框架简单比较

    1.Tinker Tinker 的方案,都是让 Classloader 去加载新的类.如果不重启,原来的类还在虚拟机中,就无法加载新类.因此,只有在下次重启的时候,在还没走到业务逻辑之前抢先加载补丁中 ...

  4. android开发三大框架!Android开发者出路在哪?完整PDF

    越来越多的人在提"移动端的下半场"."Android 开发的焦虑"之类的,也有人在喊"技术天天在变,学也学不完","昨天 Kotl ...

  5. android教务系统框架,基于Android的教务系统的设计与开发

    摘要: 随着我国高等教育的不断发展,高校教学与教务管理要实现科学管理,必须注重以人为本的理念.正是考虑到此,就应该建设基于移动网络的高校教务管理系统,以满足高校师生的现实需求.本文分析了C/S和B/S ...

  6. android glide图片框架,【Android 进阶】图片载入框架之Glide(示例代码)

    简单介绍 在泰国举行的谷歌开发人员论坛上,谷歌为我们介绍了一个名叫 Glide 的图片载入库,作者是 bumptech.这个库被广泛的运用在 google 的开源项目中,包含 2014 年 googl ...

  7. Android增量更新框架

    Android增量更新框架 框架介绍 功能简介 简易效果图 增量更新配置 快速使用 Api详解 项目地址 框架介绍 功能简介 Android App更新框架,包含增量更新.多线程下载等功能.一句代码链 ...

  8. 视频教程-热更新框架设计之客户端热更框架(中部)视频课程-Unity3D

    热更新框架设计之客户端热更框架(中部)视频课程 二十多年的软件开发与教学经验IT技术布道者,资深软件工程师.具备深厚编程语言经验,在国内上市企业做项目经理.研发经理,熟悉企业大型软件运作管理过程.软件 ...

  9. 各种Android UI开源框架 开源库

    各种Android UI开源框架 开源库 转 https://blog.csdn.net/zhangdi_gdk2016/article/details/84643668 自己总结的Android开源 ...

  10. Android 开源UI框架汇总

    1. github排名 https://github.com/trending,github搜索:https://github.com/search 2.https://github.com/wasa ...

最新文章

  1. python_day1
  2. docker探索-windows10 docker 使用 mysql(二)
  3. dbscan论文_重点关注!我校论文被CCF A类人工智能国际顶级学术会议IJCAI录用
  4. 全球及中国晶圆锯划片刀行业发展态势及投资潜力预测报告2021-2027年
  5. Xshell官网下载地址
  6. bootice添加黑苹果引导_Clover(四叶草)引导多系统(Linux亦可),黑苹果引导教程
  7. 分享PHP多功能在线工具箱网站源码,安装教程详解
  8. 2021招生之友+录取统计_电子版免费分享
  9. 彩虹php域名授权系统,彩虹云域名授权系统(正版源码+教程)
  10. 【100+ python基础入门-32】元组元素的增删改查操作方法总结
  11. 大豆技术面分析_大豆高产栽培技术分析,科学施肥很关键,建议收藏
  12. 谁来PK“百度局域网”
  13. SpringBoot--多线程07
  14. Java项目中利用钉钉机器人Webhook向钉钉群推送告警通知
  15. linux中centos8.4配置静态ip
  16. Pedometer_forAndroid
  17. 阿里云服务器通用算力u1性能测评CPU处理器网络PPS
  18. 张一鸣没动手,王兴不紧张
  19. arduino语言c,Arduino编程基础(二)——C\C++语言基础(上)
  20. java 面向对象经典例题——教师,学生,家长。教师布置作业给学生和家长。

热门文章

  1. uds的0x10服务介绍
  2. 【Hadoop生态】HDFS入门,看完就懂
  3. ADPlus 6.0 版的新增功能
  4. 斐波那契数列之不死神兔---------说白了就是递归的应用
  5. Java雪花飞舞设计实现
  6. 在Microsoft Excel中如何快速合并表格
  7. 深度好文 | 探索 Scipy 与统计分析基础
  8. 云管边端架构图_车路协同的云管边端架构及服务研究
  9. 二、使用阿里的easyExcel进行导入导出
  10. 「真实案例」数字化商品企划让服装零售企业数字化升级事半功倍