美团Robust的GitHub地址
https://github.com/Meituan-Dianping/Robust
导入
1、Module的build.gradle中
apply plugin: 'com.android.application'
//制作补丁时将这个打开,auto-patch-plugin紧跟着com.android.application
//apply plugin: 'auto-patch-plugin'
apply plugin: 'robust'
...
implementation 'com.meituan.robust:robust:0.4.90'
Project的build.gradle中
...
dependencies {
...
classpath 'com.meituan.robust:gradle-plugin:0.4.90'
classpath 'com.meituan.robust:auto-patch-plugin:0.4.90'
}
2、把美团demo中的一些文件拷贝到你的app中
在你的APP根目录下面(src同级目录中)新建一个 robust 文件夹
PatchManipulateImp、RobustCallBackSample 2个java类拷贝到你的APP中
把Demo中的APP根目录(src同级目录中)的robust.xml文件拷贝到你APP的相同位置
3、修改配置代码
robust.xml文件中修改
<!--需要热补的包名或者类名,这些包名下的所有类都被会插入代码-->
<!--这个配置项是各个APP需要自行配置,就是你们App里面你们自己代码的包名,
这些包名下的类会被Robust插入代码,没有被Robust插入代码的类Robust是无法修复的-->
<packname name="hotfixPackage">
<name>com.lahm.blx</name>
</packname>
我的App包名:com.lahm.blx。代码大部分在包里面
<!--不需要Robust插入代码的包名,Robust库不需要插入代码,如下的配置项请保留,还可以根据各个APP的情况执行添加-->
<exceptPackname name="exceptPackage">
<name>com.lahm.blx.utils</name>
</exceptPackname>
我的com.lahm.blx下面有个utils包,这个包下面的代码,我确定不需要热修复,所以这里设置。建议这里不修改,此处只是为了说明有这个功能
<!--项目是否支持progaurd-->
<proguard>false</proguard>
是否混淆,此处我设置为false。默认为true
PatchManipulateImp代码修改
patch.setLocalPath(Environment.getExternalStorageDirectory().getPath()+ File.separator+"robust"+File.separator + "patch");
...
patch.setPatchesInfoImplClassFullName("com.lahm.blx.PatchesInfoImpl");
补丁文件的路径,建议根据app实际情况设定。
setPatchesInfoImplClassFullName我设置为:包名+PatchesInfoImpl
最后在合适的地方加入下面代码
PatchExecutor(applicationContext, PatchManipulateImp(), RobustCallBackSample()).start()
打包
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
混淆关闭,需要跟上面robust.xml中的设定一致
签名打包完成后,真机或者模拟器安装apk包
然后
找到 app/build/outputs/robust/methodsMap.robust文件,复制到上面新建的 robust 文件夹中
如果混淆开启,则会有app/build/mapping/release/mapping.txt文件,也一同复制到robust 文件夹中
补丁
现在我们发现安装的apk中有点问题,需要在某个Activity的onCreate中新增个方法来解决
@Modify
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
textRobust()
}
@Add
fun textRobust(){
ToastUtils.showShortTip("热修复增加")
}
@Modify修改 @Add 新增
放开 apply plugin: 'auto-patch-plugin'
apply plugin: 'com.android.application'
//制作补丁时将这个打开,auto-patch-plugin紧跟着com.android.application
apply plugin: 'auto-patch-plugin'
apply plugin: 'robust'
重新打包
提示Cause: auto patch end successfully打包失败,但是补丁成功
查看app/build/outputs/robust,多个2个文件。patch.jar就是补丁文件
把patch.jar导入到真机or模拟器中的 PatchManipulateImp设置的setLocalPath中,再运行app即可
实际开发中怎么导入,自行跟服务端商议
注意:如果App先执行了
PatchExecutor(applicationContext, PatchManipulateImp(), RobustCallBackSample()).start()
再导入的补丁包,则App不会有任何反应,除非重新执行此方法
其他的注意事项请关注官方的GitHub