使用AndFix进行Hot fix

原创 2015年11月20日 00:22:22

AndFix简介

AndFix是一个Android App的在线热补丁框架。使用此框架,我们能够在不重复发版的情况下,在线修改App中的Bug。AndFix就是 “Android Hot-Fix”的缩写。

AndFix Github地址

就目前来说,AndFix支持Android 2.3到6.0版本,并且支持arm 与 X86系统架构的设备。完美支持Dalvik与ART的Runtime。

AndFix 的补丁文件是以 .apatch 结尾的文件。

AndFix原理

AndFix的原理很简单。就是针对项目中原有方法的替换取代工作

这里写图片描述

而我们打一个在线的补丁包,也就有了如下的步骤逻辑:

这里写图片描述

AndFix 实例

Gradle依赖

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

配置Gradle

由于是进行hot fix,所以生成patch的两个release apk是需要签名的,再次我们需要创建一个临时的签名。这里不讲如何生成安卓签名,生成好签名后,配置签名的到gradle文件中,下面是我建立的一个临时签名

    signingConfigs {
        debug {
            storeFile file('./../test_ks.jks')
            storePassword '123456'
            keyAlias '123456'
            keyPassword '123456'
        }
    }

代码部分(version1 apk)

在清单文件中添加sdcard的权限,因为apk需要访问patch文件。

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

配置一个自定义的Application。

public class AppContext extends Application {


    static AppContext instance;

    public static AppContext getInstance() {
        return instance;
    }

    PatchManager patchManager;

    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
        patchManager = new PatchManager(this);
        patchManager.init(BuildConfig.VERSION_NAME);
        patchManager.loadPatch();
    }

    public PatchManager getPatchManager() {
        return patchManager;
    }
}

写一个界面代码
逻辑是这样的,当点击ActionButton的时候,会弹出一个Snackbar,点击Snackbar上的按钮,会弹出一个Toast。同时界面再启动的时候会在加载一个.apatch文件,如果文件存在,则会添加这个补丁文件。

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        String path = "/mnt/sdcard/out.apatch";
        if (new File(path).exists()) {
            Log.e("Test", "have some patch");
            try {
                AppContext.getInstance().getPatchManager().addPatch(path);
            } catch (Exception e) {
                Log.e("Test", "Test", e);
            }
        } else {
            Log.e("Test", "have no patch");
        }

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                showToast("11111");
                            }
                        }).show();
            }
        });
    }

    void showToast(String msg) {
        Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
    }
}

然后运行程序,会直接在手机上运行,然后我们找到项目的路径中找到app-debug.apk文件,复制出来命名为1.apk。

app/build/outputs/apk/app-debug.apk

代码部分(version2 apk)

修改刚刚界面中代码,修改如下,当点击ActionButton,直接弹出Toast。

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        String path = "/mnt/sdcard/out.apatch";
        if (new File(path).exists()) {
            Log.e("Test", "have some patch");
            try {
                AppContext.getInstance().getPatchManager().addPatch(path);
            } catch (Exception e) {
                Log.e("Test", "Test", e);
            }
        } else {
            Log.e("Test", "have no patch");
        }

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                showToast("2222");
            }
        });
    }

    void showToast(String msg) {
        Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
    }
}

同样运行程序后,复制运行过后的apk文件,命名为2.apk

生成.apatch文件

下载Apatch文件生成工具,然后解压缩,同时刚刚复制出来的2个apk文件,复制到同一个目录下面,还有相对应的签名文件。

运行下面的命令,即可生成一个apatch文件。

./apkpatch.sh -f 2.apk -t 1.apk -o ./ -k test_ks.jks -p 123456 -a 123456 -e 123456

工具的命令文档如下:

usage: 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.

我这边生成的apatch文件如下:

 2-df8a710835742d3b84c9d9e47ca7f8d2.apatch

重命名为out.apatch

验证

把手机上的运行的卸载,重新安装上1.apk,运行程序,然后通过命令导入out.apatch,再次运行1.apk,发现1.apk+apatch文件运行的效果和2.apk一样。

adb push out.apatch /mnt/sdcard/

总结

我这边只是简单运行了下AndFix,写了一个demo,考虑到实际项目中需求,可以在程序运行的时候,直接向服务器请求补丁文件,如果有文件需要更新,则下载文件,等到文件下载完成后,即可保证bug的修复。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Alibaba-AndFix Bug热修复框架原理及源码解析

小憩之后,继续为你解读AndFix热修复框架,呵呵。上一篇Alibaba-AndFix Bug热修复框架的使用已经介绍了AndFix的使用,这篇主要介绍AndFix原理以及源码解析。AndFix原理A...

Alibaba-AndFix Bug热修复框架的使用

AndFix这篇主要介绍alibaba的AndFix项目的使用,下一篇介绍 AndFix原理及源码解析。Github:https://github.com/alibaba/AndFixAndFix介绍...

Android热更新之AndFix就是个大坑

最近一两年Android插件化热更新此起彼伏,也许Android的开发者也希望有朝一日,来颠覆频繁的去更新版本,而像web前端一样,更改了代码立马生效的效果。确实,如果已经上线的版本,突然有了bug,...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Android热修复AndFix混淆后热修复失败,无效

这几天一直在研究热修复,对比了多个框架,最终因为是Eclipse开发,所以把重心渐渐转移到AndFix上面。 AndFix地址:https://github.com/alibaba/AndFix ...

Android热修复“AndFix”中文解析(使用说明)

AndFixDownload|0.5.0 build|passing License|Apache2.0 Gitter|join chatAndFix源码下载AndFix的官方解释AndFix是...

AndFix 热补丁修复

本文转自http://blog.csdn.net/lpftobetheone/article/details/50435371 搜索发现有这3种方式可以实现(至于其他的方式,暂不清楚) 1.d...

热更新AndFix之初体验

转载请注明作者AndroidMsky和出处:http://blog.csdn.net/AndroidMsky/article/details/54377806前两天刚刚写了一篇Tinker的集成htt...

亲自实践Andfix 流程记录

今天心血来潮,写一个最近在探究的热更新。网上有很多资料和教程,github也有阿里官方的介绍(官方库),但是每个人遇到的情况不同 ,可能会出现各种问题,这里我就以我的情况记录一下,以备自己和大家参考借...

andfix增量升级更新

项目地址:https://github.com/alibaba/AndFix dexposed和andfix是alibaba的开源项目,都是apk增量更新的实现框架,目前dexposed的兼容性较...
  • fwt336
  • fwt336
  • 2016年04月19日 17:12
  • 1645
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用AndFix进行Hot fix
举报原因:
原因补充:

(最多只允许输入30个字)