文章目录

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

修复过程

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源码讲解

总结

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

更多相关文章

  1. NPM 和webpack 的基础使用
  2. 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程
  3. Android制作并替换系统开机动画bootanimation.zip(需root)
  4. Android(安卓)Preference使用
  5. Java大文件上传(Android亦可)
  6. 【转】Android兼容性测试CTS --环境搭建、测试执行、结果分析
  7. Android: NDK编程入门笔记
  8. android中使用sqlite、复制assets下的数据库到SD卡、支持大于1M
  9. Android(安卓)Studio 模板(Template)定制

随机推荐

  1. Android(安卓)service与Thread
  2. Andriod学习笔记(二)
  3. Android(安卓)实用技巧 --- 命令godir
  4. ANDROID自动化测试工具:ROBOTIUM
  5. Android(安卓)第三方开源SwipeToDismiss:
  6. Android(安卓)Studio自动生成带系统签名
  7. Android(安卓)Camera 使用小结
  8. Android(安卓)事件传递机制
  9. Android插件技术——(一)动态加载jar
  10. android音频编辑之音频合成