11 月 23 日,字节跳动技术沙龙 | Flutter 技术专场 在北京后山艺术空间圆满结束。我们邀请到字节跳动移动平台部 Flutter 架构师袁辉辉,Google Flutter 团队工程师 Justin McCandless,字节跳动移动平台部 Flutter 资深工程师李梦云,阿里巴巴高级技术专家王树彬和大家进行分享交流。
以下是字节跳动移动平台部 Flutter 架构师袁辉辉的分享主题沉淀,《跨平台技术趋势及字节跳动 Flutter 架构实践》。
演讲内容大纲:
移动跨平台技术趋势
解读 Flutter 引擎原理
字节跳动在 Flutter 架构实践
自我介绍
大家下午好!今天跟大家分享的主题是《跨平台技术趋势及字节跳动 Flutter 架构实践》。
我是今年加入字节跳动,目前在移动平台部负责 Flutter 架构优化工作,在此之前我在小米做了 3 年安卓手机系统的底层优化与研发工作。平时工作之余喜欢写写博客,从 16 年开始,坚持写了 4 年,产生 200 余篇原创技术篇章,与此期间也受邀出席业界的一些安卓相关的技术大会。
面对层出不穷的新技术
在正式分享之前问大家一个问题:面对层出不穷的新技术,你是选择继续深耕原有技术,还是会尝试新技术? 大家不要思考,你直观印象会选择什么?
但其实面对这个问题的时候,很多人想的是:我是不是要尝试新技术了?就像上面这个例子,很多人会想到,我如果不断换新技术,是不是最终一无所获?我如果坚持一个方向,最终我能获得我想要的东西、能够有所成果,我就不要去尝试新技术了。但其实这里面有个误区:
第一,如果你在一个领域做得足够长时间,3 年、5 年、10 年,那么你有可能会有所收获,这时候你就会进入技术疲惫期,有可能就不愿意再去挑战新的东西了,有可能觉得成长空间受到限制,这个时候如果你愿意跳出技术舒适区,去看一看周边新的技术,会拓宽你的知识面。以我个人为例,我在此前做过安卓手机驱动层的开发,我又做过上面安卓 Framework 层,来到字节跳动又开始做 Flutter,在我不断选择新方向时,这何尝不是一种深耕呢?把你的技术栈打通。
第二,如果你选择学习更多新技术时,可以看到下面有很多钻石,你要选择找到一颗最大的钻石,怎么找?要看趋势,一个好的趋势不一定帮你找到最大钻石,但是一定可以帮你更高概率找到更大的钻石。
第三,如何找到一个新的想法,是不是每次工作时都像左边那个人从头开始?其实这也是一个误区。有经验的人都知道,你在一个领域深耕时,再学习一个新的领域绝非从零开始,到一定程度你会横向发展、横向打通,而不是回到零点,你的学习成本时间不会那么长,因为技术是相通的。
所以我们在追求技术过程中,如何找到更大的钻石?就是看技术趋势。如何收获更多钻石?不要拘泥于一个方向,当然,也不建议大家频繁的切换,但可以在多个领域收获。如何更高效的找到钻石?我们的技术是相通的,当你在学习新技术时,要你把原有的技术联通、打通,融通你的的任督六脉。
为了解决这几个问题,我们以移动跨平台为例。首先,我们先看看移动端技术发展趋势;再则看看 Flutter 引擎到底有哪些核心技术,如何跟原有技术相通的;最后介绍一下字节跳动在 Flutter 新技术领域有哪些技术进展与落地实践,看看在新领域是如何做到快速深耕。
一、移动跨平台技术趋势
我们为什么做移动跨平台技术?
移动互联网发展 10 多年来,由之前传统 PC 端时代到移动时代,在移动时代竞争激烈,各大移动互联网公司都在争相抢夺市场,如何提高研发效率,产品快速迭代、快速试错成为非常重要的因素。
与此同时,还要看在关注研发效率的同时能否做出一个性能比较高的应用,往往我们的研发效率和性能是天平两端,性能好了开发效率可能就差了,开发效率好了性能可能就差了,这就需要思考如何把开发效率和性能这两者做到更好的平衡。
再者,面对这么多跨平台技术,能否用一种语言开发出应用在多端体验是一致的?UI 小姐姐设计这版小龙女,研发小哥哥开发出另一款小龙女,到安卓平台变成各种各样的小龙女,发现 UI 长得都不一样。我们能否实现高效的多端一致性体验?
再者,能否突破渠道去快速更新我的应用?这个不光是跨平台技术,Native 技术本身也是同样关注这个问题。
以上,是跨平台技术方案优劣最为关注的几个因素。
跨端技术这几年是怎么发展的?
我们在 2011 年时,以 WebView 技术做跨端,这个跨端有比较大的局限性,性能很差、功能受限,不能做复杂场景。到了 2015 年 Facebook 出了 React Native,它是以 JS 语言,通过中间层转换,最终渲染调到 Native 层,性能相对更好一些。接下来阿里推出了 Weex,也是通过 JS 语言调到原生渲染。2018 年 Google 出了 Flutter,它有自自己的引擎、自渲染机制,它的性能比较好。这就是大概的演进。
跨端技术类型
跨端技术分为几类:
原生渲染:通过各种技术调中间层转换,最终渲染,安卓还是调安卓的,iOS 的还是调 iOS 的。
WebView:通过调 WebView 的技术去渲染,我们的小程序也是基于这一块。
自渲染:可以不借助系统的,自己写一套