蚂蚁财富Flutter工程化实践
Flutter 是 Google 开发的一套全新的跨平台、开源 UI 框架,目前已支持 iOS、Android 和 Web 应用的开发,对于 Desktop 的支持也在进行中。Flutter 以其便捷快速的开发体验,灵活优雅的布局方式和媲美原生的性能为移动开发带来了新的活力。
大多数业务复杂的团队,在 Flutter 业务生态内的落地以及多团队间的协作方面,目前还没有很好的实践。对于 Flutter 的使用,闲鱼团队在业界已经有了不错的实践。
蚂蚁金服无线开发专家肖凯老师将于 12 月 20~21 日举行的 GMTC 全球大前端技术大会 (深圳站) 上分享《蚂蚁财富 Flutter⼯程化实践》。InfoQ 在会前采访了肖凯老师,让我们一起来看看蚂蚁财富无线团队是如何在 Flutter 上实践应用的,期间遇到过什么困难,又是如何解决的。希望给正在实践 Flutter 的你一些经验和启发。
肖凯:我是蚂蚁金服的一名无线技术专家,负责蚂蚁财富端上的开发工作。先前在网易有道负责有道翻译官的开发工作,2017 年加入蚂蚁金服。目前上线的一些作品有蚂蚁星愿、财富王者和 18 财富日等。另外可以去 AppStore 搜索蚂蚁财富来体验一下,里面包含了我们的 Flutter 实践。
我所在的平台与基础小组,主要负责蚂蚁财富 App 的开发工作,技术栈覆盖了 iOS、Android、H5、Flutter 和 Node.js 等。内部有很多黑科技产出,由于领域特性大部分内容没法对外公开,前期开源过安卓构建系统 freeline,平台负责人 bang 的个人博客也公开过一部分实践。
肖凯:在有道时面临产品多人员少的情况,战略层需要构建产品矩阵覆盖用户。基于这种状况,我们把组件化建设提到最高优先级,采用“三步走”战略:
第一步沉淀基础能力、账户以及社交分享等;
第二步业务工作流的构建、CI 流程的搭建、业务如何使用和质量怎么保证;
第三步业务共建,丰富生态。
对于快速迭代的小规模团队,这套组件化工程方法并不会即时收益,还会增加开发成本,随着有道移动教育产品线全面启动,各种 App 开始立项时这些工作才开始发光发热。
在当时移动开发的作坊时代,这套组件体系让我们以极少的人手(2 人)击败了来自大厂的竞品百度翻译和腾讯翻译君,算是技术价值正名。
肖凯:跨平台是移动开发不断追求的目标。Web 本身是很理想的方案,有很多业界前辈都曾信心满满的使用 Web 作为主技术栈,但是由于性能等问题最后也都败下阵来。后来又出现了 RN 等端渲染方案,但又引入了兼容性等新问题,某些大厂在实践后发现,使用 RN 类的方案,开发成本从 2 端变成了 3 端,于是又开始去 RN 化……这时候谷歌推出了自己的跨平台 UI 框架 Flutter(官方说法:UI 工具包),思路是从精简浏览器来的,从技术方案上就解决了其他方案无法跨越的性能和兼容等问题。底层方案优秀再加上谷歌在社区的影响力,Flutter 就成了移动开发人员无法忽视的存在。
Flutter 也有自己的缺点:
热修复,国内技术圈对热修复的偏执可能会是业务使用 Flutter 的最大障碍。目前官方有提供安卓上基于 CodePush 的热修复方案,但在 iOS 上还是无法做到,官方的态度也并不支持,对于将热修复视为救命稻草的国内大厂是一个很大的障碍。
语言和生态,Dart 语言由谷歌主导开发,于 2011 年 10 月公开,不算新语言,但对大多数开发者而言还是陌生的。语言对于大多数开发者还是一个不小的障碍,小程序发展如火如荼和它使用 JS 有很大的关系。Dart 的生态在 2019 年也还处于刚起步的阶段,对于开发者吸引力不强。
体积,接入 Flutter 会增加 App 体积:iOS 双架构( arm64 和 armv7)15M 左右,Android 单架构约 7M,包的体积对于大厂而言又是选择的条件之一。
版本迭代,目前 Flutter 还处于快速迭代的时期,官方 Release 很快,经常出现发布 Stable 后很快又推出 Hotfix 版本的情况,这就要求技术团队对于新技术要有很强的判断力。
另外,从商业政策上看,Apple 对 Flutter 的态度不明确。近期出现了 Apple 检测二进制包中含有小程序关键字并拒审的情况,Flutter 技术上对于动态化并无限制。不过谷歌官方最新的 Roadmap 中已经移除了动态化支持的内容,从官方的态度上来看,目前是乐观的,使用 Flutter 的技术团队可以持续关注下。
肖凯:小程序主要是迎合了国内的流量垄断的现状,是一次商业上的创新,加上构建在 JS 的丰富生态之上,很快吸引了大量前端开发者。
Flutter 有很多优秀的设计思想,从商业市场、技术语言以及动态化等限制上都可能会导致国内很多厂商通过小程序的方式来使用 Flutter,参考 Flutter 来构建自己的小程序渲染引擎。
但新旧技术更替并不是一蹴而就的,一段时间内 Flutter 和传统的小程序技术方案还是会和谐共存,在不同的业务场景下发挥各自的技术特性。目前已经出现了 IoT 设备上 Flutter 的渲染方案,技术成本和最终性能都是优于传统渲染方案的。
在国内市场环境下,Flutter 最终可能会被吸纳为小程序生态的一种渲染方案或者被 PK 掉。但在某些小厂的垂直 App 和即将出现的小终端上,Flutter 可能会找到自己的完美天堂。
肖凯:大概的问题有以下这些,
混合栈,Flutter 官方推荐的标准使用方式是作为独立应用的 U 框架。对于流量垄断的国内市场,我们面临更多的是混合应用场景,最终我们使用了闲鱼的 FlutterBoost 混合栈方案取得了不错的效果。
路由,在成熟 App 中接入 Flutter 对于路由方案会有很强的入侵,最后我们通过 Flutter 反向代理路由的方式实现了无侵入的 Flutter 路由方案。
内存,Flutter 在 iOS 上内存表现并不是很好,最终我们通过复用 engine,修复 engine 自身内存泄露的方式解决了。
工作流,蚂蚁内部业务团队庞杂,多业务方合作是常态,抽象了工作流 CLI,达到了在 Flutter 上业务隔离,协同开发的目的。
构建,Flutter 自身的构建和传统端开发格格不入,最终 iOS 上选择了 BuildPhase,Android 上 Hook 了 Gradle 的构建过程与已有构建系统进行了集成。
业务埋点,Flutter 生命周期和原生应用有些区别导致某些业务埋点表现与 native 异常,最后通过定制生命周期的方式与原生应用保持了协同。
还有其他很多细小问题,比较通用我就不一一说了。
肖凯:考虑谷歌未来要推出的 Fuchsia,且 Flutter 作为该平台上的标准 UIKit,如果 Fuchsia 能获得商业上的成功,Flutter 无疑会站上移动开发舞台的中央。
Flutter 社区目前都很活跃,生态方面不用过于担心。从技术人员的角度来看大胆拥抱吧。
在未来 Flutter 除了和传统移动开发技术在手机端持续竞争,还会在新兴小终端应用上深入探索,并且谷歌对 Flutter 的期望就是打造全平台 UI 工具包,随着对 Flutter 挖掘的深入和 5G 时代的来临,可能小终端会成为移动开发新的战场,Flutter 会带来强大的活力。
Flutter 工程化方面我们已经取得了不错的积累,之后计划:
进一步拓展能力,可能的话会输出到社区;
不仅仅局限在前端,后端和其他终端我们也会继续探索;
Flutter 在国内还处于推广阶段,关注多使用少,后面我们将会和社区的交互放在高优先级,通过技术交流和输出证明其在生产环境中的价值,为 Flutter 在国内的推广尽一份力。
在即将到来的 GMTC 深圳 2019 上,肖凯老师还会具体分享到,蚂蚁金服无线团队面对高风险金融业务 Flutter 的实践落地,以及对 Flutter 这门新技术的独立思考和使用 Flutter 的一些经验,为业务带来价值的同时通过工程化的方法将更优秀的技术辐射到其他业务部门。
除了肖凯老师的分享,本次 GMTC 全球大前端技术大会(深圳站)2019 我们还设置了小程序、音视频技术、Node.js 实践、测试与安全、大前端工程化、Flutter 实战、新兴编程语言、团队建设与管理等热门技术专场,点击“阅读原文”,了解大会详情。