记录美团热修复Robust简单接入使用

准备

project级别 gradle 加入

        classpath 'com.meituan.robust:gradle-plugin:0.4.82'
        classpath 'com.meituan.robust:auto-patch-plugin:0.4.82'

app gradle 加入

apply plugin: 'com.android.application'
//制作补丁时将这个打开,auto-patch-plugin紧跟着com.android.application
//apply plugin: 'auto-patch-plugin'
apply plugin: 'robust'
compile 'com.meituan.robust:robust:0.4.82'

开始使用

主界面MainActivity

second点击跳转到SecondActivity(正式修复bug的界面),:官方建议打补丁的代码先于bug代码运行,所以这里把修复bug的操作放到第二个界面,加载补丁的代码放到第一个界面。

robust.xml配置中的几个位置注意下:.patch前面是项目包名

   <patchPackname name="patchPackname">
        <name>com.example.myrobustdemo.patch</name>
    </patchPackname>

不需要插桩的,如果没有不要去掉

<!--不需要Robust插入代码的包名,Robust库不需要插入代码,如下的配置项请保留,还可以根据各个APP的情况执行添加-->
    <exceptPackname name="exceptPackage">
        <name>com.meituan.robust</name>
        <name>com.meituan.sample.extension</name>
    </exceptPackname>

PatchManipulateImp里的setPatchesInfoImplClassFullName()方法,注意要和robust.xml上面提到的patchPackname里的对应,参考:

public class PatchManipulateImp extends PatchManipulate {
    @Override
    protected List<Patch> fetchPatchList(Context context) {
        //将app自己的robustApkHash上报给服务端,服务端根据robustApkHash来区分每一次apk build来给app下发补丁
        //apkhash is the unique identifier for  apk,so you cannnot patch wrong apk.
        //String robustApkHash = RobustApkHashUtils.readRobustApkHash(context);
        Patch patch = new Patch();
        patch.setName("123");
        //we recommend LocalPath store the origin patch.jar which may be encrypted,while TempPath is the true runnable jar
        patch.setLocalPath(Environment.getExternalStorageDirectory().getPath() + File.separator + "robust" + File.separator + "patch");
        patch.setPatchesInfoImplClassFullName("com.example.myrobustdemo.patch.PatchesInfoImpl");
        List patches = new ArrayList<Patch>();
        patches.add(patch);
        return patches;
    }

到现在为止,一直都是正常流程,然后就开始打签名包(正式上线包安装到手机上),:一定要是正式签名包,不然一堆问题比如changeQuickRedirectFileld is null,因为运行的apk与patch有区别,所以一定要用正式签名包测试bug修复

打包带有bug的apk安装到手机后,在Terminal 中运行命令,直接粘贴复制就可以了

gradlew clean  assembleRelease --stacktrace --no-daemon

build 成功后会在build文件夹下的outputs/robust 下生成methodsMap.robust和mapping(混淆开了就用),如果没有开混淆是不需要的,官方说的是自己创建一个mapping.txt,里面配置需要修复的类和字段,具体看美团的wiki,这里测试的demo也是没有用混淆的;把这2个文件移动到robust文件下,和src同级,没有就创建一个。

在SecondActivity里把@Modify打开,并且修改文案(这时候装在手机上的是没有打开该注解有bug的包),:这个方法里代码尽量多一点,不然生成补丁包时会有问题,transformClassesWithAutoPatchTransformForRelease,报这个错

打开app.gradle里面的//apply plugin:'auto-patch-plugin',再次运行刚才生成methodsMap.robust文件的那个命令,如果一切顺利的话,会在build/outputs/robust下生成patch.jar补丁文件,移动到手机的sd卡的robust文件下,在主界面点击加载补丁,在进入second界面就能看到bug修复了。






猜你喜欢

转载自blog.csdn.net/ak47985/article/details/81012661