AndFix(Android热升级解决方案)使用心得

在android应用发布过程中,有时候应用刚刚发布上线,就发现出现了紧急bug,这个时候怎么办呢。之前大家的做法是修复bug、重新打包、测试、上线,然而这种方案不仅浪费时间而且消耗用户流量,再说了不是所有的用户都会去下载更新。现在问题来了,可不可以不更新应用来修复应用的bug呢,答案是可以的,目前来说解决方案有一下几种:
1.Dexposed
2.AndFix
以上两种方案都可以实现android应用的热升级,今天博主主要介绍的是第二种方案AndFix的一些使用心得。


AndFix简介

AndFix全称是Android hot-fix。是alibaba的开源在线热补丁框架,框架的作用是在不重复发布版本的情况下修复线上应用的bug。AndFix目前支持Android2.3到6.0版本,及支持arm和x86系统架构的设备,补丁文件的格式为.apath。


使用方法(以AndroidStudio为例)

  • 添加AndFix依赖
compile 'com.alipay.euler:andfix:0.3.1@aar'
  • 初始化PatchManager
patchManager = new PatchManager(context);
patchManager.init(appversion);//appversion当前版本
patchManager.loadPatch();

官方文档说是要尽早的去初始化patchManager,所以一般的写法是在application中去初始化。

  • 添加补丁(.patch文件)
patchManager.addPatch(path);//path为下载的补丁文件存放的位置
  • 以下为完整代码(来源
    public PatchManager mPatchManager;
    private static final String APATCH_PATH = "/out.apatch";
    private static final String DIR = "apatch";//补丁文件夹
    @Override
    public void onCreate() {
        super.onCreate();
        // 初始化patch管理器
        mPatchManager = new PatchManager(this);
        // 初始化patch版本
        mPatchManager.init("1.0");
        // 加载已经添加到PatchManager中的patch
        mPatchManager.loadPatch();

        try {
            //补丁文件的位置
            String patchFileString = Environment.getExternalStorageDirectory()
                    .getAbsolutePath() + APATCH_PATH;
            //添加补丁文件
            mPatchManager.addPatch(patchFileString);
            Log.d("TAG", "apatch:" + patchFileString + " added.");


            //这里我加了个方法,复制加载补丁成功后,删除sdcard的补丁,避免每次进入程序都重新加载一次
            File f = new File(this.getFilesDir(), DIR + APATCH_PATH);
            if (f.exists()) {
                boolean result = new File(patchFileString).delete();
                if (!result)
                    Log.e("TAG", patchFileString + " delete fail");
            }
        } catch (IOException e) {
            Log.e("TAG", "", e);
        }

    }
  • 当版本升级时删除已加载patch文件
mPatchManager.removeAllPatch();
  • 代码混淆
-optimizationpasses 5                                                           # 指定代码的压缩级别
-dontusemixedcaseclassnames                                                     # 是否使用大小写混合
-dontskipnonpubliclibraryclasses                                                # 是否混淆第三方jar
-dontpreverify                                                                  # 混淆时是否做预校验
-verbose                                                                        # 混淆时是否记录日志
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*        # 混淆时所采用的算法

#重要,別忘了這些,不混淆andfix包,不混淆native方法
-dontwarn android.annotation
-dontwarn com.alipay.euler.**
-keep class com.alipay.euler.** {*;}
-keep class * extends java.lang.annotation.Annotation
-keepclasseswithmembernames class * {
    native <methods>;
}
  • 生成补丁文件(.patch)

    使用工具:apkpatch-1.0.3
    工具下载地址(在tools文件夹中)
    工具使用方法:需要原始apk包和修改完bug之后的apk包之间生成一个差异文件,这个文件就是我们的.patch补丁文件

命令 : apkpatch.bat -f new.apk -t old.apk -o output1 -k debug.keystore -p android -a androiddebugkey -e android

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

cmd
在命令执行之后会生成补丁文件

这里写图片描述
将文件名改成out.apatch
在安装了有bug的apk之后,将out.apatch补丁文件放置sdcard更目录,重新启动应用,之前的bug就会被修复了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值