Android热修复方案—AndFix

1、概述

AndFix is a library that offer hot-fix for Android App.

AndFix是支付宝开源的一套热修复框架,使用简单,成功率高。

GitHub:https://github.com/alibaba/AndFix

(1)AndFix是在线修复错误的解决方案,而不是重新分发Android应用程序。它作为Android库分发。

(2)AndFix是“Android hot-fix“缩写。

(3)AndFix支持Android版本从2.3到7.0,既有ARM和X86架构,也支持Dalvik和ART运行运行环境,支持32位和64位。

(4)AndFix的补丁的压缩文件格式是.apatch。 它从您自己的服务器分发到客户端,以修复您的应用程序的错误。

修复过程:

这里写图片描述

2、用法介绍

(1)添加依赖

在build.gradle添加依赖:

dependencies {
    compile 'com.alipay.euler:andfix:0.5.0@aar'
}

(2)初始化PatchManager

patchManager = new PatchManager(context);
patchManager.init(appversion);//current version

(3)加载patch

patchManager.loadPatch();

你应该尽早加载patch,一般来说,在应用程序的初始化阶段(如,Application.onCreate())。

(4)添加patch

//path of the patch file that was downloaded
patchManager.addPatch(path);

当一个新的补丁文件被下载,它将通过addPatch方法立即生效。

(5)制作补丁工具

AndFix提供一个制作补丁工具,apkpatch

用法:

apkpatch -f <new> -t <old> -o <output> -k <keystore> -p     <***> -a <alias> -e <***>
 -a,--alias <alias>     keystore entry alias.
 -e,--epassword <***>   keystore entry password.
 -f,--from <loc>        new Apk file path.
 -k,--keystore <loc>    keystore path.
 -n,--name <name>       patch name.
 -o,--out <dir>         output dir.
 -p,--kpassword <***>   keystore password.
 -t,--to <loc>          old Apk file path.

3、实战

介绍结束,代码写起来:

(1)在Application.onCreate()中初始化PatchManager

public class MainApplication extends Application {

    public static PatchManager mPatchManager;

    @Override
    public void onCreate() {
        super.onCreate();

        // 初始化patch管理类
        mPatchManager = new PatchManager(this);

        // 初始化patch版本
        // String appVersion = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
        // mPatchManager.init(appVersion);

        mPatchManager.init("1.0");

        // 加载已经添加到PatchManager中的patch
        mPatchManager.loadPatch();
    }
}

(2)加载补丁

package com.chunsoft.testandfix;

import android.app.DownloadManager;
import android.content.Context;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import java.io.IOException;

public class MainActivity extends AppCompatActivity {

    private static final String APATCH_PATH = "/hotfix.apatch";

    private Button btn_show,btn_hotfix;
    private TextView tv_content;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn_show = (Button) findViewById(R.id.btn_show);
        btn_hotfix = (Button) findViewById(R.id.btn_hotfix);

        tv_content = (TextView) findViewById(R.id.tv_content);

        btn_show.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //下载补丁
                DownloadManager.Request request = new DownloadManager.Request(
                        Uri.parse("https://github.com/chunonesoft/BlogContent/raw/master/hotfix.apatch"));
                request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI);
                //设置通知栏标题
                request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE);
                request.setTitle("下载");
                request.setDescription("补丁正在下载");
                request.setAllowedOverRoaming(false);
                //设置文件存放目录
                request.setDestinationInExternalFilesDir(MainActivity.this, Environment.getExternalStorageDirectory().getAbsolutePath(), "hotfix.apatch");
                DownloadManager downManager = (DownloadManager)getSystemService(Context.DOWNLOAD_SERVICE);
                long id= downManager.enqueue(request);
                showContent();
            }
        });

        btn_hotfix.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String patchFileStr = Environment.getExternalStorageDirectory().getAbsolutePath() + APATCH_PATH;
                Log.e("--------------",patchFileStr);
                try {
                    MainApplication.mPatchManager.addPatch(patchFileStr);
                    Log.e("--------------","ok");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
    }

    //显示TextView内容
    private void showContent() {
        tv_content.setText("before patch");
        Toast.makeText(this,"before patch",Toast.LENGTH_SHORT).show();
    }
}

PatchManager的addPatch方法加载新补丁,项目中可以在下载补丁文件之后调用,这里为了演示就把补丁文件直接放在本地的SD卡中了,代码中patchFileStr就是补丁存放的位置,.apatch就是生成补丁文件的后缀名,fix就是补丁文件的名字。

(3)应用打包
这里写图片描述

我们先将以上应用打包,命名为AndFix_V1
修改MainActivity中的代码,打包成AndFix_V2

android studio打包步骤:build—>Generate Signed APK

(4)通过apkpatch生成.apatch补丁文件

使用官方工具apkpatch生成.apkpatch补丁文件:

这里写图片描述

命令生成补丁:

apkpatch.sh -f 新apk -t 旧apk -o 输出目录 -k app签名文件 -p 签名文件密码 -a 签名文件别名 -e 别名密码

修复后产生补丁:
这里写图片描述

在本程序中,通过链接下载补丁。

最终效果界面:
这里写图片描述

源码下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值