安卓热修复

介绍:

AndFix,是阿里开源的一个Android热修复框架,允许APP在不重新发布版本的情况下修复线上的bug。(仅限于修改类中的方法)

以下是各平台的热修复框架对比:
![对比图:](https://img-blog.youkuaiyun.com/20171207171725838?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzQyNTI5NzA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

使用方式:

1.首先添加依赖

compile 'com.alipay.euler:andfix:0.5.0@aar'

2.然后在Application.onCreate() 初始化PatchManager:

patchManager = new PatchManager(context);
//当前应用版本号:变更时会删除所有补丁;
patchManager.init(getPackageManager().getPackageInfo(getPackageName(), 0).versionName);
patchManager.loadPatch();
加载补丁:
patchManager.addPatch(getPatchPath() + "test.apatch")
private String getPatchPath() {
    return getExternalCacheDir().getAbsolutePath() + "/apatch/";
}

在加载补丁时,如果之前未加载过该补丁包,则会复制一份到mContext.getFilesDir()中,如果已经加载了一样名称的.apatch补丁包,再有一样名称的.apatch补丁包加载时,并不会加载到该目录,分析源码即可知道原因:

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);
   }
}

针对这个问题,可以有以下两种方式解决:
①.从后台获取补丁文件时,如果补丁文件版本要高于本地的补丁文件版本(本地的补丁文件版本可以用偏好设置文件存储),
调用 patchManager.removeAllPatch();方法,移除存放在
mPatchDir = new File(mContext.getFilesDir(), DIR);路径下的补丁包,如果补丁版本号一样,则不需要下载该补丁。
②从后台获取的补丁包的名称不一样,根据获取到的补丁包名称去加载: patchManager.addPatch(getPatchPath() + 获取到的补丁包名称)。

3.生成补丁包:
先生成一个有bug版本的apk,如:old.apk,再生成第一次修复的版本如:new.apk,通过官方提供的工具apkpatch
生成一个.apatch格式的补丁文件,需要提供原apk,修复后的apk,以及一个签名文件。
如下为打补丁所需要的:

./apkpatch.sh -f new1.apk -t old.apk -o output/ -k xjntosc.keystore -p 密码 -a xjntosc -e 密码
会在output目录中生成补丁文件:*.apatch文件,修改名称为与加载补丁文件对应的文件名。

4.push/下载补丁包:
对于上线应用,用户通过接口获取到有新版本的补丁包时,将补丁包下载下来,而后加载补丁文件,底层在classloader加载该方法时,就可以将原来有bug的方法替换加载,达到修复该方法bug的目的。
adb push test.apatch /storage/emulated/0/Android/data/com.evo.andfixdemo/cache/apatch/

5.多次补丁:
一个版本可能有很多bug,一次补丁不一定能够处理所有bug,当发现又有一个新bug发生时,将该bug修复,又生成一个新的apk,如:new2.apk,
再生成一个新的补丁,
./apkpatch.sh -f new1.apk -t old.apk -o output/ -k xjntosc.keystore -p 密码 -a xjntosc -e 密码
生成的补丁包,可以命名一个新的名字,直接下载该补丁包;
也可以命名为同一个名字,但是在程序中必须做出判断,如果该版本的补丁比已下载的补丁版本高,则一定要将原补丁删除,然后在加载该补丁。

6.对于采用360、阿里等加固的应用:
对于加固的应用,在生成补丁包时,old.apk和new.apk一定要采用未加固的版本,否则补丁不生效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值