Flutter 沙龙回顾 | 闲鱼 Flutter 架构演进和实践

11 月 23 日,字节跳动技术沙龙 | Flutter 技术专场 在北京后山艺术空间圆满结束。我们邀请到字节跳动移动平台部 Flutter 架构师袁辉辉,Google Flutter 团队工程师 Justin McCandless,字节跳动移动平台部 Flutter 资深工程师李梦云,阿里巴巴高级技术专家王树彬和大家进行分享交流。

以下是阿里巴巴高级技术专家王树彬的分享主题沉淀,《闲鱼 Flutter 架构演进和实践》。

演讲内容大纲:

  1. 闲鱼为什么选择 Flutter

  2. 闲鱼的架构及其演进

  3. 回顾及展望

今天主要分享的内容是闲鱼一年半在 Flutter 的演进,希望有某个阶段某个场景和大家契合,给大家一些启发和讨论。

个人介绍

先做一个自我介绍,我是闲鱼的架构负责人,在 2009 年就加入阿里了,2009 年是淘宝首次实现营收平衡的那一年,也是第一次双十一的那一年,在那以后迎来了淘宝快速发展的时期,在那个快速发展的背景下,我做了商家百亿级数据的在线分析系统以及营销系统,再后来就是用到无线,在无线时代时去做手淘上 0 到 1 的地理围栏和 LBS 的无线特性的项目。

闲鱼是 2014 年创立的,2015 年我来到闲鱼,经历闲鱼从早期到现在超过 2000 万 DAU 的发展阶段,这 4 年时间看到闲鱼这样涨起来。中间到了一定团队规模以后,我就去负责闲鱼架构,以适应闲鱼的快速发展。

闲鱼为什么选择 Flutter?

Flutter 也并不是最完美的一种框架,没有最好的只有最适合的,到底是什么场景让闲鱼选择了 Flutter?

闲鱼背后是高速发展的 C2C 市场

大的业务背景是这样的。首先,闲鱼是 C2C 的交易市场,随着中国网购商品不断丰富,社会上存在越来越多大量的闲置物品,出现了这样一个存量市场,这个市场规模有多大?从闲鱼角度看,在 2019 年财年,就有 6000 万以上的用户发布了自己闲置的商品,这个数字还在增长,到现在每天已经有 100 万人发布超过 200 万件商品。然后,因为它是 C2C 对等交易,这样的用户会形成更多互动和社区属性,可以看到闲鱼里已经沉淀 130 多万个鱼塘,形成这样的社区。这是一个大的背景,就是高速发展的存量市场。

闲鱼客户端侧的业务特点

端侧业务特点是什么样的呢?有几个特点:

  1. 业务心智。闲鱼是独立的业务心智,促使我们把主要开发力量投在闲鱼 APP 上,有一些外投的场景,像投到手淘、支付宝或者外面的场景,那是少量的页面。

  2. 高苹果用户占比。闲鱼的特点是苹果用户占比高。这个特点导致早期时我们在设计上对设计的要求非常极致,两端的设计要求一致且要以苹果设计为主,这时候如果做安卓开发的同学就可以想象到安卓这边的痛苦了。

  3. C2C、社区业务背景。导致有很多互动、商品图片及视频的需求,另外快速发展期有很多大的业务尝试。

闲鱼的端技术选择

这样几个特点就导致我们下大决心迁到用 Flutter 来做,那是到了 2017 年底的时候。在中间也曾经尝试过用 Weex。

现在闲鱼的技术栈是这样的:活动类和外投类的产品页面用 H5、小程序、Weex 开发;主链路、产品化的页面都用 Flutter 开发,这部分在闲鱼的覆盖率有 80%以上。原来 Native 开发同学都转型到用 Flutter 开发了。这些是技术因素,此外还有团队也是很重要的因素,Native 同学写 Flutter 会转换更快一些,闲鱼有 Native 人员基础,所以才有决心深入去做 Flutter。

闲鱼的架构及其演进

这是发展到现在闲鱼的架构:下面是从项目管理、打包平台、持续集成到自动化测试;中间的包括页面组件、Native 混合、音视频组件等;再往上一点是承载业务的容器,让业务能够把自己业务流程下沉的容器(Dynamic 和 Serverless)。

闲鱼架构的演进

这个架构怎么演进来的?大概有三个阶段:第一,混合开发,引入期。第二,规模化,发展期,越来越多页面和人员投入时,会面对一些新的问题。第三,一体化,新探索,成熟以后考虑下一步怎么探索,原来只是从跨两端角度提高效率,现在把云(Server)也考虑进去,从云端一体的角度考虑效能的进一步提升空间。

一、混合开发、引入期

引入期通常做些什么事情?闲鱼从最开始要用 Flutter,到最后上线用了 3-4 个月时间,因为的前车之鉴少。但是到今年,杭州有一家初创公司,它从决定开始用 Flutter,到最后上线,只用了大概 1 个月,可以看出现在这个引入期成本已经降下来了。虽然降了,但是引入期最大的工作内容还是在混合开发这一块,也就是怎么把 Flutter 混合到自己已有 APP,除非你是开发一个全新的纯 Flutter 应用。

混合开发大概包括几种:

  • 第一种,混合栈,这是躲不掉的,怎样把页面混合起来,混合栈是这个架构图里的 Boost,已经开源了。

  • 第二种,工程化,从代码管理到持续集成、打包、监控、高可用,这一串的链路。

  • 第三种,音视频和资源一体化,这块主要是考虑高性能图片、视频组件与 Native 复用。

1. 混合栈的关注点

(1)单页面栈和多页面栈。从 Native 角度看,当新开一个 Flutter 页面,这个页面要在新的 Activity(以 Android 为例)中打开,还是在同一个 Activity 里面面来回切换 Flutter 页面?如果每一个 Flutter 页面都挂在一个新的 Activity 下,就算多页面栈的设计。反之就是单页面栈。哪种更好?如果想跟 Native 本身的栈能够很好结合,逻辑和顺序都能完全一致的话,那多页面栈是最合适的。那单页面栈适合用在什么场景?比如在 Flutter 页面弹出浮层或者 Dialog 的场景,这时直接在 Flutter 内部用 Navigator.push 就可以达到想要的效果,但是除此之外,大多数场景都需要多页面栈的方式。flutter_boost 这两种都支持。

(2)单引擎和多引擎。上面说的多页面栈涉及一个问题,每个 Flutter 页面都挂在一个新的 Activity(以 Android 为例)下,那这些页面的 Flutter 引擎到底是用同一个引擎还是多个引擎呢?这也是混合栈要考虑的重要问题。直观来看,要适应多页面栈,那就用多引擎,每个页面都起一个 Flutter 引擎最简单了,但最大的问题是内存会暴涨,虽然现在官方也想去深度复用这个引擎,让引擎能够很轻量化,但是目前这个还没有 Ready。所以从单、多引擎来讲,目前我们使用的方案还是单引擎的方案。单引擎的方案的优点就是内存省了,所有的 Flutter 都在一个引擎里。

(3)单引擎虽然解决了内存暴涨问题,但由于引擎内的栈跟外面 Native 栈的页面生命周期不一样,用单个 Flutter 引擎相当于把这个 Flutter 页面在 Native 页面间来回移动,Native 的生命周期跟 Flutter 生命周期要完全对上,如果对不好的话就会出现转场白屏、埋点丢失、页面销毁不当等各种奇怪的问题。对单引擎设计来讲,实现基本流程通常没问题,但是最重要的是里面细节问题特别多,需要仔细处理各个细节问题。这方面大家可以参考 flutter_boost。

2. 混合开发的工程化问题

这块问题通常是因为原来有 Native 同学,现在有 Flutter 的同学,要一起去开发。这个问题刚才有一个同学也提问到了,这时工程到底怎么做?是用 Flutter 包 Native,还是用 Native 包 Flutter?这是两种思维方式。标准的 Flutter 是在 Flutter 下面挂了安卓、iOS 的工程,用这样 Flutter 包 Native 的方式。还有一种方式是可以反过来,可以把 Flutter add to Native 的思路,闲鱼用这个思路做了一个 flutter_boot 工具,已经开源,大家有兴趣也可以参考。

3. 音视频和资源一体化

闲鱼原来在 Native 时期,有成熟的图片库,也有成熟的视频组件做滤镜、编解码优化之类优化的,这些组件在 Flutter 上要复用起来,如果用官方默认的方式在生产环境会发现性能有问题。

这是关于视频复用的方案,第一个官方直接给的默认实现,在没有格式转换的情况下问题不大,但需要格式转换时,性能就会有问题。以打开摄像头做预览的场景为例,默认的第一种方案是把 Texture 提取到 Java 或者 Flutter 运行期的 Buffer 对象里,每一帧通过 Channel 传递到 Flutter,再贴到 Texture 上,这个办法缺点是有一次读、一次写的过程,性能不是最优的。从我们的实测看,iPhone 7 上 720P 的视频,这种方案平均每帧多消耗 5-6ms。

后来我们尝试两种方案把性能提升,第一种方案的思路是“新方案 1”这样的,想办法把 Native 侧的 Texture 跟 Flutter 侧的 Texture 复用,直接传递 Texture ID,这个好处是没有往上 Dump 内存的过程。这种方式不好的地方是需要改 Flutter 的代码,打 Patch。还有一种更好的方案,这是我们后来发现的,这种方案不用打 Patch,可以用 Surface Texture 直接复用的机制,在 Native 和 Flutter 侧是同样的 Surface Texture,就可以复用了,建议大家用这种方式更好一些。

二、规模化

工程变复杂了,页面变多了,这时候重要关注的点是怎样让人员之间、模块之间解耦。团队大了并行开发更多,有几个小组需要并行开发,不再是一个大组了。另外,也要关注代码标准化。

刚才说到解耦,大概有两个层面之间的解耦:一个是“Card”的解耦,长页面中每一行是一个业务组件 Card, Card 之间让它们尽量有少的互相依赖。还有一部分是 Card 的内部解耦,主要是解 UI、逻辑和数据分离的问题,这个问题业界有一种 Redux 方案,闲鱼做的 fish_redux 是把组件 Card 间的解耦能力加到了 Redux 上,即把一个大页面拆成多个组件,组件间也可以解耦解了。

规模化期另外一个考虑的问题是高可用。Flutter 有一个特点,由 Flutter 引起的整个 APP 的 Crash 很少,更有效的方式是监控它的异常,对异常的监控就需要在这个阶段把异常做聚类、信息裁剪。另外,还需要对页面 FPS,可交互时长等的监控。

此外,CI 和自动化测试方面,在规模期也有一些事情要做,原来的自动化测试有一些没有办法用在 Flutter 上,例如基于 Instrumentation 和 UiAutomator 的测试方案。只有基于 Monkey 的可以直接用。

这里详细介绍下解耦时用到的 AOP 技术,AOP 是解侵入的手段, JAVA 和 OC 里这块都容易,但是在 Dart 里没有成熟方案。AOP 的一种解决方案是基于代码生成,另外一种解决方案是在 Dill 里修改,Dill 是 Dart 到最终产物中间的语言。

这块的思路是什么样?原来有一个 APP 工程,你想对它加一些功能,这个用 AOP 方式切进来,让原 APP 工程感知不到。解决方案是让 aop-project 的 Main 引用 app-project 的 Main。打包时选生成 aop.dill,包含这两个工程所有的代码,再经过 aspectd 的处理,把两个工程的切面编织到一起,成为最终产出物。

怎么去改这个 aop.dill?Flutter 在编译中有一个很好的设计,它提供转换的能力,可以让你在编译流程中拿到语法对象以后,对这个对象做自己的转换。基于这样的原理,读取语法代码的树,然后对它做遍历,把工程里的 AOP 注解解析出来,编织到一起就可以了。做 AOP 时要考虑,比如以 foo() 函数为例,是想在 foo 外面做界面插入,还是在 foo 里面第一行和末行插入,甚至还有一种可能是在 foo 函数中间某一行做插入,这些都是 AOP 不同的编织动作,对应几个操作分别有不同的注解。

三、一体化

第一个概念,动态模板是在业务层想做业务流程下沉时用到。比如一个交易链路里有可定制的优惠模块、物流模块、商品信息模块等,可能有非常多组件,可以把这个流程沉淀,变成中台,让上层多个业务能够复用组装,在这个主干的流程上做自己的扩展点。我们的一个解法是用动态模板的方式,让 Flutter 支持模板化。

第二个概念是 Serverless 框架,可以把服务端的业务层代码跟客户端代码统一。

上面讲的是一体化的端侧的概念,下面这部分是服务端的容器,很重要的基础设施是 FaaS 平台和 ServiceMesh。标准的 Faas 不需要我们自己去建,云上和阿里内部都有,我们要做的是让 Dart 跑在 Faas 上,做一个符合 Faas 规范的 Dart 语言的 Runtime 容器,核心要解决什么问题?一个是让 Runtime 能适应不同的 Faas 平台,它有足够的解耦性。另外一个重要的问题是解决语言无关性问题, Dart 语言肯定碰到原来生态如 Java 或者某种语言的,像闲鱼的是 Java 生态,那怎么去调这些异构服务,要解决语言无关性的问题。大概思路跟 Servicemesh 差不多,用 Sidecar 解决语言无关性的问题。

中间是通道服务响应框架,这个框架主要是通道层的抽象,为什么要有通道层的抽象?原来是基于无线网关接口,现在基于 Faas,可以把这个 Faas 看成一个本地接口去调,甚至可以把 Faas 上跑的函数看成本地端的函数,这样去调用。

一体化的演进过程:第一步,刚才讲的是一个逻辑下移的过程,把原来端侧的逻辑写到了 Faas 层,这就是逻辑下移的过程。第二步刚才讲的模板是属于 SSR 范畴,属于把渲染下移的过程。最后是远景,把 UI 自动化生成掉。一体化的设想在没用之前业务可能有很多疑惑,到底这种开发模式大家会不会接受、能不能真的带来效率的提升,但是把这个推出来以后,我们有几个业务基于这个去做,效果还是非常不错的,把原来非常重的云端逻辑归一化了,例如下单页的逻辑,客户端下单要算优惠,组件联动,端侧有很重的逻辑,服务端也很重的逻辑,现在下单的业务同学用一体化把这两个逻辑归一在一起,都到 Faas 上解这个逻辑时,就变得可维护性好了很多。

有的同学可能会疑惑一体化后,端上原来可能是有状态的,在 FaaS 上怎么解决端上状态的问题?

这个问题的解法有几个思路,首先对于客户端编程来讲,我们用框架把本地函数和 FaaS 函数统一封装路由,需要访问远程的情况才会路由到远程。另外,基于 Redux 的 Action 方式调用 FaaS,Action 中可以先把客户端完整 State 状态传到 Faas 上,Faas 函数可以知道客户端的完整状态。有一些副作用是请求次数变多,对于这种特殊情况需要注意。

一体化还有一个重要的问题是工程化归一,使开发 FaaS 像在本地工程在写客户端代码一样。工程化归一业界有开源软件 Serverless Framework 可以复用,亚马逊、Google 云在 Faas 层都有 CLI 工具组件,基于开源产品去打通工程一体化就容易一些。

回顾及展望

大概回顾一下今天要讲的内容:

第一,闲鱼选择 Flutter 选择的因素,给大家做参考,闲鱼是在这样几个业务特点:独立 APP、双端一致性要求,苹果用户占比高;APP 中以产品化页面为主。另外,团队组成也是一个重要因素。

第二,闲鱼架构演进过程,从引入期、到发展期、到一体化的探索,每个阶段要去考虑的问题和关键的技术点。

最后,展望接下来要做的:

Flutter 和 Faas 刚刚讲的一体化这块刚刚起步没多久,有一些典型的业务场景落地了,但是还没有大规模的做更多铺开。UI2code 尝试。另外,我们希望把 Flutter 基础设施、基础组件能力开放,能让超大型的 APP 使用。最后,Flutter 的社区生态,要靠大家一起共建和完善。

Q&A

提问:我是一名 iOS 开发者,目前在做跨平台工作。跨平台开发者都知道阿里系有一个相当知名的 Weex,您也提到闲鱼在 2016 年主要业务都是由 Weex 去承载的,我们也有做 Weex 的相关工作,它有能够做到多端同构,你可以自定义一些驱动,甚至部署到小程序上。从 Weex 更符合大前端、一体化的趋势,Weex 在跨平台以及原生平台上都有相当的表现。我的问题是,作为阿里嫡系跨平台优秀的引擎,是什么契机决定让你们闲鱼团队全面拥抱 Flutter?能够给我们一个更好的参考。

回答:这个问题是场景的问题。Weex 跟 Flutter 在跨端、动态性、性能方面的表现,是一个三角形。目前的技术框架都很难把这三要素都解决非常好,比如你刚才说 Weex 很好,能够很完美的解决这三个问题,但其实 Flutter 的关键优势是在性能更好,比 Weex 好。Weex 的优势是它前端的生态和容器的广泛性以及它的动态性。说到底是场景问题,闲鱼 80%是主链路场景,更多是性能这块的考虑,只有 20%是属于外投活动类的,这部分我们用 Weex、H5、小程序做,主链路还是更高性能的选择。杭州那个创业公司例子也是这样的,在 RN 和 Flutter 中选择,最后敲定到了 Flutter 上。确实大家都有这个考虑,还是看自己的场景想取哪方面。

提问:我之前看闲鱼公众号上有 UI2code,想看看你们最新的进展是怎样的,UI2code 在闲鱼 APP 上页面实际使用的占比率大概是怎样的?

回答:我们有个自己内部创业 APP,一个全新的 APP,是用 UI2Code 做的,效果就很好。我个人觉得 UI2code 目前技术水平适合做全新的 APP 或者全新的页面。做老页面最大的问题是修改、合并的问题。所以 UI2code 对全新 APP 页面作用很大,因为那个全部是用这个生成的。目前这个技术更适用这样的场景。

提问:你们用 Weex 差不多是最早的,我们的 APP 也有 Weex。我想问的是你们对 Flutter 兼容 Weex 有相关的技术吗?比如我之前有些业务是 Weex 做的,现在想在 Flutter 中去做,有相关的技术调研吗?

回答:这两个调用的话,其实它们两个是独立的,Weex 如果渲染到 Native 控件,就像标准 Native 跟 Flutter 是一样的。但是 Weex 如果最后降级成 Web View 就变成 Web View 跟 Flutter 的问题,它们其实也是兼容的,现在 Flutter 上用 Web View 也是没问题的,Web View 本质上也是 Native 的,所以最后都会落到 Native 和 Flutter 的关系问题。如果你想做控件极的关联,比如 Weex 写的控件跟 Flutter 写的控件做交互,它们两个可以在同一个页面出现,这样就会比较难,目前无法实现。此外,如果是想让 Flutter 像 Weex 一样有那么灵活的动态性,目前也没有太好的办法。

提问:Faas 那一层是不是相当于把 Server 端数据库的模型转换成前端 View Model 的过程?另外一个问题,Flutter 客户端协同开发是有组件化方案?还是有其他的?比如开发过程中调试的方案是什么样的?Flutter 多业务线同时开发一个 APP,有很多独立的组件,在开发过程中是怎样调试的?比如运行在闲鱼壳 APP 里跑起来,通过什么样的方式能够跑起来?

回答:Faas 是不是指把服务端 DB 数据透出到客户端的这个问题。大概可以这样理解,从业务开发分层角度看的话,有客户端、中间业务胶水层,领域层。胶水层就是把各个领域的接口拿过来组装,组装成页面要的数据,返回给客户端。FaaS 做的是这一层,胶水层。

提问(续):相当于领域那一端接口还是 Server 来维护,最后输出更偏向于 Server 输出的数据,客户端需要配置东西的话需要在这层上再封装一层、组装一层客户端需要的形式?

回答:FaaS 这一层就是上面说的胶水层,以前没有 FaaS 时这一层是服务端同学写的,现在由客户端同学用 FaaS 来写。Faas 这一层可以理解为前端通常说的 BFF 这一层,但实际上会比 BFF 的内容更多些,FaaS 解决的是烟囱式的逻辑,FaaS 的横向间依赖比较少,一个请求进来,向下层拿数据把它组装返回。领域层的区别是它有很多领域与领域间的横向依赖,用的书据存储也非常多,模型复杂,就不适合 FaaS,目前还没有用在 FaaS 上。

提问(续):怎样判断 Faas 具体运行在 Server 端还是客户端?

回答:其实 Faas 都是在 Server 端,只不过有一个基于 Action 的客户端框架,让客户端开发时,本地逻辑和 Faas 逻辑都像写一个函数一样。我们的想法是在 Faas 函数上加一个注解,剩下就都是一样的了,是这样的方向。

提问:我经常关注闲鱼的一些技术文章,您刚才提出两个观点,noUI 和动态模板下发。在 Flutter 中写页面时,有参考 Flutter Design 网站,把所有的组件进行动态拖拽生成静态模板,Flutter 趋势是否可以发展成只关注数据集和业务逻辑,剩下都交给工具集或者工具去做,这样就可以很大一部分解放了 Flutter 写页面的生产力,闲鱼有没有这样的考虑?或者提供这样的编译工具给社区来使用?

回答:这个其实在内部是有用的,但是目前还没有开放出来。你讲的那种方式可能是更多偏工具化的,用工具去生成这样一个页面,它的代码还是 Flutter 的代码。这种方式闲鱼有交集的是 UI2code,确实是直接生成 Flutter 代码,倒也不是拿一个图片完全一下子就生成了,也有你说的拖动过程,要做些修改、属性简单的设置,然后生成 Flutte 页面代码,这块是可以的,但是这块也没有开源。

更多精彩分享

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

Flutter 沙龙回顾 | 如何缩减接近 50% 的 Flutter 包体积

Flutter 沙龙回顾 |  Custom Widgets in Flutter

上海沙龙回顾 | 字节跳动在Spark SQL上的核心优化实践


字节跳动技术沙龙

字节跳动技术沙龙是由字节跳动技术学院发起,字节跳动技术学院、掘金技术社区联合主办的技术交流活动。

字节跳动技术沙龙邀请来自字节跳动及业内互联网公司的技术专家,分享热门技术话题与一线实践经验,内容覆盖架构、大数据、前端、测试、运维、算法、系统等技术领域。

字节跳动技术沙龙旨在为技术领域人才提供一个开放、自由的交流学习平台,帮助技术人学习成长,不断进阶。

欢迎关注「字节跳动技术团队」

相关推荐

2024 抖音欢笑中国年(五):Wasm、WebGL 在互动技术中的创新应用

前言随着 Web 前端技术的不断发展,越来越多的新兴技术方案被引入到 Web 开发中,其中 Wasm 和 WebGL 作为前端领域的两大利器,为开发者带来了更多的可能性。本文将结合2024 年抖音欢笑中国年的部分项目,重点介绍如何利用 Wasm 和 WebGL 对目前流行的一些前端互动技术(比如 Lottie、渲染引擎、动画图片等)进行创新和实践,利用 Wasm 和 WebGL 等新技术方案的特性...

字节跳动技术团队官方博客 2万+

2024 抖音欢笑中国年(四):渲染技术实践与探索

作者:陈瑞、欧阳浩铸、王武俊、倪梵云前言抖音在2024年春节期间推出了欢笑中国年系列活动,为用户带来了全新的体验和乐趣。而SAR Creator则为该项目研发工作提供了重要的技术支持。SAR Creator是一款基于 Typescript 的高性能、轻量化的互动解决方案,目前支持了浏览器和跨端框架平台,服务于字节内部的各种互动业务。这些绚烂多彩的互动场景当然也离不开实时渲染技术的支持,因此本文将专...

字节跳动技术团队官方博客 2万+

2024 抖音欢笑中国年(三):编辑器技巧与实践

前言本次春节活动中,我们大部分场景使用内部的 SAR Creator互动方案来实现。SAR Creator 是一款基于 TypeScript 的高性能、轻量化的互动解决方案,目前支持了Web和字节内部跨端框架平台,服务于字节内部的各种互动业务,包括但不限于抖音春节、抖音直播礼物、抖音UG活动等。SAR Creator 编辑器支持了图形化界面,提供了各类完善的系统(光照、动画、脚本等)供用户快速便捷...

字节跳动技术团队官方博客 1万+

2024 抖音欢笑中国年(二):AnnieX互动容器创新玩法解析

本文基于24年抖音春节活动业务背景,介绍了字节跨端容器AnnieX在游戏互动套件上的探索,致力于提升容器在游戏互动场景的优化能力。业务背景AnnieX作为字节一方游戏统一容器,服务字节内部电商、直播、UG等跨端场景业务。在字节一方游戏互动场景,有大量的一方游戏业务对容器有特定的流量、端能力和游戏优化的诉求。因此我们不断深入互动游戏业务特点,为字节游戏提供完善游戏端能力和流量运营能力,同时提供游戏互...

字节跳动技术团队官方博客 1万+

2024 抖音欢笑中国年(一):招财神龙互动技术揭秘

字节跳动旗下的抖音等 App 在 2024 年春节期间推出了欢笑中国年系列活动,在实现增长业务目标的同时,为用户带来了全新的体验和乐趣。「招财神龙」是其中的一个重要玩法。前言本次春节活动,使用到了字节内的主要前端、跨端、互动技术产品。主要涉及:跨端框架提供了首屏直出的方案使其具有较短的首屏时间,能够大大提升业务加载成功率。跨端框架也提供了 Canvas 作为 SAR Creator 等渲染引擎的...

字节跳动技术团队官方博客 1万+

Monorepo 解决方案 — 基于 Bazel 的 Xcode 性能优化实践

背景介绍书接上回《Monorepo 解决方案 — Bazel 在头条 iOS 的实践》,在头条工程切换至 Bazel 构建系统后,为了支持用户使用 Xcode 开发的习惯,我们使用了开源项目 Tulsi 作为生成工具,用于将 Bazel 工程转换为 Xcode 工程。但是在使用的过程中,我们发现了一些问题,其中影响较大的是,Xcode 工程卡顿:对于头条这种大型项目来说,Xcode 卡顿一直是本地...

字节跳动技术团队官方博客 1万+

抖音 ANR 自动归因平台建设实践

背景介绍本文在 2024 年初最新一期『抖音客户端基础技术大揭秘』技术沙龙活动中已做过专题分享,本次将内容重新整理文章进行分享。公众号后台回复技术沙龙可查看沙龙回放及 PPT~抖音作为一个超大型的应用,我们在 ANR 问题治理上面临着很大的挑战。首先对于存量问题的优化,由于缺少有效的归因手段,一些长期的疑难问题一直难以突破解决,例如长期位于 Top 1 的 nativePollOnce 问题。同时...

字节跳动技术团队官方博客 2万+

CVPR 2024 | CAMixerSR 动态注意力分配的超分辨率加速框架

背景随着相关技术和应用的发展,比如超高清屏幕、虚拟现实(VR)等沉浸式体验的增加,用户对超高分辨率图像和视频的需求变得越来越强烈。在这些场景中,图像的质量和清晰度对于提供最佳的用户体验至关重要。超高分辨率不仅能提供更清晰、更真实的视觉效果,还能在一定程度上增强人们的互动和沉浸感,在一些VR场景中我们需要8K甚至16K的才可以满足需求。然而要生成或者处理这些超高分辨率的内容,对算力的要求也是与日增长...

字节跳动技术团队官方博客 1万+

CVPR 2024 | Modular Blind Video Quality Assessment:模块化无参视频质量评估

无参视频质量评估 (Blind Video Quality Assessment,BVQA) 在评估和改善各种视频平台并服务用户的观看体验方面发挥着关键作用。当前基于深度学习的模型主要以下采样/局部块采样的形式分析视频内容,而忽视了实际空域分辨率和时域帧率对视频质量的影响,随着高分辨率和高帧率视频投稿逐渐普及,特别是跨分辨率/帧率视频转码档位画质评估场景中,这种影响变得更加不可忽视。在本文中,我们...

字节跳动技术团队官方博客 1万+

2024 AI & 前端:回首展望,光芒未至,破晓之前!

前言回望 2023 年,ChatGPT 的突然爆火,让 AI 无疑成为最为值得注目的新兴领域之一,我们也一起见证了生成式 AI 的寒武纪大爆发。这一年来,国内外的生成式 AI 、大模型和相关产品以令人眼花缭乱的速度更新迭代,新的创业浪潮风起云涌。在这 AI 浪潮下,也让我们有了新的开发思考,探索着在各个环节中“前端 & AI”的应用场景。勇于探索的前端开发者们已经开始挥舞着 AI 的“魔法...

字节跳动技术团队官方博客 1万+

Kotlin 云端差分缓存技术

本文由字节跳动 Buildinfra 团队出品。在我们的工程上线 Monorepo 全源码后,Kotlin 编译成了整个编译中最耗时的步骤,全源码过程中大量的 BuildCache Miss 导致我们的编译数据落后原来多仓二进制时代很多,且业界没有相关的解决方案。本篇文章我们来具体阐述下 BuildInfra 团队自研的解决方案 - Kotlin 云端差分方案的原理和技术实现。一、Monorepo...

字节跳动技术团队官方博客 1万+

字节跳动基础架构SRE-Copilot获得2023 CCF国际AIOps挑战赛冠军

近日,2023 CCF国际AIOps挑战赛决赛暨“大模型时代的AIOps”研讨会在北京成功举办,活动吸引了来自互联网、运营商、科研院所、高校、软硬件厂商等领域多名专家学者参与,为智能运维的前沿学术研究、落地生产实践打开了新思路。决赛中,从初赛两百多支队伍中脱颖而出的十支入围队伍分别展示了各自的方案,并进行了现场答辩,评审专家从选题方向、创新性、实用性、完整度和实验复现结果等多角度进行了综合评定,最...

字节跳动技术团队官方博客 2万+

字节跳动百万级Metrics Agent性能优化的探索与实践

背景metricserver2 (以下简称Agent)是与字节内场时序数据库 ByteTSD 配套使用的用户指标打点 Agent,用于在物理机粒度收集用户的指标打点数据,在字节内几乎所有的服务节点上均有部署集成,装机量达到百万以上。此外Agent需要负责打点数据的解析、聚合、压缩、协议转换和发送,属于CPU和Mem密集的服务。两者结合,使得Agent在监控全链路服务成本中占比达到70%以上,对Ag...

字节跳动技术团队官方博客 1万+

西瓜视频RenderThread引起的闪退问题攻坚历程

背景影响西瓜之前存在过一类RenderThread闪退,从堆栈上看,全部都是系统so调用,给人的第一印象像是一个系统bug,无从下手。闪退集中在Android 5~6上,表现为打开直播间立即闪退。该问题在2022年占据Native Crash Top5,2023年更是上升到到Top1。因此有必要投入时间和精力再重新审视一下这个问题。在历经多周的源码分析和排查后,逐步明确了问题根因并修复,最终取得了...

字节跳动技术团队官方博客 2万+

字节电商双11 大促容量保障是如何做的?

前言Rhino 简介Rhino是字节自研全链路容量评估产品,致力于构建完整的全链路容量评估解决方案(覆盖:容量预估->资源准备->数据准备->容量验证->监控->分析->决策->处理反馈);围绕容量在稳定性、成本、效率 三方面提供业务全方位基础支撑。Rhino 目前已经成为字节各业务容量评估主流解决方案,并且历年来在业务大型活动稳定性保障中(抖音春节项目、...

字节跳动技术团队官方博客 10万+

使用火山引擎 APMPlus 解决抖音Top 1 Java 崩溃的通用优化方案

背景近3个月,抖音 Android 版面临一个多次触发线上报警的崩溃问题,全量版本和灰度版本的异常数据激增,该问题不仅容易触发报警,更成为了 Java Top 1 崩溃问题,带来巨大困扰,急需攻坚解决。本文展现了具体的分析过程、优化思路和解决方案,同时提供了已集成该方案的实用工具。初步分析多维特征我们以某发版期间数据为例进行分析:机型方面:比较分散,有聚集部分samsung sm-s9180 占比...

字节跳动技术团队官方博客 2万+

用 Addon 增强 Node.js 和 Electron 应用的原生能力

前言Node.js Addon 是 Node.js 中为 JavaScript 环境提供 C/C++ 交互能力的机制。其形态十分类似 Java 的 JNI,都是通过提供一套 C/C++ SDK,用于在 C/C++ 中创建函数方法、进行数据转换,以便 JavaScript / Java 等语言进行调用。这样编写的代码通常叫做 Bindings。此外还有基于 C ABI Calling Convent...

字节跳动技术团队官方博客 2万+

火山引擎 ByteHouse 的增强型数据导入技术实践

作为企业数字化建设的必备要素,易用的数据引擎能帮助企业提升数据使用效率,更好提升数据应用价值,夯实数字化建设基础。数据导入是衡量OLAP引擎性能及易用性的重要标准之一,高效的数据导入能力能够加速数据实时处理和分析的效率。作为一款OLAP引擎,火山引擎云原生数据仓库ByteHouse源于开源ClickHouse,在字节跳动多年打磨下,提供更丰富的能力和更强性能,能为用户带来极速分析体验,支撑实时数据...

字节跳动技术团队官方博客 1万+

打造企业级智能问答系统的秘密:如何使用云数据库 PostgreSQL 版实现向量检索

本文就如何利用火山引擎云数据库 PostgreSQL 版和大语言模型技术(Large Language Model,简称 LLM),实现企业级智能交互式问答系统进行介绍。通过本文,你将会了解交互式问答系统的原理,学习 PostgreSQL 的向量化存储和检索技术,以及大语言模型交互技术等。背景在大数据的浪潮下,众多企业建立了自己的知识库,以便于信息检索和知识查询。然而,随着知识库内容的膨胀,传统的...

字节跳动技术团队官方博客 2万+

抖音大型直播的画质优化实践

面临挑战随着抖音内容生态的不断丰富,越来越多的大型赛事在抖音平台进行直播,世界杯/春晚/亚运会等各项赛事节目引来大量用户观看。卡塔尔世界杯期间,抖音提供的稳定高质直播画面为观众带来了完美的观赛体验,决赛的 PCU 高达 3700W+。不同赛事节目涉及链路众多,且不同赛事之间存在差异,如何保障各链路的画质稳定并进一步提升画质,是一个巨大的挑战。如何应对挑战?画质优化链路大型赛事直播涉及链路较长,不同...

字节跳动技术团队官方博客 2万+

抖音直播新一代BVC编码器正式亮相

面临挑战在直播行业发展如火如荼的今天,用户对视频体验的要求也水涨船高。视频基础体验的关键要素包括清晰度、流畅度、低延迟等,而这些要素的“第一性原理”,就是视频本身的编码效率,也就是压缩率。视频编码是整个技术体系的基座,编码效率的显著提升,能够在同等码率下极大提高画质,从而改善用户体验。视频编码效率的重要性不言而喻,但进一步地提升也并非易事,尤其在直播场景中,对编码速度、延迟、码率控制等方面都有很高...

字节跳动技术团队官方博客 7356

Go Metrics SDK Tag 校验性能优化实践

背景Metrics SDK 是与字节内场时序数据库 ByteTSD 配套的用户指标打点 SDK,在字节内数十万服务中集成,应用广泛,因此 SDK 的性能优化是个重要和持续性的话题。本文主要以 Go Metrics SDK 为例,讲述对打点 API 的 hot-path 优化的实践。用户在使用 SDK API 进行打点时,需要传入指标对应的 Tag:tags:=[]m.T{{Name:"foo...

字节跳动技术团队官方博客 1万+

云上智能驾驶三维重建最佳实践

智能驾驶技术的不断发展,正在改变着我们的出行方式和交通系统。作为其中的一个关键技术,三维重建在智能驾驶系统中起着重要的作用。除去车端本身的感知、重建算法,自动驾驶技术的落地与发展需要庞大的云端重建能力支撑,火山引擎多媒体实验室通过行业领先的自研三维重建技术,结合强大的云平台资源与能力,助力相关技术在云端大规模重建、自动标注、真实感仿真等场景的落地与应用。本文重点介绍火山引擎多媒体实验室三维重建技术...

字节跳动技术团队官方博客 6305

火山引擎实时、低延时拥塞控制算法的优化实践

摘要火山引擎智能拥塞控制算法 VICC(Volcano Intelligent Congestion Control)是一种自适应的拥塞控制算法,旨在解决全球不同网络环境下,不同音视频应用对带宽利用率和延时的差异化要求。它结合了传统拥塞控制算法(如 GCC 和 BBR)的优点,并且能够根据不同的网络条件、业务偏好和码率特征进行自适应调整,包括自适应拥塞响应速度、自适应带宽探测幅度、自适应丢包检测策...

字节跳动技术团队官方博客 6735

veImageX 演进之路:Web 图片加载提速50%

背景说明火山引擎veImageX演进之路主要介绍了veImageX在字节内部从2012年随着字节成长过程中逐步演进的过程,演进中包括V1、V2、V3版本并最终面向行业输出;整个演进过程中包括服务端、客户端、网络库、业务场景与优化等多个角度介绍在图像处理压缩、省成本与体验优化的经验与方案;本篇文章重点介绍在web端演进和提供的能力,图片是 Web 站点中的重要元素,图片体积、格式、分辨率以及渲染方式...

字节跳动技术团队官方博客 6589

自研多模态追踪算法 PICO 为「手柄小型化」找到新思路

作者:张韬、林泽一 、闻超 、赵洋研发背景作为头戴的追踪配件,VR手柄可以通过HMD(头戴显示设备)的inside-out光学追踪定位原理,计算出手柄的空间运动轨迹,同时结合6轴传感器实现6DoF空间定位。与此同时,结合手柄控制器的物理按键、马达反馈、摇杆等,用户还能获得逼真、细腻的触觉反馈,进一步增强虚拟现实人机交互的能力以及沉浸感,这也是目前无手柄方案所难以实现的。目前主流VR手柄的追踪技术方...

字节跳动技术团队官方博客 7819

如何利用播放器节省20%点播成本

点播成本节省的点其实涉及诸多部分,例如:CDN、转码、存储等,而利用播放器降本却是很多客户比较陌生的部分。火山引擎基于内部支撑抖音集团相关业务的实践,播放器恰恰是成本优化中最重要和最为依赖的部分。火山引擎的视频团队做了份数据统计,在一个很经典的视频业务中,我们在2022年至2023年大约1年半的时间里,针对这个业务进行了33次成本优化点,其中13次是播放器主导的优化,其余的有12次也是需要播放器强...

字节跳动技术团队官方博客 6176

火山引擎 ByteHouse:ClickHouse 如何保证海量数据一致性

背景ClickHouse是一个开源的OLAP引擎,不仅被全球开发者广泛使用,在字节各个应用场景中也可以看到它的身影。基于高性能、分布式特点,ClickHouse可以满足大规模数据的分析和查询需求,因此字节研发团队以开源ClickHouse为基础,推出火山引擎云原生数据仓库ByteHouse。在日常工作中,研发人员经常会遇到业务链路过长,导致流程稳定性和数据一致性难保障的问题,这在分布式、跨服务的场...

字节跳动技术团队官方博客 6900

抖音集团都在用的画质评估工具,确定不试试吗?

导读本文从抖音集团内部画质评估体系的建设历程着笔,主要分享了画质评测对于业务的重要性、主要应用场景和内部产品的一些典型实践案例。通过分享业务视角遇到的一些问题和我们的解决思路,希望能抛砖引玉,为遇到类似困扰的伙伴们提供有价值的参考。画质评估体系建设历程为何评测画质如此重要?我们通过线上业务大量实验发现,图片画质优劣对点击率、 停留时长等消费类指标有正相关影响,间接影响用户收益指标。因此,建设一套行...

字节跳动技术团队官方博客 7940

VLDB 2023 | CDSBen: 字节跳动 veDB 数据库存储系统性能测试模型

背景随着业务爆炸式增长与云原生技术的日渐成熟,大量云原生分布式数据库产品如雨后春笋般涌现,其中一部分主打 OLTP 场景的分布式数据库强调的是从计算-存储分离架构获得弹性收益;对于业界各种计算-存储分离架构的数据库而言,怎么用真实的端到端数据库 workload 去 benchmark 其底层存储系统一直存在以下难题:对于数据库专用存储系统,不存在如 fio 一样的“事实标准” benchmark...

字节跳动技术团队官方博客 5896
上一篇: Flutter 沙龙回顾 | Custom Widgets in Flutter
下一篇: 字节跳动 EB 级 HDFS 实践
 字节跳动技术团队
字节跳动技术团队 企业官方账号 企业官方账号
博客等级 码龄7年 8153粉丝 316原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值