1、百度App移动端程能演进及Tekes研发体化平台型App架构和程能的挑战业务规模大:百度App技术方向及子方向70+,单端代码量230w+;团队规模大:团队快速发展, 有代码权限的近千人;/质量控制,编译速度/大规模并行开发接入业务多:30+(合并提供方后),非单纯基础库,与百度App关系复杂;迭代速度快:3周一个版本,2周开发1周测试;/架构支撑与集成能力/控制劣化技术形态多:H5、NA、Hybrid、Talos、Flutter技术共存;目标多样性:矩阵产品孵化复用,小程序开源复用,性能、体积等开发指标/保障基础能力复用/复用孵化能力,量化性能架构的利益相关者和关注点控制架构整体复杂度保障并
2、行开发效率提升编译速度等研发流程效率百度App RD确保单个模块的故障影响范围内敛到自己内部,不会引发整体crash处理接入业务与百度App的关系快速集成与调试能力稳定成熟的对外能力百度AppQA接入业务方问题快速定位发现利益相关者(stakeholder),并解决他们的关注点(concerns)启动速度、体积等指标可以以组件为单位量化最大程度复用最低成本组装最低成本升级矩阵团队(看多多、柠檬爱美)性能团队三方库规范性,便于宿主版本抉择基础库规范化,不与宿主工程撞库服务组件可替代性小程序团队研发效率 复用组装 劣化防控四个:EasyBox综合解决案Tekes研发体化平台程架构拆分矩阵产品孵化组
3、件化多仓库 + 二进制化自动化发布 + 防劣化产品线孵化程架构拆分程拆分法-百度App整体架构主工程(主版,矩阵)组件化-并行开发启动器(各组件初始化)容器加载器(加载UI)中央仓库配置表容器化、组件化、分发、数据拆分框架业务组件模型业务组件化推动全面组件化服务组件沉淀主工程壳化基础业务搜索浏览互动评论消息垂类说动漫服务桥接Feed反馈图集视频志络视频业务组件搜索建议TTS平台化技术组件业务撑组件业务支撑&平台化技术层组件化-保障复用Talos(RN)H5/Hybrid程序热修复CommonPlayer.基础库体系化约束边界及依赖治理各服务组件多产品线支撑媒体服务Web服务视图服务组件化/分发
4、/数据拆分框架基础服务监控服务数据与增服务服务层志PyramidSchemeRouterCocoaSetting账号分享卡顿监控公参定位RemoteConfigCrashABTestEasyBox-劣化防控编译隔离层级反向访问限制多仓库代码权限隔离基础库层基础类库UI组件库UI容器图查看器络库加解密库数据持久化三方库层 开源网络库动画库解析器解压缩库数据库缓存Tekes-劣化防控Android/iOS Application Framework依赖、接口劣化监控架构层级设计广义组件化框架程架构拆分-义组件化框架标:通过分发/拆分/隔离及容器化机制解耦,保障并开发能,统管理整体复杂度。Pyram
5、id功能:SchemeRouter功能:依赖注入、系统事件分发、组件生命周期管理、组间通信H5与NA的端能力调用与分发、服务端动态入口(个人中心、Feed流进落地页)下发作用:对外输出组件依赖服务实现可替代性。提升接口稳定性与成熟度。1对1解耦升级为1对多解耦,提升解耦效率。作用:分发及重定向机制减少依赖与交叉依赖;自注册机制减少输出适配成本。CocoaSetting(iOS)RemoteConfig/资源分发/预取数据分发功能:功能:负责服务端配置数据、资源、预取数据分发。数据解析、存储、解耦与访问一体化分层管理ABTest/Update/UserSetting/Debug数据监听数据变更。
6、作用:通过分发机制降低耦合,保障业务组件资源、数据各有归属。作用:数据集中管理升级为分散管理,各有归属;存储解耦、降低多数据源访问复杂度。程架构拆分-组件化实现路径架构层级设计:合理层级归属,并禁反向依赖;保障底向上的输出复能。12345678三库标准化:标准化,避免对外不同宿主为不致,以及便宿主版本抉择。基础库体系化:避免交叉依赖与对外输出撞库。组件化框架:容器化、分发机制、数据拆分、依赖注框架。服务组件沉淀:多业务复的账号、分享、云控等组件。业务组件化:在有明确的功能定位前提下,逻辑、资源、数据各有归属。有明确的逻辑与接边界。主程壳化:主程仅保留App初始化、容器加载、系统事件分发逻辑。劣
7、化防控机制:架构约束机制,禁下层组件访问上层组件;并明确横向可访问域。百度App程拆分收益可量化部分:55% 90%+5人周 1人周极速版复用率小程序开源输出复用率矩阵同步主线时间不可量化部分: 研发效率提升:体现组件复杂度内敛;组件化框架对并开发的保障;各组件、各技术形态基础能力复。 质量上:组件化、容器化、数据拆分框架具备设计时的隔离性,确保单个组件的故障影响范围内敛到组件内部。 中台化:支撑Feed、发布器、评论等组件中台化输出到西番、柠檬爱美、看多多等产品线。 架构统一:双端统一架构,统一技术方案,降低横向工作项目管理与推进成本。 性能、体积量化单位:逻辑单元、编译单元、资源与数据管理
8、单元、组件是启动速度、体积等指标的量化单位。程拆分没有解决的问题单一仓库的问题全源码的问题IDE问题代码评审权限管理:团队规模快速增长(含合作团队近千人),仓库评审人太多导致代码质量不可控。 编译速度:慢,全量1520分钟/次。 矩阵组装:矩阵产品手动组件依赖管理和组装成本高。 二进制复用:组件没有发布二进制版本机制,矩阵产品难以以二进制方式复用。 架构升级:手动架构调整(组件粒度拆分,架构层级调整)成本高。 合并成本(iOS):IDE通过工程文件组织编译链接,多人协作工程文件合并成本高。 上车排队:排队上车(合并到master)速度慢问题。 组件复用:多产品线单组件粒度仓库粒度源码复用问题。
9、 接入业务支持:接入业务开发模式,壳工程需人力持续支持问题。EasyBox综合解决案EasyBox综合解决案产品线-中央仓库百度代码托管平台进制版本托管平台NexusRemote.spec Overlay.spec Local.specFeed10.111.111.2Feed sourcealbumsourcealbumbrowsercomment 11.3em多仓库管理二进制管理构建系统source.spec bin.specFeed sourcebrowser 11.2album sourcecomment 11.3feed.gitcomment.bin工程组装器comment.binsp
10、ecpublic_headers = resources = dependencies = libraries = feed.specpublic_headers = resources = dependencies = libraries = sources = version = “11.3”commit id=EasyBox综合解决案-多仓库同步、源码/进制映射源码Feed.git Search.git MNP.gitService.bin Service.bin二进制feature_branch_xfeature_branch_xfeature_branch_xfeature_bran
11、ch(同名分支原则)V11.8V8.0多仓库快照二进制版本号/commit id映射快照commit id:xxxxxxxcommit id:3310022commit id:579bedasearch_579beda.acommit id:1a9f7a8mnp_1a9f7a8.acommit id:3b87f0ffeed_3b87f0f.a源码Service.gitService.git多仓库源码同步:同名分支原则二进制同步:版本号与源码commit id映射计值EasyBox综合解决案-理想态-全量进制引实现路径Overlay.specfeed/branchPyramidAppbin11.
12、011.7mastermasterBBAComponents binBBAFeed.gitBBAFeedBBATTSsource feed/branchsource feed/branchfeed/branchBBAServicesBBABasicsbinbin11.511.0BBATTS.git 开发测试结束,合回master 按需配置使用源码的仓库feed/branchmasterRemote.specApp.git中央仓库Remote.specOverlay.specPyramidApp11.8PyramidAppbin11.811.8PyramidAppBBAComponents 11
13、.811.8.xxx11.8BBAComponents 11.8BBAComponents bin 手动发布BBAFeedBBATTS11.811.811.811.8BBAFeedBBATTSsource mastersource master11.8.xxx11.8BBAServicesBBABasicsBBAServicesBBABasicsbinbin11.811.8BBAServicesBBABasics11.8开发测试结束,中央仓库合回master(本地) 起始态- 远程中央仓库全量二进制版本引用改造 远程(准入)升级中央仓库引用版本研发模式升级EasyBox综合解决案 - 常问题-
14、为什么不?为什么不用Repo?iOS为什么不用CocoaPods? 多仓库同步策略: 强化同名分支原则。 易用性考虑: 比如仓库状态的合并展示,单端仓库300左右。 操作命令和单仓库一致。 容错机制。实现编译隔离,包含:架构层级反向依赖控制。明确依赖和可访问范围。去工程文件化:借鉴Facebook buck思想,去工程文件化,降低工程文件合并成本,。支持多仓库管理,以及多仓库组提交。源码/二进制切换开发模式。资源编译预缓存。EasyBox综合解决案的收益可量化部分:46.4%70.3%-85.8%原来的1/8原来的1/3 10条优化后时间:1分38秒-2分18秒小时级-分钟级发版前合并到mas
15、ter排队耗时编译速度并行上车率上车耗时输出产品线数不可量化部分: 矩阵产品复用:矩阵产品(看多多/Lite版/西番/医美)可以组件仓库粒度源码复用,具备App生产线能力。 百度App开放性:百度App RD与接入业务RD研发模式逐步统一;减少合作过程中壳工程支持时间。 百度App现代化:工程组装效率提升;组件外部依赖明确可监控,依赖管理效率提升。 架构升级灵活性:灵活性提高,架构调整(组件粒度、层级调整)复杂度和成本大幅降低。程拆分和EasyBox综合解决案没有解决的问题工程拆分EasyBox其他没有组件依赖、接口劣化的监控平台,高速迭代过程中的劣化难以量化跟踪。 手动发布问题:成本比较高,
16、且不安全。遇到问题不可追溯。没有接入业务自动化准入平台。没有研发流水线的体系化和自动化的整合。早期只支持基础库的发布,服务组件/业务组件没有正式的二进制版本号,矩阵产品难以按二进制版本复用。Tekes研发体化平台Tekes研发体化平台-名称由来特克斯县(Tekes County)是新疆维吾尔自治区伊犁哈萨克自治州下辖县,因八卦布局而闻名。八卦城呈放射状圆形,是国内唯一没有红绿灯的城市,城内路路相通、街街相连,传说从来不堵车。借此寓意,标:提升超级App及孵化产品全流程研发效率;管理多产品线从组件管理、准入、性能监控、发布、线上问题跟踪、服务运营以及数据支撑等全流程服务,并支持产品线生产能力 。
17、Tekes-流线-组件动发布准上车 = 合主仓库master分支 + 发布 + 准入RD iCode Tekes Agile Nexushi: geton排队notify说明:允许上远程master/release分支引用的永远是组件的二进制版本。当子仓库代码推送到远程master分支,触发自动发布、准入流程。为简化流程,iCode也代表CI-Hook排队、通知系统通过HI公众号通知系统实现。发布:基于合入到master分支的源码生成组件二进制版本(1或多个)。EasyBox合流调mgit push库上阶段(master)发布组件准入:修改中央仓库引用,引用上一步骤中发布的二进制。notify
18、存储发布结果动准库度notify准结果hi: done离队iCode:百度源码托管平台 Agile:百度持续集成平台 Nexus:二进制托管服务自动化Tekes-完善流线目标:整合研发全流程流水线,自动化控制高速迭代下,接口、依赖、体积、启动速度等质量劣化问题。Feed.a/.aarRepo:FeedAlbum.a/.aarRepo:AlbumRepo:EBrowserEBrowser.a/.aar.a/.aar准报告单测准体积准组件化准启动速度准Repo:.a/.aar多仓库组合进制发布产品线准合入检查流水线:组件化准入:单测流水线:体积、启动速度流水线(非阻塞任务):编码规范(已有)接口变
19、更单测覆盖率是否通过二进制发布:comit log规范: 双端统一发版、安全等扫描依赖(含循环依赖)Warning添加发布日志、tag/version各组件体积增量各环节启动速度增量接口与版本号规范(semver)Tekes-劣化防控接口变更依赖信息及时发现劣化问题,通过通知系统反馈给RD,并生成报告。Tekes平台-整体架构Tekes前台发布准入历史文档中心产品线管理产品线与组件关系组件详情技术栈:VUE+BootstrapNexus(Maven)通知系统任务调度系统组件版本历史管理权限管理二进制容灾备份组件信息管理上车管家后台账号系统卡顿监控服务.Tekes后台多产品线管理个人任务管理技术
20、栈:Redis+ORM+BeegoApp生产线CI系统发布Merge流水线(触发源码二进制转换流程)准入JobiCode组合入(减少多仓库编译错误)全源码Job(二进制/源码同步)(自动升级中央仓库组件引用版本)(Agile/iCode/CI-Hook)技术栈:Python/Shell中央仓库Change Hook(主要获取产品线与组件关系)各子仓库Change流水线(接口与版本号规范检查)性能准入流水线(性能、体积准入检查)接入SDK自动化准入(Pass、IM等30+)LFS(与Nexus系统通信)EasyBox多仓库管理构建系统技术栈:Ruby产品孵化模式Teke开发者平台注册App中央仓
21、库-手百中央仓库-看多多二进制组boxapp sourceKandd source23456注册对应云服务ugc11.311.3album10.12发布/准入通知系开发云 者服 接务 入平albumbrowser 10.12comment 10.12cuidsdk 8.6.5browser 10.12comment 10.12接EasyBox具链单组件版本依 组件池组件选接口依赖劣台中台化组件库(源码/二进制)构建App组件信息多产品线EasyBox工具链(多仓库管理+发布产物管理+构建系统)接Tekes研发体化平台Tekes-主要收益可量化部分:70.3%-85.8%上车阶段编译速度不可量化部分: 组件二进制版本规范:矩阵产品二进制复用基础。 研发模式统一:百度App RD、矩阵产品RD、接入业务RD研发模式完全统一。架构和工具链具备开放性。 编译成功率:快照+多仓库组合入功能,编译错误率降低。 接口依赖劣化监控:避免组件复用能力在高速迭代过程中劣化。 多产品线:研发模式复制到多产品线。总结通过组件化完成程架构拆分通过多仓库、进制化完成各环节研发效率提升通过Tekes动发布准机制保障研发流程效运转及劣化防控通过 组件化+EasyBox+Tekes 完成产品线孵化