android--------阿里 AndFix 热修复

AndFix,全称是Android hot-fix。是阿里开源的一个热补丁框架,允许APP在不重新发布版本的情况下修复线上的bug。

支持Android 2.3 到 6.0,并且支持arm 与 X86系统架构的设备。完美支持Dalvik与ART的Runtime,补丁文件是以 .apatch 结尾的文件。

原理

AndFix的原理就是方法的替换,把有bug的方法替换成补丁文件中的方法;

直接在native层进行方法的结构体信息对换,从而实现完美的方法新旧替换,从而实现热修复功能。

添加依赖和混淆

 compile ‘com.alipay.euler:andfix:[email protected]‘
-keep class * extends java.lang.annotation.Annotation
-keepclasseswithmembernames class * {
    native <methods>;
}

权限

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

Application 代码(在AndriodManifest中添加)

public class AndFixApplication extends Application {

    public static PatchManager mPatchManager;

    public String TAG = "Application";

    private static final String APATCH_PATH = "/out.apatch"; // 补丁文件名

    @Override
    public void onCreate() {
        super.onCreate();
        // 初始化patch管理类
        mPatchManager = new PatchManager(this);
        // 初始化patch版本
        mPatchManager.init("1.0");

        mPatchManager.loadPatch();

        try {
            // .apatch file path ,这里一定要注意每台手机sd卡路径不同
            String patchFileString =  Environment.getExternalStorageDirectory().getAbsolutePath()  + APATCH_PATH;
            Log.i(TAG, "onCreate: "+patchFileString);
            //3)添加patch
            mPatchManager.addPatch(patchFileString);
            Log.d(TAG, "apatch:" + patchFileString + " added.");
        } catch (IOException e) {
            Log.e(TAG, "", e);
        }

    }
}

生成有bug的apk文件和生成修复好的apk文件

第一次apk文件代码,表示有bug未修复的

  private void initView(){
        textView = (TextView) findViewById(R.id.textview);
        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this,"bug未修复",Toast.LENGTH_LONG).show();
                textView.setText("bug未修复");
            }
        });
    }

生成签名文件 andfix.jks  然后生成apk文件,命名为 old.apk

第二步生成 修复bug的apk文件,我的修复很简单,命名为new.apk

 private void initView(){
        textView = (TextView) findViewById(R.id.textview);
        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this,"bug已修复",Toast.LENGTH_LONG).show();
                textView.setText("bug已修复");
            }
        });
    }

生成patch补丁文件

下载生成工具:https://github.com/alibaba/AndFix/tree/master/tools 下的apkpatch-1.0.3.zip

解压文件,假设在:F:\blog\android\java\git\three\rexiufu\aliyun\andfix\apkpatch\   目录下 (指明便于我讲解补丁文件生成

cmd打开命令,切换到 F:\blog\android\java\git\three\rexiufu\aliyun\andfix\apkpatch\   目录下

然后把先前生成的两个apk 文件 old.apk和new.apk 拷贝到该目录下,把生成的签名文件andfix.jks 也拷贝到该目录下

输入命令生成 补丁文件,输入命令,看到下面表示成功

命令 : apkpatch.bat -f new.apk -t old.apk -o D:\Android -k andfix.jks -p 123456 -a andfix -e 123456

语法解释

-f <new.apk> :新版本
-t <old.apk> : 旧版本           
-o <output> : 输出目录
-k <keystore>: 打包所用的keystore           
-p <password>: keystore的密码                   
-a <alias>: keystore 用户别名                   
-e <alias password>: keystore 用户别名密码

在D:\Android 目录下面生成了两个文件

第二个就是补丁文件,我们也要使用他来实现补丁修复。

把第二个文件复制到 F:\blog\android\java\git\three\rexiufu\aliyun\andfix\apkpatch\  目录下便于提交到手机内部存储下面.

重命名为 out.apatch  和前面的Application类中的APATCH_PATH的名称对应

 private static final String APATCH_PATH = "/out.apatch"; // 补丁文件名

补丁文件修复旧(bug)apk

未提交补丁文件前,先把有bug的apk安装在手机上,运行起来,看看我的效果图:

这里我们通过adb命令来上传补丁到手机本地内存目录下,然后修复错误,

adb命令相关请看博客:

上传成功后,我们结束bug应用,重新启动,修复补丁,效果图:

项目中使用

一般正式的项目不会这样去需要用户点击某个按钮来加载修复包(out.apatch),而是用户一开始进入我们app的时候,第一个界面就应该去服务器访问(一般一个App中都会有一个接口,用来获取服务器给客户端的全局配置)。

假设服务器返回有更新的包,应该就应该弹框去下载apatch文件,这个时候用户是什么都做不了的,最好加个进度条,当下载完成后,然后修复,最后在跳到主界面。

最好使用HTTPS保证数据的安全,当我们访问服务器是否有修复包的时候,如果有,服务器应该返回修复文件apatch的下载地址和文件的MD5值,

然后客户端下载完成后对文件进行MD5,然后和服务器的返回的MD5值进行对比看是否一致,因为文件可能被篡改,安全问题,对MD5加密的值和后台人员商议,一致即可。

局限性

  • 不支持YunOS
  • 无法添加新类和新的字段
  • 需要使用加固前的apk制作补丁,但是补丁文件很容易被反编译,也就是修改过的类源码容易泄露。
  • 有的手机不支持,爱报错

所以并不推荐使用。

结语:

我的Demo中 测试 release版  (需要配置签名)我测试成功了,可以下载参考

Github:https://github.com/DickyQie/android-andfix

AndFix官网源码和案例:https://github.com/alibaba/AndFix

原文地址:https://www.cnblogs.com/zhangqie/p/8548542.html

时间: 2024-10-12 12:11:37

android--------阿里 AndFix 热修复的相关文章

阿里 AndFix 热修复框架简介

阿里AndFix热修复框架简介 热修复原理: Android的类加载机制 Android的类加载器分为两种,PathClassLoader和DexClassLoader,两者都继承自BaseDexClassLoader PathClassLoader代码位于libcore\dalvik\src\main\Java\dalvik\system\PathClassLoader.java DexClassLoader代码位于libcore\dalvik\src\main\java\dalvik\sys

Andfix热修复框架原理及源代码解析-上篇

热补丁介绍及Andfix的使用 Andfix热修复框架原理及源代码解析-上篇 Andfix热修复框架原理及源代码解析-下篇 1.不知道怎样使用的同学,建议看看我上一篇写的介绍热补丁和Andfix的使用,这样你才有一个大概的框架.通过使用Andfix,事实上我们心中会有一个大概的轮廓,它的工作原理,大概就是.所谓的补丁文件.就是通过打包工具apkpatch比对新的apk和旧的apk之间的差异. 然后让我们的旧包执行的时候.就载入它,把曾经的一些信息替换掉. 我们如今就抱着这个慷慨向去深入源代码探个

阿里Sophix热修复

阿里巴巴对Android热修复技术已经进行了长达多年的探索. 最开始,是手淘基于Xposed进行了改进,产生了针对Android Dalvik虚拟机运行时的Java Method Hook技术,Dexposed.但这个方案由于对底层Dalvik结构过于依赖,最终无法继续兼容Android5.0以后ART虚拟机,因此作罢. 后来支付宝提出了新的热修复方案Andfix.Andfix同样是一种底层结构替换的方案,也达到了运行时生效即时修复的效果,并且重要的是,做到了Dalvik和ART环境的全版本兼容

Andfix热修复框架原理及源码解析-上篇

热补丁介绍及Andfix的使用 Andfix热修复框架原理及源码解析-上篇 Andfix热修复框架原理及源码解析-下篇 1.不知道如何使用的同学,建议看看我上一篇写的介绍热补丁和Andfix的使用,这样你才有一个大概的框架.通过使用Andfix,其实我们心中会有一个大概的轮廓,它的工作原理,大概就是,所谓的补丁文件,就是通过打包工具apkpatch比对新的apk和旧的apk之间的差异.然后让我们的旧包运行的时候,就加载它,把以前的一些信息替换掉.我们现在就抱着这个大方向去深入源码探个究竟!!首先

AndFix热修复问题

时隔两周迟迟没有新的产出实在内疚,怪AndFix咯,这样至少还能得到一丢丢安慰.在前面一篇<AndFix热修复实现>之后本以为已是太平盛世了,熟知测试上出现了问题,真机测试途中发现HTC6.0.1与MEIZU5.1居然在热修复替换clazz_new意外崩溃了,"阿狸,说好的兼容2.0~6.0呢"?百度上逗留了好久,大部分都指明是>6.0权限问题,需要在代码中动态申请权限(如下demo所示),但小编断点后发现判定权限是否添加的结果都是可执行的,并没有提示需要授予相关权限

Andfix热修复框架原理及源码解析-下篇

热补丁介绍及Andfix的使用 Andfix热修复框架原理及源码解析-上篇 Andfix热修复框架原理及源码解析-下篇 如果没有看过上篇的建议从上篇看起.先大概回忆下,上一篇分析了mPatchManager.init("1.0"),addPatch()方法.还有通过分析打补丁工具,了解补丁文件是怎么生成的.下面就来讲讲我们如何去读它.思绪回到Application的loadPatch()方法. 这个方法就是遍历mPatchs,就是上篇介绍的存储patch的一个集合.根据补丁名找到对应的

阿里SopHix热修复框架

2015年以来,Android开发领域里对热修复技术的讨论和分享越来越多,同时也出现了一些不同的解决方案,如QQ空间补丁方案.阿里AndFix以及微信Tinker(Bugly sdk也集成Tikner热更新)和阿里最新出品Sophix.它们在原理各有不同,适用场景各异.不过从技术上来说多数热修复框架是基于ClassLoader加载机制.下面是常见热修复框架的比较. 开通热修复服务 读者可以打开Sophix热修复的官网:Sophix官网1.注册阿里云账号,选择移动热修复服务 ,选择之后需要开通此功

Andfix热修复原理

一.前言 最近腾讯弄出一个Tinker热修复框架,那么本文先不介绍这个框架,先来介绍一下阿里的一个热修复框架AndFix,这个框架出来已经很长时间了,但是看网上没有太多非常详细的讲解,这里就来做一次分析.正好项目中要使用到.首先这个框架是开源的:https://github.com/alibaba/AndFix 其实在最早的时候我已经分析了阿里的另外一个热修复框架:Dexposed框架,还不了解的同学可以点击这里查看:Dexposed框架原理解析以及使用 当时介绍这个框架的时候发现他的实现原理很

Android上HotPatch热修复的安全问题

Android上的HotPatch热修复是由阿里发明的,国内在这方面非常有创新性,我主要关注HotPatch的安全问题.这是篇对国内各app热修复技术的综合介绍文章但并没提及潜在安全问题:http://www.infoq.com/cn/articles/Android-hot-fix Android上的HotPatch热修复使用不当可以给系统带来漏洞:https://my.oschina.net/u/1396564/blog/614827 安全(Security): 在主APK应用此技术后,当无