最近项目中有用到了热加载技术阿里巴巴的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原理进行研究~~~