Android热修复方案—AndFix

来源:互联网 发布:网络服务商地址 编辑:程序博客网 时间:2024/05/22 05:38

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 downloadedpatchManager.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 别名密码

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

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

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

源码下载

0 0