AndFix
阿里巴巴开源项目,地址:https://github.com/alibaba/AndFix
tools里面有我们需要的工具,docs是一些文档介绍。AndFix解决在线修复bug,而不是重新发布新版本apk,AndFix支持Android版本从2.3到6.0。我们从下图来了解一下实现原理
修复过程示意图
我们该如何使用这个库呢?首先要添加依赖
//.........Maven 方式...........
<dependency>
<groupId>com.alipay.euler</groupId>
<artifactId>andfix</artifactId>
<version>0.4.0</version>
<type>aar</type>
</dependency>
//..............Gradle方式..................
dependencies {
compile ‘com.alipay.euler:andfix:[email protected]‘
}
接着我们得在Application里面初始化PatchManager,并提供两个方法:打补丁、移除所有补丁(发布版本更新需要移除无用的补丁),具体代码如下:
/**
* Created by idea on 2016/4/21.
*/
public class MyApplication extends Application {
protected PatchManager patchManager;
@Override
public void onCreate() {
super.onCreate();
patchManager = new PatchManager(this);
patchManager.init(getAppVersion());
patchManager.loadPatch();
}
/**
* 获取系统当前版本号,默认1.0
*
* @return
*/
private String getAppVersion() {
try {
PackageManager manager = getPackageManager();
PackageInfo info = manager.getPackageInfo(getPackageName(), 0);
String version = info.versionName;
return version;
} catch (Exception e) {
e.printStackTrace();
return "1.0";
}
}
/**
* 热修复打补丁,根据版本信息与服务器匹配下载补丁文件到手机,并记录路径和版本号,配合加载补丁
* @param path
*/
public void addPatch(String path) {
try {
patchManager.addPatch(path);//path of the patch file that was downloaded
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 安装新版本APK需要调用该方法
*/
public void removeAllPatch() {
//删除所有已加载的patch文件
patchManager.removeAllPatch();
}
}
具体怎么运用到实际开发中呢,进过一番思考写下了这么一个概要,稍后准备工作完成后我们来写一个demo实践
/**
* Created by idea on 2016/4/21.
*/
public class HotFix {
private boolean isRemovePatch = true;
private String patchVersion;
private String apkVersion;
private String updateAPKUrl;
private String updatePatchUrl;
private boolean isUpdateAPK;
private boolean isUpdatePatch;
public void onUpdateAPKWithHotFix(String apkVersion, String patchVersion, OnUpdateAPKListener onUpdateAPKListener){
}
interface OnUpdateAPKListener{
void onResponse(HotFix hotFix);
}
}
以上代码稍后实践,tools文件下 apkpatch-1.0.3 工具的使用可以在命令行切换到解压目录下,输入apkpatch查看,如下图
简单对这些命令说明一下
apkpatch -f <new> -t <old> -o <output> -k <keystore> -p <***> -a <alias> -e <***>
-f <new> :新版本apk
-t <old> : 旧版本apk
-o <output> : 输出目录
-k <keystore>: 打包所用的keystore
-p <***>: keystore的密码
-a <alias>: keystore 用户别名
-e <***>: keystore 用户别名密码
简单的测试一下工具的使用:TextView赋值的bug修复(不为null),第一个版本 (签名打包一个old.apk)
public class MainActivity extends BaseActivity {
private String content = "null";
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
@Bind(R.id.hotFix_TextView)
TextView hotFixTextView;
@Override
public int getLayoutResId() {
return R.layout.activity_main;
}
@Override
protected void initialView() {
super.initialView();
hotFixTextView.setText(getContent());
}
}
这里留的bug content==null 赋值现实问题,修复bug代码修改如下:(重新打包生成new.apk)
private String content = "null";
public String getContent() {
if(content == null || content.equals("null")){
return "未知";
}else{
return content;
}
}
使用工具生成.apatch文件
在进行demo编写之前,我们先对其业务逻辑进行分析,得出下图
接口设计请求参数:
接口响应值Data:
正式的开发中应该是按照上面这个流程来的,但是为了方便我们demo就直接把.apatch文件放入sdcard,直接模拟请求实现热修复,下面是相关源码下载地址:http://download.csdn.net/detail/analyzesystem/9499245;把.apatch文件放入指定位置即可。(开发集成一定不要忘记添加读写权限),下图是实现效果图:
朋友告诉我这个库热修复会有很多问题,在很多手机上有bug,不过这不是我现在关心的问题,实践成功了待以后开发应用中遇到再说。如果你们谁有遇到bug坑,还请留言,以便于累计少踩坑。
Dexposed
貌似又是阿里巴巴的,项目地址:https://github.com/alibaba/dexposed
项目集成依赖可选直接添加到您的项目dexposed AAR编译的库,它包含一个jar文件”dexposedbridge .jar,两libdexposed.so libdexposed_l.so文件,gradle依赖如下:
dependencies {
compile ‘com.taobao.android:dexposed:0.1.1@aar‘
}
将下面一行插入到你的应用程序的初始化
public class MyApplication extends Application {
@Override public void onCreate() {
// 检查当前设备是否支持该库
if (DexposedBridge.canDexposed(this)) {
// 使用Dexposed启动AOP
}
}
...
}
dexposed Dalvik运行ARM架构支持所有设备从Android 2.3到4.4(不包括3),然而在我查询了一些资料后,特别是看了http://pcedu.pconline.com.cn/484/4841077.html这篇文章后,放弃了对该库的深入了解,需要root权限在某些定制机上还需要定制版,开发还需要走各种分支,简直就是不能忍受!!这个时代不属于它了。HotFix、Nuwa、DroidFix、DynamicAPK、AndHotFix、AndFixx也粗略过了一遍,集成来说还是AndFix方便点
参考资料
http://blog.csdn.net/qxs965266509/article/details/49802429