溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

高德客戶端及引擎技術(shù)架構(gòu)演進(jìn)與思考

發(fā)布時間:2020-07-13 17:55:26 來源:網(wǎng)絡(luò) 閱讀:1160 作者:艾弗森哇 欄目:移動開發(fā)

2019杭州云棲大會上,高德地圖技術(shù)團(tuán)隊向與會者分享了包括視覺與機(jī)器智能、路線規(guī)劃、場景化/精細(xì)化定位、時空數(shù)據(jù)應(yīng)用、億級流量架構(gòu)演進(jìn)等多個出行技術(shù)領(lǐng)域的熱門話題?,F(xiàn)場火爆,聽眾反響強(qiáng)烈。我們把其中的優(yōu)秀演講內(nèi)容整理成文并陸續(xù)發(fā)布出來,本文為其中一篇。

阿里巴巴高級無線開發(fā)專家宋照春在高德技術(shù)專場做了題為?《高德客戶端及引擎技術(shù)架構(gòu)演進(jìn)與思考》的演講,主要分享了高德地圖客戶端技術(shù)架構(gòu)沿著「上漂下沉」、「模塊化、Bundle化」的思路演進(jìn)所做的一系列架構(gòu)升級中的經(jīng)驗和思考。

以下為宋照春演講內(nèi)容的簡版實錄:

主要分享三個方面的內(nèi)容:

  • 融合

  • 架構(gòu)治理

  • 動態(tài)化

一、三管齊下 深度融合

高德最初有兩個端,車機(jī)版的高德導(dǎo)航,手機(jī)版的高德地圖,兩個團(tuán)隊,一個是2B,一個是2C,分別是汽車業(yè)務(wù)和手機(jī)業(yè)務(wù)。當(dāng)時在引擎/技術(shù)上,分為離線引擎和在線引擎,但兩個團(tuán)隊之間交流比較少,各自有自己的研發(fā)、產(chǎn)品和測試,而作為一款端上的APP,兩塊業(yè)務(wù)都需要有地圖渲染、路線規(guī)劃、導(dǎo)航以及定位等通用能力。從公司層面看,存在較大的重復(fù)建設(shè),整體研發(fā)效率較低。

高德客戶端及引擎技術(shù)架構(gòu)演進(jìn)與思考

于是我們做了一件事:利用技術(shù)手段,打通端上引擎,打造一套能同時支撐多端的APP能力。具體到執(zhí)行層面,先從A團(tuán)隊拉一部分人到B團(tuán)隊一起建設(shè),建設(shè)完之后再從B團(tuán)隊拉到A團(tuán)隊。在同時支撐好主線業(yè)務(wù)發(fā)展的情況下,通過一年左右時間,完成了引擎上的融合,做到同時支撐手機(jī)、車機(jī)以及開放平臺。

高德客戶端及引擎技術(shù)架構(gòu)演進(jìn)與思考

這樣就從引擎的維度,實現(xiàn)了渲染、定位、規(guī)劃和引導(dǎo)的統(tǒng)一。具體來說,我們的各大引擎有好多套代碼,好幾個開發(fā)團(tuán)隊,每個團(tuán)隊有各自的開發(fā)方式和開發(fā)環(huán)境(Linux,Windows,Mac OS)。各種開發(fā)環(huán)境,工程配置文件大量重復(fù),修改非常繁瑣。

為此,我們通過兩種方法:

1.建立了一套構(gòu)建系統(tǒng)Abtor,通過一個配置系統(tǒng)實現(xiàn)統(tǒng)一構(gòu)建,能夠同時支持多個子引擎,在構(gòu)建集成效率上得到了很大的提升;

2.對基礎(chǔ)庫進(jìn)行了整體重構(gòu),形成了一套涵蓋了文件I/O、KV存儲、多線程框架&異步框架、歸檔、基礎(chǔ)容器等一系列標(biāo)準(zhǔn)能力的基礎(chǔ)庫,同時也做了引擎核心架構(gòu)的統(tǒng)一。

高德客戶端及引擎技術(shù)架構(gòu)演進(jìn)與思考

?

二、架構(gòu)治理

通過引擎的融合同時支持多端,在研發(fā)效率上實現(xiàn)比較大的收益。而通過技術(shù)的抓手來實現(xiàn)團(tuán)隊的融合,對公司發(fā)展而言,這其實是更大的收益,團(tuán)隊融合的意義在于人才拉通和復(fù)用,組織效率得到了較大提升。

隨著高德業(yè)務(wù)的快速發(fā)展,業(yè)務(wù)上持續(xù)擴(kuò)品類,需求量激增,高德地圖從最初的駕車導(dǎo)航,到后來的步行、騎行、摩托車導(dǎo)航等等,App所承載的業(yè)務(wù)發(fā)展非???,而原有的架構(gòu)治理模式的問題也逐漸暴露出來。

首先就是App的代碼規(guī)模變得特別大。當(dāng)時一個倉庫達(dá)到了10G以上,由此導(dǎo)致的一個典型的問題就是編譯慢,編譯出一次安裝包需要一個小時。伴隨代碼規(guī)模的另一個問題是團(tuán)隊規(guī)??焖僭鲩L。代碼增長和大團(tuán)隊并行開發(fā),最終導(dǎo)致合版慢,每次迭代,客戶端合版需要2天。

代碼膨脹導(dǎo)致的架構(gòu)腐化問題特別突出,所以測試質(zhì)量以及線上的質(zhì)量有段時間也比較差。此外,從產(chǎn)品提出需求到上線,平均需要45天,版本迭代周期很長。

為解決以上架構(gòu)問題,我們采取了三個手段:升級Native基礎(chǔ)組件,搭建Native容器和頁面框架,Bundle化分拆(微應(yīng)用)。

下面重點介紹下頁面框架和微應(yīng)用。

頁面框架主要借鑒和融合了Android和iOS的生命期管理機(jī)制。從高德地圖App架構(gòu)看,下層模塊是一套標(biāo)準(zhǔn)地圖,所有上層業(yè)務(wù)都要基于地圖模塊開發(fā)。為確保上層業(yè)務(wù)低耦合、一致性,我們設(shè)計了一個頁面框架。

高德客戶端及引擎技術(shù)架構(gòu)演進(jìn)與思考

如上圖,左邊的Activity是Android的系統(tǒng)頁面控制器,右邊的UIViewController是iOS的系統(tǒng)頁面控制器,通過虛線連接比較,我們發(fā)現(xiàn)兩端的頁面狀態(tài)設(shè)計基本相同。

所以,我們在設(shè)計自己的頁面框架時沿用了這些系統(tǒng)頁面狀態(tài),同時從命名上也保持一致,這樣可以讓Android和iOS原生開發(fā)的同學(xué)更容易理解和上手。

我們吸取了雙端各自的優(yōu)點。比如,Android端頁面有四種啟動模式,但是iOS 端并沒有這些,我們就把Android的四種啟動模式運用到了iOS端;iOS端有Present特性,但是Android端沒有,那么也把這種特性融合到Android端的頁面框架中;最后,還有一些小設(shè)計,比如Android的onResult設(shè)計,也可以借鑒融合到iOS端。

此外,我們還做了微應(yīng)用,所謂微應(yīng)用,首先是模塊化,就是把大模塊倉庫大模塊拆成一個個小的Bundle,除了實現(xiàn)模塊化,還主要實現(xiàn)以下幾個目標(biāo):

粒度:以業(yè)務(wù)為單位,以業(yè)務(wù)線為分組

編譯:二進(jìn)制級別的產(chǎn)物,可獨立編譯、出包時鏈接

依賴:松耦合,以“服務(wù)”為導(dǎo)向,不關(guān)心模塊歸屬

而Native容器層面,要實現(xiàn)四個核心目標(biāo):路由管理、服務(wù)管理、UI生命期管理、微應(yīng)用管理。

通過一年時間的Bundle化改造,高德地圖單端App完成了300多個頁面的建設(shè),拆分了100多個Bundle。

從收益來看,總編譯時間從原來的60分鐘降低到了8分鐘,合版周期從原來的3天降到1天,需求上線周期降到了1個月以內(nèi),線上質(zhì)量和測試質(zhì)量都得到了極大的提升,崩潰率從萬分之八降低到十萬分之八。

三、動態(tài)化

隨著高德地圖業(yè)務(wù)發(fā)展沿著擴(kuò)品類、在垂直品類做精做細(xì),景區(qū)、酒店、銀行商鋪、充電樁等個性化定制需求凸顯,對前端展現(xiàn)提出了更高的要求,對“快速應(yīng)變”要求也更高了。

實際上,在2015年,高德就開始做動態(tài)化。最早的時候業(yè)內(nèi)就有React Native,團(tuán)隊做了技術(shù)調(diào)研,發(fā)現(xiàn)不能完全滿足業(yè)務(wù)上的需要,尤其是性能方面。最后我們決定自研一套動態(tài)化技術(shù)。

具體來說,就是通過一個核心C++引擎,把兩端業(yè)務(wù)(Android、iOS)用一套JavaScript代碼解決,實現(xiàn)雙端歸一,Android實現(xiàn)業(yè)務(wù)動態(tài)化發(fā)布。

架構(gòu)層面,最下面是高德App核心的地圖引擎,我們在上面搭建了一套動態(tài)化應(yīng)用引擎,通過C++來實現(xiàn)。應(yīng)用引擎的作用是為了承上啟下,上面承載動態(tài)化業(yè)務(wù),下層完成地圖引擎的直接打通。眾所周知,GUI的核心是DOM樹,所以應(yīng)用引擎不但要實現(xiàn)和JavaScript引擎的整合,還要負(fù)責(zé)DOM樹的核心邏輯計算。

其次,動態(tài)化的技術(shù)和前端Web技術(shù)一致:樣式、布局。應(yīng)用引擎負(fù)責(zé)完成樣式的布局計算、DOM樹Diff、事件生成。而GUI的繪制,通過Diff事件,交由原生的Android以及iOS去完成。這樣,所有的GUI都是原生的組件。

在之上,我們搭建了一套前端框架,前端框架采用當(dāng)前前端響應(yīng)式框架做,前端框架之上又搭建了一套前端的UI卡片庫和UI組件庫,讓上層業(yè)務(wù)能夠更高效的開發(fā)。

而對于一些通過動態(tài)化的技術(shù)無法實現(xiàn),或者性能上存在卡點的功能,我們就通過Native擴(kuò)展能力來支撐,這樣,完整的動態(tài)化的業(yè)務(wù)能夠直接運行在Android以及iOS上。

高德客戶端及引擎技術(shù)架構(gòu)演進(jìn)與思考

?

JS去執(zhí)行代碼之后,前端框架會產(chǎn)生虛擬的DOM樹,最后提交到C++引擎,形成C++的DOM樹。C++引擎去完成布局、樣式計算,Diff計算,將每個節(jié)點的屬性和坐標(biāo)交給Android以及iOS,由Native來完成最終UI的渲染。http://dalian.qd8.com.cn/yiyao/xinxi21_3709996.html

總體來說,動態(tài)化的特點:首先是它與主流前端框架融合,充分融合了大前端的生態(tài);第二,性能、擴(kuò)展性較好。因為采用C++實現(xiàn)整個核心邏輯,靜態(tài)和動態(tài)的語言綁定技術(shù),能夠保證地圖引擎的能力能夠直接透出到上層,或者從上層能夠直接call底層的C++能力;第三,多端歸一和動態(tài)化,充分利用Native優(yōu)勢,接近原生Native體驗。焦作國醫(yī)胃腸醫(yī)院地址在哪里:http://jz.lieju.com/zhuankeyiyuan/37324297.htm

動態(tài)化技術(shù)改造完成之后,雙端不一致的問題降低了90%,開發(fā)、測試成本降低30%,發(fā)版周期從T+30到T+0。

最后,總結(jié)下高德客戶端及引擎技術(shù)架構(gòu)演進(jìn)的幾個重要階段:第一個階段,通過在線&離線引擎的融合拉通,讓高德最核心的導(dǎo)航能力提到提升;第二階段,在客戶端發(fā)展成為“巨型”APP,代碼量發(fā)展到超大規(guī)模的時候,通過架構(gòu)治理,滿足業(yè)務(wù)快速增長的訴求,解決大規(guī)模業(yè)務(wù)體量下的架構(gòu)合理性問題,消除架構(gòu)瓶頸;第三個階段通過動態(tài)化的技術(shù),實現(xiàn)多端歸一,以及動態(tài)發(fā)版能力,為業(yè)務(wù)發(fā)展提供更大的助力。


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI