Android热修复实战之AndFix

本文详细介绍了AndFix热修复工具的使用方法及其实现原理,包括集成步骤、BUG修复流程和源码分析。AndFix由阿里巴巴开源,支持Android 2.3至7.0版本,适用于ARM和X86架构。文章通过实战演示了如何构建差异包并修复应用中的BUG,同时深入剖析了AndFix的源码,解释了其工作流程。

目录

写在前面

一、AndFix基本介绍

1.1、AndFix简介

1.2、AndFix方法体替换规则

1.3、AndFix BUG修复过程

二、AndFix代码实战

2.1、AndFix集成

2.2、AndFix初始化

2.3、构建APK

2.4、修复BUG

三、AndFix源码解析


写在前面

上一篇《Android热修复技术简介》中对Android的热修复技术的概念和常用的技术方案做了一个简单的介绍,那么今天就来实战一下热修复技术,我们使用的是AndFix,为什么是它?因为无论是从使用上还是原理上AndFix都是相对简单的,毕竟这是实战的第一篇,还是要有个由易到难的过程的,好了,话不多说,开始吧!

一、AndFix基本介绍

1.1、AndFix简介

AndFix项目地址:https://github.com/alibaba/AndFix,大家访问这个地址去看它的详细介绍,我这里只是简单的列一下:

  • 阿里巴巴开源的Android热修复工具,Android hot fix的缩写,旨在帮助开发者修复线上应用出现的BUG
  • 支持2.3-7.0,ARM和X86架构,Dalvik和Art运行时(注意某些机器上可能还是不兼容的)
  • Andfix生成的差异包的后缀名是 .apatch,可以将差异包从server分发到client去修复BUG
  • AndFix只能用于方法级别的替换,修复方法中产生的BUG,使用场景有限。它通过自定义注解的方式来判断哪些方法需要被替换,替换时是通过Native层的方法去完成替换的,所以这也就造成了AndFix的兼容性其实并没有那么强,因为Native层可能会随着API版本不同而改变,不同的运行时机制都需要重新适配。

1.2、AndFix方法体替换规则

1.3、AndFix BUG修复过程

二、AndFix代码实战

2.1、AndFix集成

添加AndFix依赖,这一步没啥好说的,直接到它的GitHub主页上去复制就OK了:

//引入AndFix模块
implementation 'com.alipay.euler:andfix:0.5.0@aar'

2.2、AndFix初始化

根据GitHub文档上的How to use这一部分的说明,我们来对AndFix做初始化操作。这里创建一个类AndFixPatchManager来统一管理AndFix所有的API,这样做一是为了方便管理,二是为了可以降低AndFix对我们代码的侵入性:

/**
 * 作者:created by Jarchie
 * 时间:2020/5/22 14:33:16
 * 邮箱:jarchie520@gmail.com
 * 说明:管理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();
        }
    }

}

这里面用到了一个Utils.getVersionName()的工具方法,这个方法就是来获取应用版本信息的:

    //获取版本名称
    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;
    }

然后在项目的Application类中调用上面写好的初始化方法即可完成AndFix的初始化操作:

/**
 * 作者:created by Jarchie
 * 时间:2020/5/22 14:40:30
 * 邮箱:jarchie520@gmail.com
 * 说明:自定义的Application类
 */
public class BaseApp extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        //完成AndFix的初始化
        initAndFix();
    }

    private void initAndFix() {
        AndFixPatchManager.getInstance().initPatch(this);
    }
}

2.3、构建APK

2.3.1、构建异常APK

①、创建布局

先来创建一个布局文件activity_main.xml,内容很简单,两个按钮,一个模拟异常场景,一个模拟修复场景:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/mCreateBug"
        android:layout_width="match_parent"
        android:layout_height="45dp"
        android:layout_margin="20dp"
        android:background="@color/colorPrimary"
        android:gravity="center"
        android:text="生成BUG"
        android:textColor="#fff" />

    <TextView
        android:id="@+id/mFixBug"
        android:layout_width="match_parent"
        android:layout_
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值