您的位置:首页 > 移动开发 > Android开发

Android热更新AndFix

2017-06-26 12:24 162 查看
Android hot-fix,是alibaba的一个开源Android热修复框架,支持Android 2.版本从2.3到7.0,包括ARM和X86架构,Dalvik和ART运行时,都是32位和64位。github地址

使用方法

1,gradle添加依赖

dependencies {
compile 'com.alipay.euler:andfix:0.5.0@aar'
}


2,在Application里面初始化

private void initAndFix() {
String appversion = "1";
patchManager = new PatchManager(context);
//每次appversion变更都会导致所有补丁被删除,如果appversion没有改变,则会加载已经保存的所有补丁。
patchManager.init(appversion);//current version
patchManager.loadPatch();
try {
String path = activity.getExternalFilesDir(null)+"/fix.apatch";
Log.i("热修复补丁path="+path);
//添加补丁patch路径即可,补丁会立即生效
patchManager.addPatch(path);
} catch (IOException e) {
e.printStackTrace();
}
}


3.打补丁包。

官方提供的工具下载后解压



使用命令生成.apatch补丁文件,先cmd进入该目录下

执行以下命令:

命令模板:

apkpatch.bat -f 新apk -t 旧apk -o 输出目录 -k app签名文件 -p 签名文件密码 -a 签名文件别名 -e 别名密码

-f <new.apk> :新apk
-t <old.apk> : 旧apk
-o <output> : 输出目录(补丁文件的存放目录)
-k <keystore>: 打包所用的keystore
-p <password>: keystore的密码
-a <alias>: keystore 用户别名
-e <alias password>: keystore 用户别名密码

示例:
apkpatch.bat -f newAPK\new.apk -t oldAPK\old.apk -o output -k key_release -p 111111 -a qckissName -e 111111




点.apatch文件就是补丁

patchManager.init(appversion);

public void init(String appVersion) {
if(!this.mPatchDir.exists() && !this.mPatchDir.mkdirs()) {
Log.e("PatchManager", "patch dir create error.");
} else if(!this.mPatchDir.isDirectory()) {
this.mPatchDir.delete();
} else {
SharedPreferences sp = this.mContext.getSharedPreferences("_andfix_", 0);
String ver = sp.getString("version", (String)null);
if(ver != null && ver.equalsIgnoreCase(appVersion)) {
this.initPatchs();
} else {
this.cleanPatch();
sp.edit().putString("version", appVersion).commit();
}

}


原理:

AndFix核心在于在native层做方法主体的替换



流程:



注意事项:

不支持YunOS国产系统cpu构架

无法添加新类和新的字段

使用加固前的apk制作补丁,但是补丁文件很容易被反编译,也就是修改过的类源码容易泄露。

使用加固平台可能会使热补丁功能失效(我也没试)

addPatch(path)一次补丁后,.apatch文件会copy到getFilesDir目录下的/apatch文件夹中,在下次补丁更新时,会检测补丁是否已经添加在apatch文件夹下,已存在就不会复制加载sdcard的.apatch补丁。

AndFix不支持布局资源等的修改

removeAllPatch()或者修改appversion;

public void addPatch(String path) throws IOException {
File src = new File(path);
File dest = new File(this.mPatchDir, src.getName());
if(!src.exists()) {
throw new FileNotFoundException(path);
} else if(dest.exists()) {//检测补丁是否已经添加
Log.d("PatchManager", "patch [" + path + "] has be loaded.");
} else {
FileUtil.copyFile(src, dest);
Patch patch = this.addPatch(dest);
if(patch != null) {
this.loadPatch(patch);//加载补丁
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android