先上andfix地址:
https://github.com/alibaba/AndFix
一:项目接入
implementation 'com.alipay.euler:andfix:0.5.0@aar'
二:初始化
这里可以在application中初始化,也可以放在按钮点击时才操作。
//创建对象
PatchManager patchManager=new PatchManager(this);
//初始化,传入appVersion
patchManager.init(SystemUtil.getVersionName(this));
//加载所有补丁包
patchManager.loadPatch();
//此处传入补丁包地址,一般从服务器获取后存入本地加载。
patchManager.addPatch(patchFileStr);
这里有个问题,每次生成的补丁包的名字必须修改,因为源码中对文件名称进行了过滤:
/**
* add patch at runtime
*
* @param path
* patch path
* @throws IOException
*/
public void addPatch(String path) throws IOException {
File src = new File(path);
File dest = new File(mPatchDir, src.getName());
if(!src.exists()){
throw new FileNotFoundException(path);
}
if (dest.exists()) {
Log.d(TAG, "patch [" + path + "] has be loaded.");
return;
}
FileUtil.copyFile(src, dest);// copy to patch's directory
Patch patch = addPatch(dest);
if (patch != null) {
loadPatch(patch);
}
}
三:补丁包生成
首先下载生成工具:
https://github.com/alibaba/AndFix/raw/master/tools/apkpatch-1.0.3.zip
解压如下:
使用方法也十分简单,需要两个apk文件,第一个即线上包,第二个是修复bug的新的安装包。
扫描二维码关注公众号,回复:
6154964 查看本文章
接着cmd切入当前解压文件路径:
输入命令:
apkpatch -f xxx -t xxx -o xxxx -k xxx -p xxx -a xxx -e xxx
-f:新的安装包路径及名称(可将安装包统一放入解压工具这个目录)
-t:旧的安装包同上
-o:导出文件路径 如 D:\aptach
-k:jks文件
-p:jks密码
-a:jks别名
-e:别名密码
完成后目录如下:
可以看到除去两个apk文件以及jks文件和原有文件外,
生成了diff.dex文件,smali的空文件夹,以及名称为一个后缀为apatch的文件。
我们用到的就是后缀为apathch的文件。