安卓热修复

来源:互联网 发布:现在做淘宝很难 编辑:程序博客网 时间:2024/05/10 16:34

介绍:

AndFix,是阿里开源的一个Android热修复框架,允许APP在不重新发布版本的情况下修复线上的bug。(仅限于修改类中的方法)以下是各平台的热修复框架对比:![对比图:](http://img.blog.csdn.net/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一定要采用未加固的版本,否则补丁不生效。

原创粉丝点击