深入探索Android热修复技术原理(1)

本文介绍了如何在Android应用中集成AndFix开源热修复框架,包括在ApplicationonCreate中初始化、检查服务器差异包、下载并执行修复、以及定制化修复策略。同时提到了使用懒汉模式实现单例和下载补丁文件的过程。
摘要由CSDN通过智能技术生成

因此我们最终选择了AndFix作为我们的开源方案。具体的AndFix集成方式可参考github中AndFix的介绍

这里简单介绍一下具体的继承流程 (1)在App的Application的onCreate方法中执行AndFix的初始化操作; (2)判断服务器端是否有可更新的热修复差异包 (3)若无则直接退出,若有则下载并执行修复动作 (4)修复完成之后删除下载的补丁差异包 (5)在判断服务器端是否有可更新的补丁包的时候可添加灰度,如版本,渠道,用户等,实现对补丁包定制化的修复

另外需要说明的是:若一个版本中存在着多个bug,则一般的都是让后一个补丁包覆盖前一个补丁包,并删除前一个补丁包,简单来说就是对于每一个版本至多有一个补丁包。

最后贴上App端AndFix的实现源码:

/**

  • Created by aaron on 2016/3/7.
  • 主要用于实现热修复逻辑
  • 采用阿里巴巴开源框架-andfix

*/
public class AndfixManager {
public static final String TAG = AndfixManager.class.getSimpleName();

// AndfixManager单例对象
private static AndfixManager instance = null;
// 补丁文件名称
public static final String PATCH_FILENAME = “/patchname.apatch”;

public static PatchManager patchManager = null;
private AndfixManager() {}

/**

  • 线程安全之懒汉模式实现单例模型
  • @return
    */
    public static synchronized AndfixManager getInstance() {
    return instance == null ? new AndfixManager() : instance;
    }

/**

  • 执行andfix初始化操作
    */
    public static void init(Context mContext) {
    if (mContext == null) {
    L.i(“初始化热修复框架,参数错误!!!”);
    return;
    }
    patchManager = new PatchManager(mContext);
    // 初始化patch版本,这里初始化的是当前的App版本;
    patchManager.init(VersionUtils.getVersionName(mContext));
    // 加载已经添加到PatchManager中的patch
    patchManager.loadPatch();

downLoadAndAndPath(mContext);

}

/**

  • 请求服务器获取补丁文件并加载
    */
    public static void downLoadAndAndPath(final Context mContext) {
    // 请求服务器获取差异包
    ExtInterface.GetShContent.Request.Builder request = ExtInterface.GetShContent.Request.newBuilder();

// 获取本地保存的补丁包版本号
final String patchVersion = AndfixSp.getPatchVersion(mContext);
L.i(TAG, “patchVersion:” + patchVersion);
if (!TextUtils.isEmpty(patchVersion)) {
request.setShVersion(patchVersion);
} else {
request.setShVersion(“0”);
}
NetworkTask task = new NetworkTask(Cmd.CmdCode.GetShContent_SSL_VALUE);
task.setBusiData(request.build().toByteArray());
NetworkUtils.executeNetwork(task, new HttpResponse.NetWorkResponse() {
@Override
public void onSuccessResponse(UUResponseData responseData) {
if (responseData.getRet() == 0) {
try {
ExtInterface.GetShContent.Response response = ExtInterface.GetShContent.Response.parseFrom(responseData.getBusiData());
// 若返回成功,则更新脚本下载补丁包
if (response.getRet() == 0) {
ByteString zipDatas = response.getContent();
// 数据解压缩
byte[] oriDatas = GZipUtils.decompress(zipDatas.toByteArray());
String patchFileName = mContext.getCacheDir() + PATCH_FILENAME;
L.i(TAG, “patchFileName:” + response.getShVersion());
// 将byte数组数据写入文件
boolean boolResult = getFileFromBytes(patchFileName, oriDatas);
// 写入文件成功则加载
if (boolResult) {
patchManager.removeAllPatch();
patchManager.addPatch(patchFileName);

// 保存补丁版本号
AndfixSp.putPatchVersion(mContext, response.getShVersion());
// 删除补丁文件
File files = new File(patchFileName);
if (files.exists()) {
files.delete();
}
}

} else {
// -1 请求失败
// 1 请求成功,但是没有更新版本的脚本
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

@Override
public void onError(VolleyError errorResponse) {
}

@Override
public void networkFinish() {
}
});

}

/**

  • 根据数组获取文件
  • @param path
  • @param oriDatas
    */
    public static boolean getFileFromBytes(String path, byte[] oriDatas) {
    boolean result = false;
    if (TextUtils.isEmpty(path)) {
    return result;
    }
    if (oriDatas == null || oriDatas.length == 0) {
    return result;
    }

try {
FileOutputStream fos = new FileOutputStream(path);
fos.write(oriDatas);
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

小结

有了这么多优秀的开发工具,可以做出更高质量的Android应用。

当然了,“打铁还需自身硬”,想要写出优秀的代码,最重要的一点还是自身的技术水平,不然用再好的工具也不能发挥出它的全部实力。

在这里我也分享一份大佬自己收录整理的Android学习PDF+架构视频+面试文档+源码笔记,还有高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料这些都是我闲暇还会反复翻阅的精品资料。在脑图中,每个知识点专题都配有相对应的实战项目,可以有效的帮助大家掌握知识点。

总之也是在这里帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

总之也是在这里帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 16
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值