AndFix实战以及遇到的坑

2017/05/16 热修复技术

  最近项目中有用到了热加载技术阿里巴巴的AndFix框架,为此做了一下相关的调研。首先Fork了一份github上AndFix源码,发现github上AndFix 上并没有直接可以跑起来的demo。那么只能用自己动手来一步一步来集成喽。具体的步骤就直接来参考github上AndFix文档的步骤了,还是比较详细的。

1、首先第一步我们来加入依赖

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

2、如何来使用呢?

注:这里为了方便测试,我们就是直接初始化PatchManager、加载与添加Patch都放在了自定义Application onCreate方法当中了,主要是3个步骤见注释。

        //1)初始化PatchManager
        mPatchManager = new PatchManager(this);
        mPatchManager.init(AppInfoUtils.getVersionCode(this));
        //2)load patch
        mPatchManager.loadPatch();
        try {
        // .apatch file path ,这里一定要注意每台手机sd卡路径不同
        String patchFileString = "sdcard" + Environment.getExternalStorageDirectory()
                .getAbsolutePath() + APATCH_PATH;
        //3)添加patch
        mPatchManager.addPatch(patchFileString);
        Log.d(TAG, "apatch:" + patchFileString + " added.");
    } catch (IOException e) {
        Log.e(TAG, "", e);
    }

3、生成patch

1)下载生成工具 AndFix提供了一个生成patch的工具叫apkpatch,可以点击进行下载。 2)准备工作 准备两个apk包,一个是带有bug的包, 一个是bug被修复之后的包。具体的action 就是,我首先打一个apk包命名为“app-debug.apk”,注意要有签名的。然后把它安装到手机,此时手机上的包为带有bug的安装包。然后修改一个Log 内容,再进行打包为apk-release.apk,此时准备工作完成,开始第三步如下。 3)生成patch文件 具体命令如下

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.

输入命令 :

 ./apkpatch.sh -o ~/Desktop/ -k ~/develop/github/FamilyLibraryManager/sign.jks -p 123456 -a family_library_manager_key -e 123456  -t ~/Desktop/app-release-01.apk -f ~/Desktop/app-release-01-modifyed.apk

这时在我的桌面生成了app-release-013cb261226d5a99621b9a464b98ab96ac.apatch 文件和diff.dex两个文件。diff.dex 暂时不用管它。我们直接把app-release-01-3cb261226d5a99621b9a464b98ab96ac.apatch 文件重命名为我们Application中用到的APATCH_PATH常量名称。并把它push 到sd卡中制定的目录中。这里我的push命令是

adb push ~/Desktop/out2.apatch  sdcard/storage/emulated/0/out2.apatchc

4、重新运行app查看结果

此时app运行结果应该就是我们修改后的样子了。

最后说一下我碰到的一些坑 1) sdcard 目录, 这里需要注意 sdcard 目录一定要正确,这样才能保证正确的push patch文件以及load patch 文件。 2)生成工具参数不要弄错了 -t -f 的含义,t是旧文件 f是新文件。不然会报java.lang.IllegalAccessError 错误哦。

下班啦~~ 回家,后续会对AndFix原理进行研究~~~÷

Search

    Table of Contents