Robust 接入

前言
Robust热更新系统借鉴Instant Run原理,实现了一个兼容性更强而且实时生效的热更新方案。其基本思路是,Robust热更新系统在一个方法的入口处插入一段跳转代码,当发现某个方法出现bug就跳转执行补丁中的代码,略过原有代码的执行,否则执行原有方法体逻辑。
Github:https://github.com/Meituan-Dianping/Robust/blob/master/README-zh.md

1.ROBUST 接入
接入流程 https://github.com/Meituan-Dianping/Robust/blob/master/README-zh.md
引入类库
1.在App的build.gradle 目录下引入依赖:

2.在整个工程的build.gradle目录下加入:

Robust.xml数据配置
在项目的src同级目录下配置部分配置robust.xml文件,按需求自行配置。


robust.xml https://123.sankuai.com/km/api/file/16297368/16310626

在未修复之前,先用打线上包的命令打包,保留build目录下的mapping.txt和methodsMap.robust文件。

补丁路径设置,此处设置补丁的加载位置,这样才能知道,补丁下载到哪,又该去哪里加载

继承此类,实现上述3个抽象方法。(Tips:按demo自己copy,有特殊要求自行订制。)

此处做一个思考,为啥不用接口,要用抽象类。

2.补丁制作

自动化补丁制作:自动制作补丁 https://tech.meituan.com/android_autopatch.html

手动制作

3.加载补丁

4.线上修复流程

Jenkins一键补丁 https://wiki.sankuai.com/pages/viewpage.action?pageId=905191353
测试服补丁发布地址

补丁的测试与发布

上线之前先在测试服务器进行发布,免得污染线上的环境。为了把线上apk中的获取补丁的请求转发到测试服务器上,需要使用Charles进行转发,需要导入配置文件。

原理: App启动之初,会去请求一个补丁list,如果线上有补丁发布,且符合补丁下发条件,则会去下载补丁,自动加载。

请求带有如下主要参数:

appVersion : 添加补丁时填写,基于哪个版本的apk开发的补丁。

apkHash:用来保证线上apk的唯一性。

uuid:补丁下发策略。

userId:补丁下发策略,用户登陆后,根据userId决定向哪些用户下发补丁。

下面是一个测试的请求补丁请求:

/appupdate/patch/list?apiLevel=22&dev=M1-NL&devModel=M1-NL&brand=SUNMI&jvmVersion=2.1.0&userId=27997173&channel=jenkins&cpuArc=armeabi-v7a&robustVersion=60000&apkHash=1b8581e3eb0c615af855a8086a281e56&applicationId=com.sankuai.erp.waiter&uuid=43e0b9dc7902464a8a34418f9a913a160000000000000271990&appVersion=2.1.0 HTTP/1.1

请求成功之后,会在download文件夹下面下载一个补丁,如图:

5.优缺点对比

你可能感兴趣的:(Android)