近端时间,看了看 阿里的热修复,记录一下集成的步骤也方便自己查阅:
一、使用
先说一下使用方式,我是在项目中写了一个空指针的bug,来测试,下面会说明这些文件是怎么来的
- 空指针bug(生成一个存在问题的old.apk)存在的代码如下:
//注:此时的fix.apatch文件,也就是差分包,阿里热修复需要使用到的,下面会说明怎么生成该文件。
File fixFile = new File(Environment.getExternalStorageDirectory() + File.separator + "fix.apatch");
if (fixFile.exists()) {
try {
MyApplication.mPathManager.addPatch(fixFile.getAbsolutePath());//在这里调用addPatch方法
showShortToast("热修复成功!");
} catch (IOException e) {
e.printStackTrace();
showShortToast("热修复失败!");
}
}
//注意,这里会报空指针异常(此时生成一个old.apk , 也就是存在bug的apk)
mBtn.setText("11");
- 修复后生成一个新的apk,代码如下:
//注:此时的fix.apatch文件,也就是差分包,阿里热修复需要使用到的,下面会说明怎么生成该文件。
File fixFile = new File(Environment.getExternalStorageDirectory() + File.separator + "fix.apatch");
if (fixFile.exists()) {
try {
MyApplication.mPathManager.addPatch(fixFile.getAbsolutePath());
showShortToast("热修复成功!");
} catch (IOException e) {
e.printStackTrace();
showShortToast("热修复失败!");
}
}
//注意,此时将这行代码注掉
// mBtn.setText("11");
二、集成项目
1、添加依赖到项目中:
implementation 'com.alipay.euler:andfix:0.5.0@aar'
,也可以到上面官网去查看最新的依赖。
2,在自己项目的Application中,添加以下初始化代码
public static PatchManager mPathManager;
@Override
public void onCreate() {
super.onCreate();
//阿里热修复
mPathManager = new PatchManager(this);
mPathManager.init("1");//当前应用版本(可以通过PackageManager获取)
//加载之前的patch包
mPathManager.loadPatch();
}
三、准备apk(需要生成签名包)
1,需要一个有bug的Old,也就是存在问题的apk(需要签名)。
2,准备已修复bug的新的apk(需要签名)。
3,到官网阿里热修复,下载tools,下图的文件(并解压)
4,将准备的apk,和打包时的签名文件,拷贝到解压出来的文件夹下:
image.png
四、执行下面的命令
在tools文件夹下打开命令窗口,输入下面的命令:
usage: apkpatch -f <new> -t <old> -o <output> -k <keystore> -p <***> -a <alias> -e <***>
-a,--alias <alias> keystore entry alias.(签名的别名)
-e,--epassword <***> keystore entry password.(签名的密码)
-f,--from <loc> 新的apk(无bug)
-k,--keystore <loc> keystore path.(签名打包秘钥)
-n,--name <name> patch name.
-o,--out <dir> 生成的补丁文件所放的文件夹
-p,--kpassword <***> keystore password.(签名打包秘钥的密码)
-t,--to <loc> 旧版apk(存在bug)
我的输入的命令为(命令解释可以看上面),出现如下图的add,即为成功,输出的文件(也就是差分包)在该目录的out文件夹下:
将生成的文件fix.apatch
放置到手机里面,也就是步骤1的
File fixFile = new File(Environment.getExternalStorageDirectory() + File.separator + "fix.apatch");
该位置。如果每次运行,改文件存在,就会进行修复。
网友评论