高德客户端及引擎技术架构演进与思考

2019杭州云栖大会上,高德地图技术团队向与会者分享了包括视觉与机器智能、路线规划、场景化/精细化定位、时空数据应用、亿级流量架构演进等多个出行技术领域的热门话题。现场火爆,听众反响强烈。我们把其中的优秀演讲内容整理成文并陆续发布出来,本文为其中一篇。

2019杭州云栖大会高德技术专场讲师系列:

《视觉智能在高德地图的应用》

《高德在提升定位精度方面的探索和实践》

《高德亿级流量接入层服务的演化之路》

阿里巴巴高级无线开发专家宋照春在高德技术专场做了题为《高德客户端及引擎技术架构演进与思考》的演讲,主要分享了高德地图客户端技术架构沿着「上漂下沉」、「模块化、Bundle化」的思路演进所做的一系列架构升级中的经验和思考。

以下为宋照春演讲内容的简版实录:

主要分享三个方面的内容:

  • 融合
  • 架构治理
  • 动态化

一、三管齐下 深度融合

高德最初有两个端,车机版的高德导航,手机版的高德地图,两个团队,一个是2B,一个是2C,分别是汽车业务和手机业务。当时在引擎/技术上,分为离线引擎和在线引擎,但两个团队之间交流比较少,各自有自己的研发、产品和测试,而作为一款端上的APP,两块业务都需要有地图渲染、路线规划、导航以及定位等通用能力。从公司层面看,存在较大的重复建设,整体研发效率较低。

于是我们做了一件事:利用技术手段,打通端上引擎,打造一套能同时支撑多端的APP能力。具体到执行层面,先从A团队拉一部分人到B团队一起建设,建设完之后再从B团队拉到A团队。在同时支撑好主线业务发展的情况下,通过一年左右时间,完成了引擎上的融合,做到同时支撑手机、车机以及开放平台。

这样就从引擎的维度,实现了渲染、定位、规划和引导的统一。具体来说,我们的各大引擎有好多套代码,好几个开发团队,每个团队有各自的开发方式和开发环境(Linux,Windows,Mac OS)。各种开发环境,工程配置文件大量重复,修改非常繁琐。

为此,我们通过两种方法:

1.建立了一套构建系统Abtor,通过一个配置系统实现统一构建,能够同时支持多个子引擎,在构建集成效率上得到了很大的提升;

2.对基础库进行了整体重构,形成了一套涵盖了文件I/O、KV存储、多线程框架&异步框架、归档、基础容器等一系列标准能力的基础库,同时也做了引擎核心架构的统一。 

二、架构治理

通过引擎的融合同时支持多端,在研发效率上实现比较大的收益。而通过技术的抓手来实现团队的融合,对公司发展而言,这其实是更大的收益,团队融合的意义在于人才拉通和复用,组织效率得到了较大提升。

随着高德业务的快速发展,业务上持续扩品类,需求量激增,高德地图从最初的驾车导航,到后来的步行、骑行、摩托车导航等等,App所承载的业务发展非常快,而原有的架构治理模式的问题也逐渐暴露出来。

首先就是App的代码规模变得特别大。当时一个仓库达到了10G以上,由此导致的一个典型的问题就是编译慢,编译出一次安装包需要一个小时。伴随代码规模的另一个问题是团队规模快速增长。代码增长和大团队并行开发,最终导致合版慢,每次迭代,客户端合版需要2天。

代码膨胀导致的架构腐化问题特别突出,所以测试质量以及线上的质量有段时间也比较差。此外,从产品提出需求到上线,平均需要45天,版本迭代周期很长。

为解决以上架构问题,我们采取了三个手段:升级Native基础组件,搭建Native容器和页面框架,Bundle化分拆(微应用)。

下面重点介绍下页面框架和微应用。

页面框架主要借鉴和融合了Android和iOS的生命期管理机制。从高德地图App架构看,下层模块是一套标准地图,所有上层业务都要基于地图模块开发。为确保上层业务低耦合、一致性,我们设计了一个页面框架。

如上图,左边的Activity是Android的系统页面控制器,右边的UIViewController是iOS的系统页面控制器,通过虚线连接比较,我们发现两端的页面状态设计基本相同。

所以,我们在设计自己的页面框架时沿用了这些系统页面状态,同时从命名上也保持一致,这样可以让Android和iOS原生开发的同学更容易理解和上手。

我们吸取了双端各自的优点。比如,Android端页面有四种启动模式,但是iOS 端并没有这些,我们就把Android的四种启动模式运用到了iOS端;iOS端有Present特性,但是Android端没有,那么也把这种特性融合到Android端的页面框架中;最后,还有一些小设计,比如Android的onResult设计,也可以借鉴融合到iOS端。

此外,我们还做了微应用,所谓微应用,首先是模块化,就是把大模块仓库大模块拆成一个个小的Bundle,除了实现模块化,还主要实现以下几个目标:

粒度:以业务为单位,以业务线为分组

编译:二进制级别的产物,可独立编译、出包时链接

依赖:松耦合,以“服务”为导向,不关心模块归属

而Native容器层面,要实现四个核心目标:路由管理、服务管理、UI生命期管理、微应用管理。

通过一年时间的Bundle化改造,高德地图单端App完成了300多个页面的建设,拆分了100多个Bundle。

从收益来看,总编译时间从原来的60分钟降低到了8分钟,合版周期从原来的3天降到1天,需求上线周期降到了1个月以内,线上质量和测试质量都得到了极大的提升,崩溃率从万分之八降低到十万分之八。

三、动态化

随着高德地图业务发展沿着扩品类、在垂直品类做精做细,景区、酒店、银行商铺、充电桩等个性化定制需求凸显,对前端展现提出了更高的要求,对“快速应变”要求也更高了。

实际上,在2015年,高德就开始做动态化。最早的时候业内就有React Native,团队做了技术调研,发现不能完全满足业务上的需要,尤其是性能方面。最后我们决定自研一套动态化技术。

具体来说,就是通过一个核心C++引擎,把两端业务(Android、iOS)用一套JavaScript代码解决,实现双端归一,Android实现业务动态化发布。

架构层面,最下面是高德App核心的地图引擎,我们在上面搭建了一套动态化应用引擎,通过C++来实现。应用引擎的作用是为了承上启下,上面承载动态化业务,下层完成地图引擎的直接打通。众所周知,GUI的核心是DOM树,所以应用引擎不但要实现和JavaScript引擎的整合,还要负责DOM树的核心逻辑计算。

其次,动态化的技术和前端Web技术一致:样式、布局。应用引擎负责完成样式的布局计算、DOM树Diff、事件生成。而GUI的绘制,通过Diff事件,交由原生的Android以及iOS去完成。这样,所有的GUI都是原生的组件。

在之上,我们搭建了一套前端框架,前端框架采用当前前端响应式框架做,前端框架之上又搭建了一套前端的UI卡片库和UI组件库,让上层业务能够更高效的开发。

而对于一些通过动态化的技术无法实现,或者性能上存在卡点的功能,我们就通过Native扩展能力来支撑,这样,完整的动态化的业务能够直接运行在Android以及iOS上。 

JS去执行代码之后,前端框架会产生虚拟的DOM树,最后提交到C++引擎,形成C++的DOM树。C++引擎去完成布局、样式计算,Diff计算,将每个节点的属性和坐标交给Android以及iOS,由Native来完成最终UI的渲染。

总体来说,动态化的特点:首先是它与主流前端框架融合,充分融合了大前端的生态;第二,性能、扩展性较好。因为采用C++实现整个核心逻辑,静态和动态的语言绑定技术,能够保证地图引擎的能力能够直接透出到上层,或者从上层能够直接call底层的C++能力;第三,多端归一和动态化,充分利用Native优势,接近原生Native体验。

动态化技术改造完成之后,双端不一致的问题降低了90%,开发、测试成本降低30%,发版周期从T+30到T+0。

最后,总结下高德客户端及引擎技术架构演进的几个重要阶段:第一个阶段,通过在线&离线引擎的融合拉通,让高德最核心的导航能力提到提升;第二阶段,在客户端发展成为“巨型”APP,代码量发展到超大规模的时候,通过架构治理,满足业务快速增长的诉求,解决大规模业务体量下的架构合理性问题,消除架构瓶颈;第三个阶段通过动态化的技术,实现多端归一,以及动态发版能力,为业务发展提供更大的助力。


原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/517421.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

免费直播:主流深度框架对比:总有一款适合你~

常常有小伙伴在后台反馈:想了解深度学习该怎么学?自学难度大又没有效果,该怎么办?CSDN为了解决这个难题,联合唐宇迪老师为大家带来了一场精彩的直播【一节课掌握深度学习必备框架】。本次直播将带大家了解在开始深度学…

Swift 在 GAIA 平台云端一体化的探索

作者|姜沂(倾寒) 出品|阿里巴巴新零售淘系技术部 S1 阶段在使用 SwiftUI 编写集团内部使用的 SOT APP 时,有幸参与到 GAIA (FaaS)平台云端一体化的探索,从头到尾实现了一套基于 Swift 语言实现的遵守 GAIA…

微信小程序实现刷脸登录

🎨领域:Java后端开发🔥收录专栏: 系统设计与实战 🐒个人主页:BreezAm 💖Gitee:https://gitee.com/BreezAm ✨个人标签:【后端】【大数据】【前端】【运维】 文章目录&am…

SOFAStack的前世今生

十二年前,为了解决支付宝第一代架构在迅猛发展的业务面前捉襟见肘的困境,蚂蚁金服技术团队开启了一次前所未有的尝试。创新都是被逼出来的,今天高速发展的SOFAStack同样如此。 十二年时间,几代蚂蚁技术人参与攻坚,SOFA…

从浪漫走向坚韧:开源数据库的演变

图:Peter Zaitsev作者 | Adrian Bridgwater译者 | 火火酱,责编| Carol“最初,所有的软件都是开源的。”——这是Percona首席执行官彼得扎伊采夫(Peter Zaitsev)在其公司今年虚拟年度用户/客户峰会上的开场白。如果我们…

中国数据库OceanBase登顶之路

今年天猫双11当天,OceanBase数据库再次刷新数据库处理峰值,达6100万次/秒,创造了新的世界纪录。 在此之前一个月,据权威机构国际事务处理性能委员会TPC披露:蚂蚁金服的分布式关系数据库OceanBase,打破美国…

github 访问慢,一键加速,完美访问

文章目录1. 下载dev-sidecar2. 安装3. 开机启动4. 安装证书5. 开启增强模式6. 重新启动dev-sidecar7. 测试验证1. 下载dev-sidecar https://gitee.com/docmirror/dev-sidecar/releases/v1.6.1 2. 安装 这里windows环境演示 双击安装 3. 开机启动 4. 安装证书 5. 开启增强…

给 AI 讲故事,如何教它脑补画面?

阿里妹导读:视觉想象力是人与生俱来的, AI 能否拥有类似的能力呢?比如:给出一段故事情节,如何让机器展开它的想象力,“脑补”出画面呢?看看阿里AI Labs 感知实验室的同学们如何解决这个问题。 …

产业数字化升级进入深化期,腾讯智慧出行释放“数字底座”核心能力

6月24日,腾讯智慧出行举办线上年度新品发布会。本次发布会以“创造出行新价值”为主题,发布了生态车联网产品TAI 3.0、全新一代自动驾驶虚拟仿真平台TAD Sim 2.0,以及汽车云数字营销解决方案、智慧交通解决方案,从深度和广度上展示…

MySQL与Redis的双写一致性解决方案

文章目录一、解决方案1.1 先更新缓存,再更新数据库1.2 先删除缓存,再更新数据库1.3 先更新数据库,再更新缓存二、总结一、解决方案 1.1 先更新缓存,再更新数据库 💣 问题: 数据库更新成功了,但是由于异常…

解密双十一小程序云背后毫秒级伸缩的Serverless计算平台:函数计算

自2017年第一批小程序上线以来,越来越多的移动端应用以小程序的形式呈现。小程序拥有触手可及、用完即走的优点,这大大减少了用户的使用负担,使小程序得到了广泛的传播。在阿里小程序也被广泛地应用在淘宝/支付宝/钉钉/高德等平台上&#xff…

RuoYi-Cloud 进阶篇_01( Seata 单机环境搭建)

文章目录一、部署单机 TC Server1. 下载Seata2. 解压缩3. 启动4. 监听日志5. 启动命令讲解一、部署单机 TC Server 1. 下载Seata 在https://github.com/seata/seata/releases 这里找到对应的版本软件包进行下载 注:单机模式只适用于学习或者本地测试阶段&#xf…

Logtail 混合模式:使用插件处理文件日志

作为一个服务百万机器的日志采集 agent,Logtail 目前已经提供了包括日志切分、日志解析(完整正则、JSON、分隔符)、日志过滤在内的常见处理功能,能够应对绝大多数场景的处理需求。但有些时候,由于应用的历史原因或是本…

腾讯车联发布TAI3.0:三步实现汽车智能进化,2个月快速上车

6月24日,“2020腾讯智慧出行新品发布会”在线上举行,全新升级的TAI3.0生态车联网正式亮相,并在新款哈弗F7上进行了真实驾车场景的功能展示。 据介绍,TAI3.0包含两个车载APP——腾讯随行和腾讯爱趣听,以及一个生态开放…

RuoYi-Cloud 进阶篇_02( Seata 高可用集群与 Nacos 注册中心整合)

文章目录二、安装步骤1. 创建数据库2. 修改配置文件3. 调整数据库驱动4. 修改配置中心二、 启动和验证2.1. 启动nacos2.2. 启动TC Server2.3. 启动第二个节点2.4. 验证高可用二、安装步骤 1. 创建数据库 创建名称为ry_seata的数据库,并初始化ry_seata_20210128.sql脚本 2.…

腾讯TAD Sim2.0领跑自动驾驶仿真市场 双擎驱动构建新一代仿真平台

随着自动驾驶领域硬件、算法等方面的快速发展,虚拟仿真技术在自动驾驶研发和测试领域的应用日渐广泛,成为自动驾驶量产应用的必备工具,城市智慧交通调度管理和相关法规制定的有力辅助。 在这片行业竞争新高地上,腾讯自动驾驶仿真…

RuoYi-Cloud 部署篇_03(windows环境 Oracle + nginx版本)

请参考RuoYi-Cloud 分布式部署_03(linux环境 Mysqlnginxredis版本)

为了实现在线库的复杂查询,你还在双写吗?

一、在线库不支持在线复杂查询 做在线业务的开发者经常会碰到这样的难题:在线数据库上面运行稍微复杂点的查询,在线业务就挂了!不管是单机数据库如MySQL、PG,还是分布式数据库,HBase、MongoDB、Cassandra都有这个问题…

JUC 中断线程的3种方式

文章目录介绍中断方式一中断方式二中断方式三源码解析总结介绍 三个方法: 1、public boolean isInterrupted()判断线程是否被中断,如果此线程已被中断,则为true ;否则false 。 2、public void interrupt()中断线程 3、public …

RuoYi-Cloud 进阶篇_04( Seata 高可用集群 AT模式 需求实战)

需求背景: 模拟下单场景:首先去在自己的本地创建一条下单记录,同时,还要去调用库存服务,执行减库存操作。 这里演示一个客户下订单的流程服务来为小伙伴们进一步了解一下分布式事务到底如何使用? 首先,我…