刚开始要作 SDK 热修复,我是拒绝的 ~html
某日,解决完一个线上 bug 后,我冒出了一个念头:让咱们的 SDK 也具备热修复的能力呗!android
可是查了查,网上资料少、不少热修复方案只针对app……算法
但是我都拍胸脯向老大夸口了,焉有退缩的道理?!api
加上万一之后手抖,出了个什么大 bug 或者兼容问题,个人职业生涯不就要终结了!?安全
我滴乖乖,保命要紧!仍是赶忙作个保底方案吧。架构
咱们想实现的效果很简单,以下场景三:app
先说明下,方案没有最好,只有最合适。虽然我最终选定了方案四,但若是各位小伙伴的团队有资源、有其余方案的经验、SDK的热更需求更丰富,能够自行选择其余方案。框架
从服务端下载 jar -> 经过反射,加载jar -> 建立相关对象而且操做之。性能
方案参考:
Android SDK热修复机制简析以实现学习
优势:
缺点:
针对 jar 包体积大的状况,咱们能够考虑对 sdk 项目进行拆包(拆module),分红小的 jar 包和主包
主包负责反射加载,若是须要热修,下发子 jar 便可,比较轻量。
优势:
缺点:
将SDK分包,宿主包仅提供 API 和加载核心实现的插件包,插件包就能够热更了。
优势:
缺点:
走投无路之下,我想起,诶!不少 app 热更方案不是说支持 lib 热更吗!那先做为一个保底方案吧。
经过业务方 app 热更 lib 包。
优势:
缺点:
Sophix 功能完善、开发简单透明,惋惜没开源,没法改造。
底层替换方案不可避免地存在兼容问题,弃之。
优势:
缺点:
还有两个问题,留给你们去思考:
扩展:
InstantRun 如何动态替换 Application,总结起来就两步:
- 打包时替换 Application 标签,插入BootstrapApplication
- 运行时 hook 系统api,将 BootstrapApplication 换回 MyApplication
Robust 的原理能够简单描述为:
优势:
缺点:
思考:
就在我美滋滋地接入 Robust 时,问题来了!
Robust 须要是 Application 才能插桩和打补丁,要用在 SDK 上,仍是须要一轮改造的。
如何改造?我将在下篇博文中详解,同时将推出封装好的库,让 SDK 开发者只需 5 分钟便可让本身的 SDK 拥有热修复的能力,敬请期待。
固然,咱们的焦点并不局限在技术实现上,还有不少值得咱们去考虑的:
咱们怎么对分发进行控制?对监控数据进行统计?若是补丁引发了崩溃,咱们怎么第一时间补救?
结合外部维度系统,根据用户维度,好比渠道、系统版本等等作有差异的下发。
上线后咱们最关心的就是补丁的兼容性和成功率。
咱们须要支持自动监控崩溃,若是是下发的补丁引发的,则下次启动补丁自动失效,避免扩大影响范围。
以上这些思考,我将会在下篇博文中一一实现,敬请关注!
本篇完成耗时 6 个番茄钟(180 分钟)
我是 FeelsChaotic,一个写得了代码 p 得了图,剪得了视频画得了画的程序媛,致力于追求代码优雅、架构设计和 T 型成长。
欢迎关注 FeelsChaotic 的简书和掘金,若是个人文章对你哪怕有一点点帮助,欢迎 ❤️!你的鼓励是我写做的最大动力!
最最重要的,请给出你的建议或意见,有错误请多多指正!