https://github.com/alibaba/AndFix
AndFix是一个在线修复漏洞的解决方案,而不是重新发布Android应用程序。它作为Android库分发。
Andfix是“Android热修复”的缩写。
AndFix支持从2.3到7.0的Android版本,支持ARM和X86架构,支持Dalvik和ART运行时,支持32位和64位。
AndFix补丁的压缩文件格式是.apatch。它从您自己的服务器发送到客户端以修复应用程序的错误。
AndFix的实现原理是方法体的替换(注意:只支持方法的替换)。
AndFix方法替换是通过java自定义注解来判断的,并通过hook来替换。AndFix在ART中有art_replaceMethod,在Dalvik中有dalvik_replaceMethod native方法。
maven依赖:
<dependency>
<groupId>com.alipay.euler</groupId>
<artifactId>andfix</artifactId>
<version>0.5.0</version>
<type>aar</type>
</dependency>
或者gradle依赖:
dependencies {
compile 'com.alipay.euler:andfix:0.5.0@aar'
}
1 初始化PatchManager
patchManager = new PatchManager(context);
patchManager.init(appversion);//current version
2 加载patch
最好在Application.onCreate()中加载
patchManager.loadPatch();
3 添加patch
patchManager.addPatch(path);
/**
* 管理AndFix所有的api
*/
public class AndFixPatchManager {
private static AndFixPatchManager mInstance = null;
private static PatchManager mPatchManager = null;
public static AndFixPatchManager getInstance() {
if (mInstance == null) {
synchronized (AndFixPatchManager.class) {
if (mInstance == null) {
mInstance = new AndFixPatchManager();
}
}
}
return mInstance;
}
//初始化AndFix方法
public void initPatch(Context context) {
mPatchManager = new PatchManager(context);
mPatchManager.init(Utils.getVersionName(context));
mPatchManager.loadPatch();
}
//加载我们的patch文件
public void addPatch(String path) {
try {
if (mPatchManager != null) {
mPatchManager.addPatch(path);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
//完成andFix模块的初始化
initAndFix();
}
private void initAndFix() {
AndFixPatchManager.getInstance().initPatch(this);
}
}
/**
* 获取应用程序versionname
*/
public static String getVersionName(Context context) {
String versionName = "1.0.0";
try {
PackageManager pm = context.getPackageManager();
PackageInfo pi = pm.getPackageInfo(context.getPackageName(), 0);
versionName = pi.versionName;
} catch (Exception e) {
e.printStackTrace();
}
return versionName;
}
安装一个有bug的旧的apk到手机
分析问题解决bug后,build一个新的apk
./gradlew assembleRelease
apkpatch下载
apkpatch命令及参数详解
./apkpatch.sh
提供两个包,生成.apatch文件
usage: apkpatch -f -t -o
合并多个.apatch文件
usage: apkpatch -m ...> -o
命令比较长,可以创建一个sh脚本。
将apatch文件通过adb push到手机
使已经安装的应用load我们的apatch文件
load成功后验证bug是否修复了
adb push xx.apatch /storage/…
组件化步骤:
AndFix原理及执行流程
AndFix集成及基本用法
AndFix组件化思路和实现