热修复AndFix详解

文章目录

  • AndFix介绍
    • 原则
    • 修复过程
  • AndFix集成
  • AndFix初始化
  • 生成带bug的apk
  • apatch文件生成
  • patch文件安装
  • AndFix模块组件
  • AndFix源码讲解
  • 总结

AndFix介绍

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详解_第1张图片
AndFix方法替换是通过java自定义注解来判断的,并通过hook来替换。AndFix在ART中有art_replaceMethod,在Dalvik中有dalvik_replaceMethod native方法。

修复过程

热修复AndFix详解_第2张图片

AndFix集成

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'
}

AndFix初始化

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的旧的apk到手机
分析问题解决bug后,build一个新的apk

./gradlew assembleRelease

apatch文件生成

apkpatch下载

apkpatch命令及参数详解
./apkpatch.sh

提供两个包,生成.apatch文件

usage: apkpatch -f  -t  -o  -k  -p <***> -a  -e <***>
 -a,--alias      keystore entry alias.
 -e,--epassword <***>   keystore entry password.
 -f,--from         new Apk file path.
 -k,--keystore     keystore path.
 -n,--name        patch name.
 -o,--out <dir>         output dir.
 -p,--kpassword <***>   keystore password.
 -t,--to           old Apk file path.

合并多个.apatch文件

usage: apkpatch -m ...> -o  -k  -p <***> -a  -e <***>
 -a,--alias      keystore entry alias.
 -e,--epassword <***>   keystore entry password.
 -k,--keystore     keystore path.
 -m,--merge ...>    path of .apatch files.
 -n,--name        patch name.
 -o,--out <dir>         output dir.
 -p,--kpassword <***>   keystore password.

命令比较长,可以创建一个sh脚本。

patch文件安装

将apatch文件通过adb push到手机
使已经安装的应用load我们的apatch文件
load成功后验证bug是否修复了

adb push xx.apatch /storage/…

AndFix模块组件

组件化步骤:

  • 发现bug生成apatch;
  • 将patch下发到用户手机存储系统;
  • 利用AndFix完成patch安装,解决bug。

时序图(OmniGraffle软件):
热修复AndFix详解_第3张图片

AndFix源码讲解

总结

AndFix原理及执行流程
AndFix集成及基本用法
AndFix组件化思路和实现

你可能感兴趣的:(Android热修复)