字节跳动技术团队 2024年11月04日
BlockFramework —— 客户端模块化业务开发框架
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

BlockFramework是西瓜视频团队研发的一套客户端业务开发框架,旨在解决大型APP中多业务团队协同开发的问题。它通过业务分层、组装和协同能力,帮助业务方实现业务解耦,独立迭代,提升架构稳定性和开发效率。该框架具有清晰的业务解耦机制、高性能的UI组装能力、丰富的通信机制和统一的开发范式等特性,能够有效降低代码复杂度,提升人效,并优化页面性能。BlockFramework已经在西瓜视频等多个核心场景中应用,并推广到字节系多个产品,取得了良好的效果。

🍉**清晰的业务解耦机制**:BlockFramework将业务逻辑拆分成独立的Block,实现代码物理隔离,开发者可聚焦于自身业务,提升开发效率,并支持Block跨场景复用,降低维护成本。

🚀**高性能的UI组装能力**:基于树状结构搭建界面UI,完美适配Android系统布局树,通过构建Block父子关系轻松搭建复杂页面,并集成异步inflate、异步View创建等优化手段,提升页面性能。

💬**丰富的通信机制**:提供Block之间多种通信方式(一对一、一对多、多对一),通过接口抽象、事件订阅/分发,保证Block独立性和复用性,并结合树形结构约束通信路径,方便分析Block依赖关系。

规范的开发范式:提供标准规范的接入和开发流程,建立统一的开发认知,降低跨线研发成本,提升整体研发效率。

原创 周俊杰 2024-11-04 17:58 重庆

良好架构是大型APP共同开发的支撑。BlockFramework是西瓜视频团队研发的一套客户端业务开发框架,具备业务分层、组装以及协同的能力,业务方基于此框架能够轻易实现业务解耦,独立开展逻辑迭代,从而提升架构的稳定性。

在大型 APP 的开发进程中,多个业务方向或团队共同开发同一页面的现象屡见不鲜。倘若没有良好的架构作为支撑,各业务之间的逻辑极易相互耦合,进而致使架构迅速恶化,这无疑会使业务开发与维护的成本增加。BlockFramework 作为一套客户端业务解耦框架,具备业务分层、组装以及协同的能力,业务方基于此框架能够轻易实现业务解耦,独立开展逻辑迭代,从而提升架构的稳定性,降低维护成本,并提高业务迭代的效率。BlockFramework 主要有 4 大特性:

BlockFramework已经在Github开源,欢迎大家多多支持。开源地址:https://github.com/bytedance/BlockFramework 

Block是BlockFramework的基本构成单元,一个复杂页面可由多个Block组装而成。Block支持UI配置,与安卓View树结构完美适配,能够渲染各种不同的场景;同时Block拥有独立的,各Block可以单独通过网络获取数据、渲染视图等等。

树状管理机制

Block按照树形结构进行组装和管理,一个场景对应一颗Block树,树形结构的好处在于:

 Block提供了方式进行组装,业务方能直观的看出各Block之间的父子关系:

override fun assembleSubBlocks(assembler: BlockAssembler) {    assembler.assemble {        addBlock {            instance = {                MainContentBlock(blockContext)            }            parentId = R.id.main_content_block_container        }        addBlock {            instance = {                BottomInfoBlock(blockContext)            }            parentId = R.id.bottom_info_block_container        }        addBlock {            instance = {                RightInteractBlock(blockContext)            }            parentId = R.id.right_interact_block_container        }    }}

生命周期管理

Block本身是一个生命周期单元,遵循Jetpack LifeCycle组件的生命周期节点设计,即onCreate() -> onDestory(),开发者能够快速上手,同时易于对老场景进行迁移。

open class BaseBlock<DATA, MODEL : IBlockModel<DATA>>(val blockContext: IBlockContext) : AbstractLifecycleBlock() {
open fun onRegister() {} override fun onCreate() {} override fun onStart() {} override fun onResume() {} override fun onPause() {} override fun onStop() {} override fun onDestroy() {} override fun onUnRegister() {}
}

「Block UML设计图」

在业务场景中,不同的业务模块经常需要通信,如处于不同模块的视图需要根据用户操作发生一些联动。在这些情况下,如果让模块与模块直接进行依赖,就无法避免模块之间的耦合,这样既无法保证模块的独立性,也影响可复用性。因此,Block框架基于SPI协议和观察者模式实现了一套通信机制,各Block通过发现服务和广播通信,能够有效降低Block之间的耦合。

Block组内通信

Block通过一套MessageCenter机制实现内部通信,主要包括两种形式:

 「Block通信范式树形结构约束」


Block组间通信

Block内置了不少高性能特性,相较Android原生的页面构建机制,BlockFramework提供了异步组装View异步数据绑定等多个优化手段,旨在更为极致的渲染页面。

异步组装View

Block支持将复杂页面拆分一个个小单元,每一个小单元可对应一处简单UI结构,如果不做优化,这个Block在inflate和组装View时会默认在主线程执行,而实际上,由于每一个Block的View都是独立进行inflate,因此,可以各Block的View创建的过程切换到子程序异步进行,完成后切换回到主线程组装View,相较于整体在主线程创建View耗时更短,经过对比分析,异步组装View能缩短约20%的耗时。

异步数据绑定

Block提供了异步数据绑定逻辑,支持开发者将耗时逻辑放到子线程执行,并提供了切换回主线程的回调,让开发者更方便的执行耗时逻辑。

override fun bindModel(model: MODEL?) {    if (enableAsyncBind()) {        syncBind(model)        Executor.work().post {            asyncBind(model) {                Executor.main().post {                    it.invoke()                }            }        }    } else {        syncBind(model)        asyncBind(model) {            it.invoke()        }    }}

BlockFramework是西瓜视频团队从业务中沉淀出的组件,经过不断地完善和迭代,目前已经成为西瓜视频详情页、横屏内流、Feed列表、Feed卡片、业务播放器等多个核心场景的底层架构基础,经过验证,BlockFramework在性能和效率上都取得不错的收益。后续我们会在更多的业务场景落地,同时在性能和架构上进一步优化。此外,BlockFramework已经推广到字节系多个产品,尤其在西瓜鸿蒙版、鲜时光、抖音精选上均得到广泛认可和应用。

希望大家多多支持我们的开源项目BlockFramework,也欢迎大家多提意见,互相交流客户端架构方面的经验与心得。


跳转微信打开

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

BlockFramework 客户端开发 业务解耦 架构设计 西瓜视频
相关文章