本文共 5824 字,大约阅读时间需要 19 分钟。
作者介绍:古塘,目前主要负责支付宝框架和各个组件通过移动开发平台 mPaaS 对外输出工作,今天给大家分享的主题是敏捷开发与动态更新在支付宝 App 内的深度实践。
活动推荐:CodeDay#1 线下沙龙杭州站已上线,具体活动信息及报名地址见文章尾部。
首先来快速看一下支付宝的架构演进,支付宝在移动端躬耕多年,从简单的工具型App到平台型、到现在的超级App。与目前市面上大部分App的发展路线类似,目前我们构建平台的同时,做了更多服务化、模块化的工作。
针对支付宝在超级 App 方面方向下的架构优势,我们总结了如下特点:
从工程化的角度来看,业务和团队的快速发展也会带来巨大的挑战。支付宝的业务量在 15、16 年后有一个指数级的增长,包括团队人数、模块数量,大家看现在的支付宝也不仅仅是一个简单的支付工具了,而是包含了各种各样的业务,服务我们的生活的方方面面。
所以我们需要一个灵活开放的架构来支撑多团队的快速协同开发,需要建立超级 App 的运维体系。
下面我们快速看一下业务复杂性会带来怎样的技术挑战,总体来说,分为 4 个方面。
1、基础能力要求更高:
2&3、性能和环境方面:
4、多 App 生态:
接下来我们来具体看一下支付App的架构现状:
从下到上,分别是「容器层、组件层、框架层、服务层和应用层」
所以说支付宝的框架有着明显的分层结构,除了支付宝本身,蚂蚁系内部的 App 也都是依托于此,比如网商银行、蚂蚁财富、口碑等,大家的 App 是底下这 4 层可以做到几乎一样,唯一区别就是在应用层搭建不同的业务,而且因为是同样的架构底层,同一个业务很方便的做多端迁移,比如大家比较喜爱的余额宝业务在支付宝里有,在蚂蚁财富App 里也能看到,这套框架也依托于 mPaaS 平台对外输出,也欢迎大家体验。
正如刚才所说的,在支付宝内部会有多种框架支撑不同业务的并发开发和快速发布,大致可分为“Native 开发框架”、“Kylin H5 开发框架”以及“小程序开发框架”,具体的内容我们会在后续展开。
我们认为在支付宝内部开发业务,就像搭积木一样轻松,具有很多特点:灵活性、扩展性等等。
总体来说,大家都是并行开发,互相不影响,谁的版本有问题,可以随时回滚到稳定版本:因此积木和积木之间可以做到很好的解耦,之间的交互就是通过前面讲到的定制的框架层来通信,同样你也很方便地增加一块新积木,自由扩展业务。
OSGI 是 Java 做动态化模块化的一系列思想规范,支付宝的框架设计也是借鉴了这个思想。
总体来说,在支付宝内部的每个模块工程我们都称之为 bundle,在 Android 上的产物其实已经是一个完整的 APK 安装包了,只不过不能独立运行,需要依赖底层框架和其他模块,在 iOS 上的产物也是一个具体的二进制 Framework 包,这样打最终安装包的过程其实就是前面提到的把各个积木搭起来的过程,只是二进制级别的合并,比较耗时的编译的过程已经分散到各种积木的产生过程中了,这样做也能大大加快整个安装包的打包速度。
以支付宝为例,打完整的安装包包含几百个 bundle 的,在我这台 14 年版的 Mac 上耗时也在 1 分钟之内。
接下来我们来看看积木和积木之间,业务上是怎样做交互的。我们通过封装 MicroApplication 和 service 来实现。
和市面上流行的 phoneGap (cordova)类似,都是 H5 混合开发解决方案,特点如图所示:
除了提供基本的 H5 页面的加载管理、和 Native 做通信的 JSAPI 机制,还具备一些他们可能不具备的特点:
首先,我们来看H5加载,传统意义上的H5,在进入的时候上面会有进度条或者转菊花,体验会不太好,我们的容器是怎么解决这个问题的呢?
离线包是将 HTML、JavaScript、CSS 等页面内的静态资源打包到一个压缩包内,Nebula 使用一套基于 AppId 维度的本地文件管理方式,对离线包进行管理。这和前面提到的框架「积木的概念」如出一辙,每一个离线包都是一个小积木,这个小积木可以很方便的做到热插拔,实现动态更新。
接下来让我们来看看小程序,看看标题还是很唬人的,面向未来的研发方式。
大家有没有想过这样一个问题,为什么 H5 技术已经发展的相对来说比较成熟了,我们还要推出小程序技术?
因为小程序可以完美解决现在 H5 存在的一些问题:安全、性能、开发效率等各个方面。
大家可以看现在支付宝里的蚂蚁森林,抢能量种树那个,大家应该都玩过吧,当前的版本就是小程序实现,可以体验一下页面的加载速度和滑动的效率等等,这已经是一个比较复杂的带动画的业务了,都可以做到很好的用户体验。
同时小程序还有自己的 IDE,帮助开发者能够实现「编码实时预览、自动补全、语法提示」等,从而大大提升了开发效率:
研发流程
因此,基于前面介绍的各种开发框架,这里可以分享一下支付宝的研发流程,分为「开发、测试、集成发布」这些过程:
从大版本集中发布到每个小产品迭代开发,每个小产品线维护自己的小版本,可以控制自己的研发和发布流程。
内部也会有 CI/CD 打包平台的支撑,支撑着内部完成「多模块并行开发、业务功能动态部署、线上问题热修复」。
对于发布平台,我们是怎么做的呢?
这里还可以说一下的是,我们对于离线包这种发布产物是支持差分机制。举个例子,我们有一个业务原先是 200K,改个背景逻辑变 210K 了,没必要因为这 210K 去完整下发覆盖,通过差分得到补丁。当然,这里的补丁大小不是 210K-200K 这样简单,但至少我们可以通过补丁机制从而达到最大程度地减少数据冗余,提高整体覆盖率。
总结来说,技术升级驱动研发方式产生转变,从 Native 为主的研发方式向动态化的研发方式进行转变:
技术选型:原先我们以 Native 为主,少量独立页面使用 H5;现在我们更推荐核心组件使用 Native(用户高频使用的场景),二级业务尽量使用 H5 或者小程序; 发布方式:目前基于“小步迭代”的选择,不依赖客户端发布点,从而达到随时发布的能力; 研发效率:目前使用 Web 技术能够达到更开放的效果,一套 Web 代码即可实现跨平台的能力; 安装包大小:相较于 Native,H5 能够有效地控制安装包的大小。那么总结一下,支付宝是怎么敏捷发布,并保障稳定性的呢?
因此我们通过发布、监控、诊断协同作战,支持体系化运维,形成了所谓的超级 App 运维体系。
接下来我们针对「诊断」展开,前面我们提到的「监控」更多的是发现问题,而如何定位问题发生的原因,是需要通过诊断来进行核验的。
参考这张图,我们能够清晰地了解支付宝内部是如何进行问题诊断与定位:从“端到端的信息打通”到“全链路辅助到人”,“详细信息拉取”后在进行相应的“诊断分析”,同时会配备具体的诊断策略。
因此,我们可以实现一键诊断用户 App 日志,具体界面如下:
发现问题后,怎么去修复问题,就要用到一些热修复的手段了,比如这里提到的 AndFix。
在 Android 上,AndFix 完全是支付宝同学自研的一套 Android 热修复技术,15 年的时候已经在 GitHub 上开源。现在 star 数大概有 6000 多个,相信应该有同学也接触了解过,不过开源的版本略老,但是原理不变。
AndFix 可以认为是开创了 Android 热修复 2 个流派之一的 Native 修复,原理是通过在 Native 端方法指针替换实现,修复的粒度是针对于方法,这样从原理上来说至少有 2 大好处:
另一种比较流行的技术是通过类加载的机制,因为粒度是类级别,所以补丁包会相对来说大一点,且可能存在 dex 合并的性能损耗,而且因为 Android 虚拟机没有类卸载机制,所以无法做到实时生效,一定要重启。
当然,没有一种技术是万能的,我们内部也会存在着 dexPatch、instantRun 这种原理的修复技术,应对不同的场景。
在 iOS 上,从最早的 lua 脚本到大名鼎鼎的 JSPatch,我们内部都会有类似的方案,这个在 iOS 上其实最重要的我觉得不是技术问题,而是苹果爸爸的政策问题,这里就不多说了,你懂的。
最后总结一下,一定要有多层次的修复技术,适应不同的业务场景。如图所示:
最后,到了 One More Thing 的时候。前面我们分享所涉及的所有技术手段目前已通过 mPaaS 平台对外输出:
「移动分析、消息推送、热修复」三款组件近期在支付宝开放平台上已独立放出。如果你是移动开发者,且对 mPaaS 感兴趣,赶紧上手试用吧:http://t.cn/ExXJGkP
转载地址:http://qhelo.baihongyu.com/