APP 热修复都懂了,你会 SDK 热修复吗?最全方案在这里!

本文探讨了在Android应用中实现热修复的不同技术方案,如JAR替换、子JAR替换、插件化和业务方热更等,分析了各自的优缺点,并结合实际需求给出了选择建议,重点关注代码热更、兼容性和性能等因素。
摘要由CSDN通过智能技术生成

一、背景和目的


我们想实现的效果很简单,如下场景三:

二、技术方案


先说明下,方案没有最好,只有最合适。虽然我最终选定了方案四,但如果各位小伙伴的团队有资源、有其他方案的经验、SDK的热更需求更丰富,可以自行选择其他方案。

方案一:JAR 替换

步骤

从服务端下载 jar -> 通过反射,加载jar -> 创建相关对象并且操作之。

方案参考:

Android SDK热修复机制简析以实现

优缺点

优点:

  1. 无兼容问题

缺点:

  1. 反射消耗性能;

  2. jar 包如果体积大,整个下载就很不友好;

  3. 确定改动的代码范围繁琐,维护麻烦。

方案一改进:子 JAR 替换

步骤

针对 jar 包体积大的情况,我们可以考虑对 sdk 项目进行拆包(拆module),分成小的 jar 包和主包

主包负责反射加载,如果需要热修,下发子 jar 即可,比较轻量。

优缺点

优点:

  1. 只下发子包,轻量

缺点:

  1. 比较适合主包变动小的情况;

  2. 主包和子包耦合性强;

  3. 还是需要用到反射。

方案二:插件化

步骤

将SDK分包,宿主包仅提供 API 和加载核心实现的插件包,插件包就可以热更了。

优缺点

优点:

  1. 灵活

缺点:

  1. 对主项目工程的依赖太大,往往一些基本配置需要依赖于主工程的项目源码;

  2. 使用接入成本高,配置麻烦,而 SDK 的业务接入方需要的是快速接入;

  3. 插件化框架可能会对系统原生代码的运行造成不可预估的影响;

  4. 不得不依赖很多不需要的插件化框架功能。

方案三:业务方热更

走投无路之下,我想起,诶!很多 app 热更方案不是说支持 lib 热更吗!那先作为一个保底方案吧。

步骤

通过业务方 app 热更 lib 包。

优缺点

优点:

  1. 热更权把控在业务方手中,对业务方透明

缺点:

  1. lib 包太大时,下载还是很耗流量的

  2. diff 算法无法计算新旧 lib 的差异,只能整个替换掉

  3. 步骤相当繁琐,如下图:

业务方会杀了你的!

方案四:改造现有 APP 热修复方案

1. 那在选择热修复方案时考虑点有哪些?

1. 热更项目的需求

  • 只需要简单的方法级别 Bug 修复?

  • 需要资源及 so 库的修复?

  • 需要 Native 的修复?

  • 对平台兼容性要求及成功率要求?

  • 是否需要对补丁包进行管理?

  • 公司资源是否支持商业付费?

2. 学习及使用成本

  • 集成难度和复杂度

  • 代码侵入性

  • 调试维护

3. 选择框架的关注点

  • 尽量大厂

  • 性能过关

  • 有专人维护

  • 热度高,开源社区活跃

2. 总结出需要热更的 SDK 特点
  1. 主要是代码热更,无so库、资源更新需求;

  2. 实时性要求高,因为一旦出问题,对业务方的影响极大;

  3. 兼容性要求高,你无法预料到业务方的活跃用户都有啥机型。

3. 那我们赶紧来看下,现有的 APP 热修复方案都有哪些?
3.1 综合优化的产物 —— Sophix(弃)

Sophix 功能完善、开发简单透明,可惜没开源,无法改造。

3.2 底层替换方案(弃)

底层替换方案不可避免地存在兼容问题,弃之。

3.3 类加载方案 —— Tinker

优点:

  1. 用户多

  2. 更新时间新,相比之下,其他有在Github上开源的框架,star数都是7000以下,上次更新时间都在1年前,甚至2年前。

缺点:

  1. dex合成占用ROM较大

  2. 不够实时

  3. 需要改造Application,业务方有感知。(也可以参考 InstantRun 做到不修改 Application 达到替换 Application 的效果,但该方案大量 hook 系统 api,不够稳定,大概有 1/1w 的概率会出现替换失败,所以Tinker最终还是没有使用InstantRun的方式)

还有两个问题,留给大家去思考:

  1. 会不会影响业务方加固?

  2. 和业务方是否冲突?

  • 方案参考:
基于Tinker的SDK全局热更新方案(全网唯一)
  • 扩展:
InstantRun 如何动态替换 Application,总结起来就两步:
  1. 打包时替换 Application 标签,插入BootstrapApplication
  1. 运行时 hook 系统api,将 BootstrapApplication 换回 MyApplication
如何成为Android高级架构师!

架构师必须具备抽象思维和分析的能力,这是你进行系统分析和系统分解的基本素质。只有具备这样的能力,架构师才能看清系统的整体,掌控全局,这也是架构师大局观的形成基础。 你如何具备这种能力呢?一是来自于经验,二是来自于学习。

架构师不仅要具备在问题领域上的经验,也需要具备在软件工程领域内的经验。也就是说,架构师必须能够准确得理解需求,然后用软件工程的思想,把需求转化和分解成可用计算机语言实现的程度。经验的积累是需要一个时间过程的,这个过程谁也帮不了你,是需要你去经历的。

但是,如果你有意识地去培养,不断吸取前人的经验的话,还是可以缩短这个周期的。这也是我整理架构师进阶此系列的始动力之一。


成为Android架构师必备知识技能

对应导图的学习笔记(由阿里P8大牛手写,我负责整理成PDF笔记)

部分内容展示

《设计思想解读开源框架》

  • 目录

  • 热修复设计

  • 插件化框架设计

    《360°全方面性能优化》

  • 设计思想与代码质量优化

  • 程序性能优化

    《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

    [外链图片转存中…(img-KEWpE5wB-1714792973145)]

  • 热修复设计
    [外链图片转存中…(img-Fyipt7Zr-1714792973149)]

  • 插件化框架设计
    [外链图片转存中…(img-Y92XRp66-1714792973151)]
    《360°全方面性能优化》
    [外链图片转存中…(img-0XWBungB-1714792973153)]

  • 设计思想与代码质量优化
    [外链图片转存中…(img-RYXAxX1l-1714792973154)]

  • 程序性能优化
    [外链图片转存中…(img-XDCuZdzB-1714792973155)]
    《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值