字节跳动正在使用并持续参与优化的这项技术,最近登上了Google I/O大会。

它就是Google开源的Flutter,用于客户端和前端开发的跨平台开发框架,已经在GitHub上获得了超过12万star。

Google I/O大会上,Flutter产品经理Zoey Fan在发布Flutter 2.2前,专门介绍了字节跳动的Flutter应用成果。

字节跳动有70多个App选择Flutter作为跨端解决方案。

相比Android/iOS双端开发,跨平台的Flutter可以节省约1/3的开发时间。

字节跳动累计有500多位Flutter开发者,200多位活跃Flutter开发者,不仅将Flutter应用于移动App,还积极尝试应用于Web、桌面和嵌入式。

这背后,是字节跳动在公司内所做的大量基础建设工作,还给Flutter官方开源提了几十个Pull Request(PR)。

压缩体积、优化性能,字节跳动针对Flutter做了什么?

字节跳动针对Flutter的建设要从两年前说起。

当时,字节跳动终端技术团队的同学注意到,公司不少业务都有跨平台开发的需求,但缺少一个工具来实现高效率、高性能的开发。

恰逢Google开源了Flutter,团队同学发现,Flutter不仅一次开发就能部署在安卓、iOS、Web等各端,而且有自己的渲染引擎,多端一致性比较好。

可以理解为,用Flutter做开发,一个产品的安卓、iOS、Web各端就可自动同步,不需要专门为各端重新画UI、写代码,减少了很多重复劳动。

于是,字节跳动终端技术团队开始就Flutter做大量优化,包括但不限于性能优化、应用框架、容器化、研发流程、混合工程支持等等,还对FPS、Timeline等工具做了优化。

在推动落地过程中,做Flutter团队还发现了很多个性化的问题。

Flutter作为一个框架是一定要加入安装包的,但放进去之后,用户下载的安装包体积就会变大,而且Flutter要用到Dart语言,用这种编程语言写的代码比原生代码更占空间,进一步增大了安装包的体积。

想要照顾用户体验,又想使用更先进的技术提升效率,这要怎么平衡?

Flutter团队成立了包体积优化专项,一方面做Data压缩、编译优化、Skia裁剪、BoringSSL/ICU库/文字渲染/libwebp等库裁剪来缩小安装包体积;另一方面,团队把原生代码和Dart代码比较了一下,发现在写相同业务逻辑时,Dart生成的机器码指令更多,于是就进行了二进制指令头、指令冗余、指令对齐的精简,以及StackMap和CodeSourceMap的精简。

上面的每一项都能缩减0.2~4MB,这样整个安装包都可以缩小不少。而且,这些优化都在一次次沟通中向Google工程师反馈,也为Flutter做出了开源贡献。

但功能上线之后,Flutter团队又发现了新的困扰。有一次,他们接到用户反馈:在产品界面上滑动的时候,怎么就那么卡呢?

他们打开后台看到,FlutterView在分别继承SurfaceView和Textureview的两种场景下,肉眼可见使用TextureView比SurfaceView更为卡顿。但通过官方默认的Timeline工具发现,TextureView和SurfaceView渲染绘制过程中,每一帧的UI线程和GPU线程耗时基本差不多,甚至TextureView还能快一点。

两者完全相反,令人摸不着头脑。

他们先用Flutter官方提供的性能分析工具Timeline来分析这个问题,但却始终无法发现任何异常。困扰已久,他们干脆把Timeline整个性能分析工具的源码研究了一遍,原因水落石出了:

SurfaceView的性能比TextureView更好,因为SurfaceView有自己的surface,渲染有独立的GL context,可独立跟SurfaceFlinger交互,充分利用triple-buffer机制;TextureView只是普通的view,依赖于宿主窗口的surface,每次flutter的ui和gpu线程完成后,并不会立刻被渲染到屏幕上,而是需要等待Native的主线程和renderThread来完成跟SurfaceFlinger的交互,可见渲染链路远比SurfaceView要长。

这一发现不只解决了滑动卡顿的问题,也向Flutter开源社区提了10个PR。经过这样的一系列工程基建后,Flutter在字节跳动逐渐成为更好用的框架。目前,字节跳动Flutter相关解决方案即将通过火山引擎移动研发平台veMARS对外输出,服务更多外部开发者。

从尝试到落地,字节跳动这样使用Flutter

Flutter在字节跳动的落地也是艰难坎坷的过程。

团队先选了一个成熟产品,希望在其中视频播放功能上先尝试落地。

这个功能本来是用安卓和iOS的原生代码写的,想要改成Flutter并不容易。他们努力了半年的时间,发现由于一些历史包袱的存在,难以把所有线上数据都对齐,想要把原有业务改头换面并不容易。

这时他们意识到,在成熟产品上修改原有功能,效用并不明显,Flutter的优点应该用在新开发的业务上,Flutter团队负责人说:“成熟的产品各个功能都是完善的,早就用安卓、iOS原生技术写完了,现在只是做一些调整,用Flutter重写效率也没有很大的提升,把Flutter引擎放进去还占包体积。但如果用在新的产品、新的场景里就可以大幅提高效率。”

思路转变之后,他们迅速把目光投向了教育等方向的新业务。

在教育产品「大力爱辅导」中,为了教小朋友们汉字笔顺,需要完成一项「汉字描红」功能。

要实现这个功能,大力爱辅导研发团队借助部分开源项目的思路,用SVG指令表示笔画,之后调整坐标系,在合适的位置上组成汉字:

然后找出每个笔画中关键的骨骼点,像书法一样,虚拟的笔就可以按照骨骼点来移动:

按照骨骼点的顺序,依次以骨骼点绘制出半径为radius的圆,大量的圆形组成了笔画,并补充一些关键点来保证足够的帧数。

这样,就可以得到流畅的描红效果:

这项功能就是用Flutter开发的,现在已经覆盖了9000多个汉字,支持绝大部分常用字。相比用原生代码开发,Flutter节省了更多开发的时间和精力。

现在,字节跳动许多App都用了Flutter和其他技术混合的开发方式,新的产品更倾向完全使用Flutter。在西瓜视频、抖音火山版、开言英语等多个业务上,Flutter都提升了大约三分之一的开发效率。

拥抱新技术的ByteDancer

现在,字节跳动的Flutter团队依然在持续探寻最新的技术。“我们团队有很多具有全球视野的技术热爱者,会持续发掘全球技术动态,讨论技术的落地,”团队负责人说,“我们和国内外许多技术公司都有密切的联系与合作,比如我们跟Google有一个季度会议,会定期关注Google的进展,交流想法、需求、技术idea。”

有一天,Dart的GitHub项目维护者找到字节跳动Flutter团队负责人:你们字节跳动有个同学给Dart提了十几个PR,都很不错,思路非常清晰。

Dart这个编程语言,目前最广泛的应用场景就是Flutter。

这位同学就是Flutter团队的Frank。这位刚刚本科毕业三年的同学是一位非常热心的开源贡献者,从2015年开始,还在读大一的他就开始了自己的开源之路,他主导开源的一个游戏框架在GitHub上有700+star。“之前每年都有几百次下载,有很多游戏开发者用它做demo”,他这样介绍。

毕业后,当Frank进入Flutter团队,他也成了团队中最热心的开源贡献者之一,不断给Flutter和Dart提PR。他还记得在研究安装包体积的问题时,主动跟进了一个相关的issue,发现Specializer的优化有一些可以完善的地方,就把Dart的编译器中端做进一步优化。因为涉及到的代码块比较多,来来回回改了7次,双方顺利沟通后,一个星期就merge了。

截止到现在,他已经给Dart提了18个PR,其中有10个已经被merge。

像Frank这样热衷技术开源的同学,Flutter团队还有很多。

他们这样总结这种对创新的积极态度:

这个行业里确实很多人只喜欢用成熟的技术,但任何一个新技术都有从不成熟发展到成熟的阶段,总有一些人热衷尝鲜、喜欢新技术。

尤其是对于Flutter这种「破坏式」创新,我们软件行业里总需要一些勇于挑战的人来投入。在字节跳动,不管是我们Flutter团队,还是我们服务的很多业务团队,都在积极尝鲜,愿意投入到新技术里——这也确实让我们尝到了甜头,提升了开发效率。

我们希望能做一些事情,推动行业往前走,Flutter可能就是其中之一

亮相Google I/O,字节跳动是这样应用Flutter的相关推荐

  1. Flutter 沙龙回顾 | 跨平台技术趋势及字节跳动 Flutter 架构实践

    11 月 23 日,字节跳动技术沙龙 | Flutter 技术专场 在北京后山艺术空间圆满结束.我们邀请到字节跳动移动平台部 Flutter 架构师袁辉辉,Google Flutter 团队工程师 J ...

  2. 字节跳动的多平台绽放秘诀 | Flutter 开发者故事

    字节跳动旗下运营着一系列成功的用户产品.企业应用以及服务,覆盖信息.教育.娱乐等不同领域.随着产品阵容的不断发展,传统的原生双平台开发已经难以满足团队更高效.更灵活.更精美,以及更多样的产品研发需求. ...

  3. 字节跳动宣布员工福利升级:新增10天“家庭关爱假”;Google翻译中国站点疑似关闭;Qt 6.4 正式发布|极客头条...

    「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 整理 | 梦依丹 出品 | CSDN(ID:CSDNnews ...

  4. 亮相智源大会,字节跳动自研同传系统的技术实现

    背景 6月1日至6月3日,由北京智源人工智能研究院主办的2021北京智源大会在北京中关村国家自主创新示范区会议中心成功召开,来自近80个国家数万名人工智能领域专业人士参会. 本次大会共持续三天,设置了 ...

  5. 字节跳动无恒实验室首次亮相Black Hat 2021亚洲黑帽大会:全生命周期管理的隐私保护框架

    5月4日至7日,Black Hat Aisa 2021(亚洲黑帽大会)如期在线上举行.Black Hat大会被公认为世界信息安全行业的最高盛会,被誉为黑客世界的"奥斯卡",也是最具 ...

  6. 互联网日报 | 8月9日 星期一 | 字节跳动否认重启上市计划;TikTok全球下载量去年居首;中国代表团38金32银18铜收官...

    今日看点 ✦ 东京奥运会闭幕,中国代表团38金32银18铜圆满收官 ✦ 高德地图公交出行新增同城火车路线,首批上线30多城 ✦ 最快4小时出结果,百度健康核酸检测覆盖全国百余城市 ✦ 特斯拉西宁首个充 ...

  7. 40天,编码器效率优化100倍,字节跳动这样拿下国际比赛4项第一

    如何看在线视频更省流量?近几年,人们观看各类视频越来越流畅了.背后除了网络基础设施的提升之外,一项"黑科技"起到了关键的作用:视频编码.这也是字节跳动技术团队研究的重要领域. 在视 ...

  8. 字节跳动AI Lab社招以及实习生内推

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 字节跳动AI Lab社招以及实习生内推 团队介绍: 我们组是字节跳动 ...

  9. 微盟创始人孙涛勇回应员工删库;字节跳动推“头条搜索”独立 App;C++ 20 规范完成| 极客头条...

    整理 | 屠敏 一分钟速览新闻点! 微盟创始人孙涛勇回应员工删库:员工深陷网络贷,曾有过轻生 神舟电脑宣布将自己开发神舟商城,现在开始招聘 微信公众平台正在灰度测试"视频"入口功能 ...

最新文章

  1. 只知道TF和PyTorch还不够,快来看看怎么从PyTorch转向自动微分神器JAX
  2. 超酷的JS时间效果--收集
  3. linux命令冒号加叹号,Linux中的叹号命令
  4. popover带箭头弹框
  5. [HNOI2010]公交线路
  6. 解决虚拟机在能ping通网关情况下出现From 192.168.1.10: icmp_seq=1 Redirect Network(New nexthop: 192.168.1.1)问题
  7. 什么是作用域链(源码解析)
  8. mysql semi join_技术分享 | MySQL 子查询优化
  9. 【Android每日一讲】2012.11.08 Android 多语系支持 -- Locale与Configuration
  10. (转)BlackRock:全球最大资管公司如何一步步倒戈人工智能?
  11. vt版本不见了_王者荣耀VT版本玩法是什么?修改机型玩VT版方法是什么?
  12. flex布局兼容性问题
  13. matlab洛伦兹吸引子,用Matlab求解洛伦兹方程
  14. 锐度对比度饱和度什么的
  15. Unreal Engine 4 —— Smear Frame效果的实现与分析
  16. proftpd ldap mysql_安装proftpd+ldap报错
  17. scp_linux之间互传文件
  18. 贝叶斯统计分析中的基本概念和基本方法
  19. Codeforces 1106F Lunar New Year and a Recursive Sequence 矩阵快速幂,原根转化模意义下对数,BSGS
  20. 重磅,2020广播电视科技创新奖揭晓

热门文章

  1. 物联网开发笔记(9)- 使用Wokwi仿真MicroPython on ESP32开发板实现温度和湿度检测并使用屏幕显示
  2. 跨端融合!探索前沿科技无限可能,深圳腾讯2018TLC大会再度来袭,早鸟票最后一天...
  3. 【SaltStack官方版】—— EventsReactor系统—BEACONS
  4. 也不能在你喝醉的时候假装很生气的臭骂一顿
  5. 红警2尤里的复仇中文完整PC版
  6. 资金核对平台的发展历程
  7. 用三个步骤实现响应式网页设计
  8. padding不会撑开盒子的情况
  9. 蓝牙手柄UKCA认证
  10. 关于TR1900错误的一些解决方法(引用冯哥)