github地址:https://github.com/Meituan-Dianping/Robust
1.创建robust.xml 文件 和混淆文件
true
false
false
true
false
true
true
com.example
com.example.test.patch
proguard-rules.pro
-dontwarn
-keepattributes Signature,SourceFile,LineNumberTable
-keepattributes *Annotation*
-keeppackagenames
-ignorewarnings
-dontwarn android.support.v4.**,**CompatHoneycomb,com.tenpay.android.**
-optimizations !class/unboxing/enum,!code/simplification/arithmetic
2.项目gradle导入:
dependencies {
classpath 'com.android.tools.build:gradle:3.4.2'
classpath 'com.meituan.robust:auto-patch-plugin:0.4.99'
classpath 'com.meituan.robust:gradle-plugin:0.4.99'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
3.app下gradle导入
//apply plugin: 'auto-patch-plugin'
apply plugin: 'robust'
这里是必须在release下进行 所有需要混淆的注意下
signingConfigs {
release {
storeFile file('/Users/morningsun/AndroidStudioProjects/test/signing/singin')
storePassword '1111111'
keyAlias = 'key0'
keyPassword '1111111'
}
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
}
implementation 'com.meituan.robust:robust:0.4.99'
4.编写逻辑(弄个按钮啥的 能看出变化就行)
加上手动打补丁
if (view.getId() == R.id.btn1) {
new PatchExecutor(getApplicationContext(), new PatchManipulateImp(), new callBack()).start();
}
5.创建PatchManipulateImp类
public class PatchManipulateImp extends PatchManipulate {
@Override
protected List 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);
Log.w("robust","robustApkHash :" + robustApkHash);
//connect to network to get patch list on servers
//在这里去联网获取补丁列表
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
//LocalPath是存储原始的补丁文件,这个文件应该是加密过的,TempPath是加密之后的,TempPath下的补丁加载完毕就删除,保证安全性
//这里面需要设置一些补丁的信息,主要是联网的获取的补丁信息。重要的如MD5,进行原始补丁文件的简单校验,以及补丁存储的位置,这边推荐把补丁的储存位置放置到应用的私有目录下,保证安全性
patch.setLocalPath(Environment.getExternalStorageDirectory().getPath()+ File.separator+"robust"+File.separator + "patch");
patch.setTempPath(Environment.getExternalStorageDirectory().getPath()+ File.separator+"robust"+File.separator + "patch");
//setPatchesInfoImplClassFullName 设置项各个App可以独立定制,需要确保的是setPatchesInfoImplClassFullName设置的包名是和xml配置项patchPackname保持一致,而且类名必须是:PatchesInfoImpl
//请注意这里的设置
patch.setPatchesInfoImplClassFullName("com.example.test.PatchesInfoImpl");
List patches = new ArrayList();
patches.add(patch);
return patches;
}
@Override
protected boolean verifyPatch(Context context, Patch patch) {
return true;
}
@Override
protected boolean ensurePatchExist(Patch patch) {
return true;
}
}
6.进行打包
命令:./gradlew clean assembleRelease --stacktrace --no-daemon
普通的签名方式也可以
7.adb 安装
adb install apk路径
8.开始打补丁
将outputs下的 mapping.txt 和methodsMap.robust 文件移动到创建的robust文件中
app下gradle 文件中
apply plugin: 'auto-patch-plugin'
//apply plugin: 'robust'
9.修改代码
加上注解 @Modify 和@Add
10.再进行打包
11.将patch.jar 移动手机的/sdcard/robust/文件下
adb push jar包地址 /sdcard/robust/patch_temp.jar
注意 移动过去是把patch.jar 改成 patch_temp.jar 不然会宝找不到文件的错误
12.运行程序即可