前言
美团Robust开源,并且支持自动化补丁,果断换掉公司的AOP patch方案。
- 主要原理:在每个方法前加入一段代码,如果patch.jar存在,则加载patch.jar中的代码片段,否则执行原本的代码片段。(如下图)
官方链接:http://tech.meituan.com/android_autopatch.html
实际运用
- apk大小
集成robust前:6.9Mb 后:7.6Mb - 优势:及时生效,rom影响(小),兼容性(99.8%)
劣势:不能修复.so/res/等文件
简单集成
- 添加依赖
compile 'com.meituan.robust:robust:0.3.3'
- 集成插件
apply plugin: 'com.android.application'
//制作补丁时将这个打开,auto-patch-plugin紧跟着
com.android.application
//apply plugin: 'auto-patch-plugin'
apply plugin: 'robust'
- 在整个项目的build.gradle加入classpath
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.meituan.robust:gradle-plugin:0.3.3'
classpath 'com.meituan.robust:auto-patch-plugin:0.3.3'
}
}
- 在app/robust下配置robust.xml文件
- 将prouard-rules.pro下内容拷贝到项目中对应的prouard-rules.pro下
- Androidmanifest.xml配置sdcard读写权限(一定要记得)
正常打包
注:必须打release包,debug中插入逻辑需要在robust.xml中配置
- 调用命令(./gradlew clean assembleRelease --stacktrace --no-daemon)打包一个release.apk
- 保存outputs/mapping/mapping.txt 以及outputs/robust/methodsMap.robust文件 (为了记住上次打包时混淆映射的.class文件,DexClass.load("映射到该文件")) 到app/robust/
打补丁姿势:
- build.gradle下的auto-patch-glugin插件开启
- 在修改的位置方法前插入 @Modify
- 重新使用命令打包(会Build Failed构建失败,但是outputs/robust/下会出现一个patch.jar)文件
- adb push /Users/a092/Downloads/Robust-test/app/build/outputs/robust/patch.jar /sdcard/robust/patch.jar调用该命令复制到手机对应目录(实际项目中,通过云端进行push)
- 加载patch.jar
5.1 调用该方法new PatchExecutor(getApplicationContext(), new PatchManipulateImp(), new RobustCallBack() ).start();加载patch
说明:PatchManipulateImpl extend PatchManipulate 实现三个方法(具体参考官方demo的PatchManipulateImpl)
RobustCallBack() 该类是补丁加载时回调的操作信息
发现目前Robust自动化补丁方面详细的解释很少,有空笔者会再贴一篇文章进行详细的讲解。