• 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:0.5.0@aar'
    -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:logandroidjavagit hree exiufualiyunandfixapkpatch   目录下 (指明便于我讲解补丁文件生成

    cmd打开命令,切换到 F:logandroidjavagit hree exiufualiyunandfixapkpatch   目录下

    然后把先前生成的两个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:logandroidjavagit hree exiufualiyunandfixapkpatch  目录下便于提交到手机内部存储下面.

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

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

    补丁文件修复旧(bug)apk

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

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

    adb命令相关请看博客: http://www.cnblogs.com/zhangqie/p/8505252.html

    上传成功后,我们结束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

     

  • 相关阅读:
    Python动态展示遗传算法求解TSP旅行商问题
    MOEAD算法中均匀权向量的实现---Python
    HDU 5294 多校第一场1007题 最短路+最小割
    POJ 3261 Milk Patterns sa+二分
    HDU 4292 FOOD 2012 ACM/ICPC Asia Regional Chengdu Online
    CodeForces 201A Clear Symmetry
    POJ 1679 The Unique MST 确定MST是否唯一
    POJ 3268 Silver Cow Party 最短路 基础题
    POJ 2139 SIx Degrees of Cowvin Bacon 最短路 水題
    POJ2229 Sumsets 基礎DP
  • 原文地址:https://www.cnblogs.com/zhangqie/p/8548542.html
Copyright © 2020-2023  润新知