准备
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修复了。