摘要: 支付宝做为国民级应用,当前全球用户已经超过 10 亿,提供了超过 200 项以上的服务,而崩溃率始终维持在万分之五如下,并且天天支付宝都上线新的功能和改进。作到今天这样的成绩,并不容易,是通过长时间的实践经验积累下来的。
本文基于重岳在 2018 年 Arch Summit 北京站的分享内容进行总结,但愿经过本篇文章介绍近些年来支付宝在移动端架构的上演进和思考,期冀能给读者们带来些许帮助。小程序
支付宝做为国民级应用,当前全球用户已经超过 10 亿,提供了超过 200 项以上的服务,而崩溃率始终维持在万分之五如下,并且天天支付宝都上线新的功能和改进。作到今天这样的成绩,并不容易,是通过长时间的实践经验积累下来的。
支付宝的架构演进主要经历了三个阶段,若是用比喻的话,能够分为独木舟、战列舰和航空母舰三个阶段。后端
支付宝刚推出移动端时,它的结构很是之简单,除了一些工具组件被划分为模块,业务代码都是糅合在一块儿。刚开始并无太大问题,可是当咱们的研发人员迅速增加时,问题开始变得棘手起来,仅仅举几个例子即可见一斑。浏览器
这些严重的问题让咱们的产品研发迭代变得没法持续下去,所以咱们决定来一次完全的重构,因而步入了战列舰时代。安全
当设计新一代的客户端架构时,咱们从三个方向进行思考:团队协做、研发效率、性能与稳定。性能优化
团队协做方面,咱们但愿整个架构分层合理,基础层面,将通用能力下沉,为更多的上层业务服务,避免重复创造轮子;业务层面,各个业务团队可以独立开发管理,不会对不相关的业务形成影响。基于这个初衷,咱们造成了下图这样的架构:网络
整个客户端架构总共分红四层:业务层、服务层、组件层、框架层。架构
咱们将服务层、组件层和框架层合称为 mPaaS,即移动端上的 PaaS 服务。这些 PaaS 服务能够复用,咱们不只在支付宝里使用它们,也在其余集团应用,如蚂蚁财富、网商银行等中使用。并发
要实现业务分治,最好的方式就在代码上可以进行隔离,你们没必要在同一个 Codebase 中开发,避免代码合并冲突的现象,这个一般在 Android 上一般能够 aar 的方式来实现,可是惋惜的是咱们重构的时候 aar 还没出来,并且即便有 aar,也存在打包时间随代码体积增大线性增加的问题。框架
咱们的解决方案借鉴 OSGi 的概念,将整个客户端以 Bundle 为单位划分,每一个 Bundle 能够包含本身的代码、页面和资源。读者可能会想,这究竟和 aar 有什么分别呢?其实区别很大!前后端分离
首先,Bundle 里的代码部分是已编译的 dex,当编译 apk 时,咱们只须要合并 dex 便可,不须要像 aar 那样将 class 编译成 dex 再进行合并,这样大大节省了打包时间;其次,Bundle 是能够独立运行于本身的 ClassLoader 中的,而且咱们能够经过壳代理的方式加载 Activity 等基础组件,使得动态下发业务成为可能;最后,Bundle 里还包含微应用、服务和 Pipeline 相关的配置信息,框架会根据这些信息启动相应的组件。
mPaaS 的服务,即 Service 相似于 Spring 框架中的 Service,它对外提供接口服务,而使用者不须要知道如何初始化服务的实例以及生命周期管理,这些彻底由框架来托管。使用者只须要知道目标服务接口类的方法参数便可,调用时经过框架提供的 API 来获取实例。
对于服务的发布者来讲,他在本身的 bundle 中声明接口类以及实现接口类派生的实例类,并注册相关信息到 bundle 的 manifest 文件中。这种作法的本质思想是 Inversion of Control,减小类之间的复杂依赖,避免繁琐的初始化工做。以依赖接口的方式进行开发,可以解除服务使用者对服务提供者的依赖,在服务提供者还没有彻底开发完成时,使用者能够彻底以 mock 的方式来模拟服务,而不须要修改本身的业务代码,固然,前提是双方协商好服务接口的协议。
支付宝中的页面很是多,直接启动 Activity 或者 ViewController 对咱们来讲远远不够,咱们选择在它们上面增长 MicroApp,即微应用的概念。微应用具有惟一的应用 ID,在框架中标识本身的存在。微应用具备统一的入口,根据使用方传入的字典参数来管理 Activity 或 ViewController。这样可以带来不少好处:
综上所述,微应用化和服务接口所赋予的特性极大提升团队间协做效率,各研发小组之间的依赖更加简单,能够各行其道,更关注于自身服务的打造建设。
咱们一方面在架构上做出重大改变来提升研发效率,另外一方面也在不断的进行性能优化,改善用户体验。咱们主要从三个层面来着手:
框架层面
基础指标
对于经常使用指标,如闪退、ANR、内存、存储、电量、流量等,进行长期追踪。咱们可以明确获悉每一个版本之间这些指标上的差别,并进行采样分析,定位并解决问题。
向下突破
咱们不只仅在应用层面进行优化,同时也向下探索性能提高的可能性。在这方面,咱们也收获颇丰,好比在 Android 上某些系统版本,经过在启动阶段禁用 GC 的方式得到 20%~30% 的启动时间缩减;在 iOS 上,利用系统自己的 Background Fetch 机制提升进程活跃时间,实现应用秒起。
随着移动支付的不断普及,面对海量的用户和业务需求,高可用、弹性动态成为支付宝客户端更为艰巨的挑战。支付宝做为集支付、金融、生活为一体的服务平台,须要可以快速稳定的发布服务和引入第三方服务,同时对于用户的反馈和诉求必须可以积极迅速的响应。
咱们在研发模式上做出改变以业务快速迭代的要求,业务逐步由原生页面向 Web 混合页面迁移。原有的研发模式可以很好的知足团队协做的要求,可是随着业务规模的不断增大,代码量相应膨胀致使安装包太大,在iOS上一度超过代码段上限,没法经过 AppStore 审核,另外基于集中时间点的迭代发布,一般是一个月发布一个版本,远不能知足业务的更新速度要求。相较于原生应用开发,Web应用的优点很是明显:
尽管 Web 应用优点明显,但在移动端上的短板也是显而易见的,它提供的用户体验、性能以及能力上的限制与原生应用有至关大的差距。为了弥补这些差距,咱们作了大量的改进,主要在如下几个方面:
咱们不只自身提供各类各样的服务,也须要引入第三方服务来服务更多的人群,以往咱们只能引入简单的第三方 H5 页面,它们只能使用支付宝提供的少许功能,并且开发人员能力的差别致使用户体验不是很理想。小程序将支付宝的能力全面开放出来,从开发到测试皆有完整的 IDE 等工具链支持,同时 DSL 简单易用,对于第三方来讲,可以快速开发上线一款体验和功能比以往更强大的小程序。
本文为云栖社区原创内容,未经容许不得转载。