Android热修复方案比较
热修复的特点:无需重新发版,实时高效热修复;用户无感知修复,无需下载新的应用,代价小;
修复成功率高,把损失降到最低。
一、热修复开源方案和使用情况
| 方案名称 | 方案开发公司 | 开发时间 | Github星评 |
|---|---|---|---|
| Robust | 美团 | 2016年 | 54 |
| Andfix | 阿里 | 2015年 | 4994 |
| Nuwa | 个人开发者(dex文件补丁) | 2015年 | 2588 |
| Dexposed | 不考虑,需要root权限 | ||
| Amigo | 饿了么(apk补丁) | 2016年 | 1031 |
| Tinker | 微信(apk补丁) | 2016年 | 7891 |
| RocooFix | Nuwa改进版 | 2016年 | 1299 |
Robust方案
1.原理:Robust插件对每个产品代码的每个函数都在编译打包阶段自动的插入了一段代码,插入过程对业务开发是完全透明。
在Application中通过DexClassLoader,将补丁class文件事先加载,然后之后会调用新的额
class以替换旧apk中的bug class文件,通过反射进行新代码的调用,以达到热修复目的。
具体过程请参考Android热更新方案Robust
2.补丁制作
Robust的补丁制作,除了打包dex文件,更需要使用美团的插件将每个class文件插入代码,在编译阶段侵入代码
对运行效率等方面都有影响
优点
.高兼容和适配性,由于是java代码层面的替换调用,基本不涉及各个版本
的适配和虚拟机的适配。
缺点
.由于对包体中的文件进行了代码侵入,对运行效率、方法数、包体积都有
影响,文件方法数变多,企业级应用可能会涉及到65535的问题。
.项目不够成熟,文档不够健全。
Andfix方案
1.原理:补丁工具apkpatch将两个apk做一次对比,然后找出不同的部分可以看到生成的apatch了文件,
后缀改成zip再解压开,里面有一个dex文件。通过jadx查看一下源码,里面就是被修复的代码所在的类
文件,这些更改过的类都加上了一个_CF的后缀,并且变动的方法都被加上了一个叫@MethodReplace
的annotation,通过clazz和method指定了需要替换的方法。然后客户端sdk得到补丁文件
后就会根据annotation来寻找需要替换的方法。最后由JNI层调用native完成完成指针的替换。
2.补丁制作
官方提供apkpatch工具
apkpatch -o D:/Patch/ -k debug.keystore -p android-a androiddebugkey -e android f bug-fix.apk t release.apk
优点
.项目成熟,文档健全。
.集成简单
.安全性高
缺点
.不支持YunOS
.无法添加新类和新的字段
.需要使用加固前的apk制作补丁,但是补丁文件很容易被反编译,也就是修改过的类源码容易泄露。
.使用加固平台可能会使热补丁功能失效
Nuwa方案
1.原理:动态加载补丁dex,并将补丁dex插入到dexElements最前面。要实现热更
新,需要热更新的类要防止被打上ISPREVERIFIED标记
2.补丁制作
Gradle插件要做的事就是拿到所有class,在其构造函数中注入Hack.class,使其直接引用另一个dex中的文件,防止被打上ISPREVERIFIED标记。并且发版时的mapping文件以及所有class文件的hash值的文件需要保持下来打patch使用。
优点
.项目成熟,文档健全。
.集成简单
.支持添加新加类和新的字段
缺点
.支持gradle1.5以下
.需要应用重启后生效
Tinker
1.原理:通过新旧apk比较,使用gradle从插件生成.dex补丁文件(并不是真正的dex文件),补丁通过服务器下发后尝试对dex文件二路归并进行合并,最终生成全量的dex文件,与生成补丁互为逆过程,生成全量dex文件后进行optimize操作,最终生成odex文件。在Application中进行反射调用已经合成的dex文件。
2.补丁制作
使用微信gralde插件tinkerPatchRelease任务调用生成补丁
优点
.项目成熟,文档健全。
.集成简单
.支持资源文件和so文件的修复替换
缺点
.不支持四大组件的添加
.需要应用重启后生效
RocooFix
1.原理:同Nuwa,因为最适合我们当前的使用,详细介绍下
2.补丁制作
使用gradle插件自动生成包含dex的jar文件
使用过程
.Application中初始化:
RocooFix.init(this);
RocooFix.applyPatch(this,path);
.根目录下build.gradle文件添加:
classpath 'com.dodola:rocoofix:1.2.2'
.app中build.gradle文件中添加:
apply plugin: 'com.dodola.rocoofix'
compile 'com.dodola:rocoo:1.1'
rocoo_fix {
includePackage = ['com/xiaomi/gamecenter/wxwap']//指定将来可能需要制作补丁的package(就是指定插庄的范围)
excludeClass = ['HyApplication.class']//将不需要加到patch里的类写在这里(不需要插庄的类)
preVersionPath = ''//注意:此项属性只在需要制作补丁的时候才需开启!!如果不需要制作补丁则需要去掉此项
enable = true//注意:关掉此项会无法生成Hash.txt文件
scanref=false//默认为 false,开启这个选项会将与补丁 class 相引用的 class 都打入包中来解决 ART 虚拟机崩溃问题,功能 Beta 中
}
.更改versionCode 开启混淆,不开混淆的话无法生成补丁文件,可以设定生成补丁的包
.补丁文件为增量文件,只包含改动的文件,补丁可由我们自己生成,不需要经过cp *** 优点 *** .项目成熟,文档健全。
.集成简单
.支持so文件的修复替换
.补丁生成与apk无关(增量补丁无关性,不依赖cp等第三方) *** 缺点 *** .不支持四大组件的添加
.需要应用重启后生效
Android热修复方案比较的更多相关文章
- Android 热修复方案Tinker
转自:http://blog.csdn.net/l2show/article/details/53925543 Android 热修复方案Tinker(一) Application改造 Android ...
- Android 热修复方案Tinker(一) Application改造
基于Tinker V1.7.5 Android 热修复方案Tinker(一) Application改造 Android 热修复方案Tinker(二) 补丁加载流程 Android 热修复 ...
- 深入探索Android热修复技术原理读书笔记 —— 代码热修复技术
在前一篇文章 深入探索Android热修复技术原理读书笔记 -- 热修复技术介绍中,对热修复技术进行了介绍,下面将详细介绍其中的代码修复技术. 1 底层热替换原理 在各种 Android 热修复方案中 ...
- Android热修复技术选型(不在市场发布新版本的情况下,直接更新app)
2015年以来,Android开发领域里对热修复技术的讨论和分享越来越多,同时也出现了一些不同的解决方案,如QQ空间补丁方案.阿里AndFix以及微信Tinker,它们在原理各有不同,适用场景各异,到 ...
- Android 热修复Nuwa的原理及Gradle插件源码解析
现在,热修复的具体实现方案开源的也有很多,原理也大同小异,本篇文章以Nuwa为例,深入剖析. Nuwa的github地址 https://github.com/jasonross/Nuwa 以及用于 ...
- 全面了解Android热修复技术
WeTest 导读 本文探讨了Android热修复技术的发展脉络,现状及其未来. 热修复技术概述 热修复技术在近年来飞速发展,尤其是在InstantRun方案推出之后,各种热修复技术竞相涌现.国内大部 ...
- Android热修复框架汇总整理(Hotfix)
Android平台出现了一些优秀的热更新方案,主要可以分为两类:一类是基于multidex的热更新框架,包括Nuwa.Tinker等:另一类就是native hook方案,如阿里开源的Andfix ...
- Android热修复技术选型——三大流派解析
声明,本文转载自微信公众号文章 2015年以来,Android开发领域里对热修复技术的讨论和分享越来越多,同时也出现了一些不同的解决方案,如QQ空间补丁方案.阿里AndFix以及微信Tinker,它们 ...
- Android热修复技术原理详解(最新最全版本)
本文框架 什么是热修复? 热修复框架分类 技术原理及特点 Tinker框架解析 各框架对比图 总结 通过阅读本文,你会对热修复技术有更深的认知,本文会列出各类框架的优缺点以及技术原理,文章末尾简单 ...
随机推荐
- 如何用Bugzilla系统管理产品研发过中相关需求和bug
目 录 1.Bug处理流程及状态说明 2.bugs字段说明 3.查询报表的使用 4.bug系统与需求系统的整合 5.流程和用户权限 1. Bug处理流程及状态说明(1) BUG状态流程图 BUG的状态 ...
- java多线程编程核心技术(三)--线程间通信
1.等待/通知机制 1.wait()方法:使当前执行代码的线程进行等待.wait()方法是Object类的方法,该方法将当前线程放入“预执行队列”中,并在wait()所处的代码行处停止执行.只到被唤起 ...
- 交友app
编辑注记:这是由译者 han_qi 翻译纽约客的一篇文章,从女性的角度描写了交友产品的用户体验及需求,值得广大产品经理深入研究,文章略长,但值得深读.原文<Overwhelmed and Cre ...
- JRobin cpu 和 磁盘
https://blog.csdn.net/li_zhongnan/article/details/3754053 https://blog.csdn.net/li_zhongnan/article/ ...
- Lua的面向对象程序设计
Account={balance=} function Account.withdraw(self,v) self.balance=self.balance-v end a={balance=,wit ...
- 基于FPGA的简易数字时钟
基于FPGA的可显示数字时钟,设计思路为自底向上,包含三个子模块:时钟模块,进制转换模块.led显示模块.所用到的FPGA晶振频率为50Mhz,首先利用它得到1hz的时钟然后然后得到时钟模块.把时钟模 ...
- CF 445B(DZY Loves Chemistry-求连通块)
B. DZY Loves Chemistry time limit per test 1 second memory limit per test 256 megabytes input standa ...
- 将一个对象相同的属性(不区分大小写)赋值给一个新对象 DataTable的一个简单的扩展
将一个对象相同的属性(不区分大小写)赋值给一个新对象 1 public static T Mapper<S, T>(S source) 2 { 3 T t = Activator.Cr ...
- nyoj27水池数目 (DFS)
题目27 题目信息 执行结果 本题排行 pid=27" style="text-decoration:none; color:rgb(55,119,188)">讨论 ...
- java多线程——饥饿和公平
一.概念 饥饿:如果一个线程因为 CPU 时间全部被其他线程抢走而得不到 CPU 运行时间,这种状态被称之为“饥饿”: 二.饥饿原因 高优先级线程吞噬所有的低优先级线程的 CPU 时间. 线程被永久堵 ...