robust 热修复实践

一、导入项目

在项目根目录的build.gradle下添加

dependencies {
    classpath 'com.android.tools.build:gradle:3.1.2'
    //robust插件
    classpath "com.meituan.robust:gradle-plugin:${robustVersion}"
    classpath "com.meituan.robust:auto-patch-plugin:${robustVersion}"
    
}

gradle.properties添加版本号(或者写死,可以忽略):

#meituan hotfix
robustVersion = 0.4.82

在app目录下的build.gradle下添加

if(isMakeHot.toBoolean()){
    //制作补丁开启
    apply plugin: 'auto-patch-plugin'
}else{
    //生成apk开启
    apply plugin: 'robust'
}

dependencies {
     compile "com.meituan.robust:robust:${robustVersion}"
}

gradle.properties中添加开关,以后打包或者打补丁只要修改这个参数:

#Make a patch please set true
isMakeHot=false
二、配置文件

在app目录下添加robust.xml配置文件,一般修改patchPackname和hotfixPackage就可以了:




    
        
        
        true
        

        
        
        
        false

        
        
        
        true

        
        true
        

        
        
        false

        
        true
        

        
        true
        
    

    
    
    
        包名
    

    
    
        com.meituan.robust
        com.meituan.sample.extension
    

    
    
        cn.superh.patch
    

    
    

    


三、思路(需要结合项目的实际情况而定)

先说说我们项目中用的原理

首先,接口方面(和美团建议不一致,也没办法,不是我们写 ~ ),后台小伙伴把热修复接口信息,在每个接口中都会返回,啊~~ 这是要干嘛~,所以我是按这样接口返回来写的。

我们把本地的app版本号和补丁版本号在通过Heads传递给后台,来识别是否需要补丁信息。

1.在网络拦截器中,对response进行处理拦截,获取到热修复信息后,去下载。当然在下载的时候,肯定还有多个接口会返回信息,需要做下处理。

2.需要对修复完的版本,本地保存一份,并缓存版本号信息,下次启动需要加载。

3.补丁版本只能针对某一个大版本(app的版本),不能升级应用后,以前的补丁还应用了。

4.安全性的一些考虑。(目前我们只做了文件MD5验证,没有做加密的操作)

四、具体Demo

https://github.com/super-hu/hotfix_android

五、发布流程
正常发布apk
  1. 修改gradle.properties
isMakeHot=false
  1. 去除掉 之前的修复的bug文件含有 @Modify @Add 的注解(如果有)

  2. 保存好outputs/mapping/环境/mapping.txt、outputs/robust/robust.apkhash 文件


发布补丁

1.修改有bug的方法增加@Modify或新增方法或者类@Add

2.把之前保留的mapping.txt和robust.apkhash,复制到app项目下的robust目录

3.修改gradle.properties

isMakeHot=true

4.修改app目录下的robust配置开关(一般不用动,详细看注释)。

5.执行打包命令,最后会在outputs/robust 下生成patch.jar补丁文件,发布到服务器。


注意事项

1.打补丁文件,如果之前未对代码做混淆,需要自行创建mapping.txt(正式环境都是混淆的,可忽略)

如果你们的app没有使用proguard优化代码,那么一切处理起来都比较简单了,Robust插桩部分与Proguard没有依赖关系,所以Robust插桩部分可以放心使用,至于自动化嘛就需要做一些手脚了:

首先需要创建一个mapping.txt文件,请注意文件的命名哈,然后放到app/robust目录下
其他操作和使用说明中的操作一样,只不过需要你在mapping文件中加入几行,比如说我们需要对com.meituan.mainactivity这个类修改bug 需要在mapping文件添加如下代码:
com.meituan.mainactivity ->com.meituan.mainactivity:
                int field ->field
其中com.meituan.mainactivity就是你要修改的类,field是你类中的任一字段,类中的方法名不需要填写(包括修改的方法),mapping文件只能包含这两行,不能有多余的空行,多余空格也不行

2.支持的修复

支持方法级别的修复,支持静态方法
支持新增方法和类

3.不支持的修复

接口、无方法类、构造方法、抽象方法、native方法、synthetic方法等不插住代码

so不支持:

新增字段
修复构造方法
资源和 so 修复
返回值是 this 的方法支持不太好(需要看情况处理)
可能会出现深度方法内联导致的不可预知的错误(几率很小可以忽略)

4.TODO

没有安全校验,需要在加载补丁之前自己做验证

  • 初步是检验文件MD5值
  • 文件加密解密处理

你可能感兴趣的:(robust 热修复实践)