刚开始要做 SDK 热修复,我是拒绝的 ~
某日,解决完一个线上 bug 后,我冒出了一个念头:让我们的 SDK 也具有热修复的能力呗!
但是查了查,网上资料少、很多热修复方案只针对app……
可是我都拍胸脯向老大夸口了,焉有退缩的道理?!
加上万一以后手抖,出了个什么大 bug 或者兼容问题,我的职业生涯不就要终结了!?
我滴乖乖,保命要紧!还是赶紧做个保底方案吧。
我们想实现的效果很简单,如下场景三:
先说明下,**方案没有最好,只有最合适**。虽然我最终选定了方案四,但如果各位小伙伴的团队有资源、有其他方案的经验、SDK的热更需求更丰富,可以自行选择其他方案。
从服务端下载 jar -> 通过反射,加载jar -> 创建相关对象并且操作之。
方案参考:
Android SDK热修复机制简析以实现
优点:
缺点:
针对 jar 包体积大的情况,我们可以考虑对 sdk 项目进行拆包(拆module),分成小的 jar 包和主包
主包负责反射加载,如果需要热修,下发子 jar 即可,比较轻量。
优点:
缺点:
将SDK分包,宿主包仅提供 API 和加载核心实现的插件包,插件包就可以热更了。
优点:
缺点:
走投无路之下,我想起,诶!很多 app 热更方案不是说支持 lib 热更吗!那先作为一个保底方案吧。
通过业务方 app 热更 lib 包。
优点:
缺点:
1. 热更项目的需求
* 只需要简单的方法级别 Bug 修复?
* 需要资源及 so 库的修复?
* 需要 Native 的修复?
* 对平台兼容性要求及成功率要求?
* 是否需要对补丁包进行管理?
* 公司资源是否支持商业付费?
2. 学习及使用成本
* 集成难度和复杂度
* 代码侵入性
* 调试维护
3. 选择框架的关注点
* 尽量大厂
* 性能过关
* 有专人维护
* 热度高,开源社区活跃
Sophix 功能完善、开发简单透明,可惜没开源,无法改造。
底层替换方案不可避免地存在兼容问题,弃之。
优点:
缺点:
还有两个问题,留给大家去思考:
* 方案参考:
基于Tinker的SDK全局热更新方案(全网唯一)
* 扩展:
InstantRun 如何动态替换 Application,总结起来就两步:
打包时替换 Application 标签,插入BootstrapApplication
运行时 hook 系统api,将 BootstrapApplication 换回 MyApplication
Robust 的原理可以简单描述为:
优点:
缺点:
思考:
就在我美滋滋地接入 Robust 时,问题来了!
Robust 需要是 Application 才能插桩和打补丁,要用在 SDK 上,还是需要一轮改造的。
如何改造?我将在下篇博文中详解,同时将推出封装好的库,让 SDK 开发者只需 5 分钟即可让自己的 SDK 拥有热修复的能力,敬请期待。
当然,我们的焦点并不局限在技术实现上,还有很多值得我们去考虑的:
我们怎么对分发进行控制?对监控数据进行统计?如果补丁引起了崩溃,我们怎么第一时间补救?
结合外部维度系统,根据用户维度,比如渠道、系统版本等等做有差别的下发。
上线后我们最关心的就是补丁的兼容性和成功率。
我们需要支持自动监控崩溃,如果是下发的补丁引起的,则下次启动补丁自动失效,避免扩大影响范围。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。