日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

手淘Android容器架构——Atlas的前世今生

發(fā)布時(shí)間:2023/12/14 Android 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 手淘Android容器架构——Atlas的前世今生 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

導(dǎo)語(yǔ)

手淘因其使用的便捷性,越來(lái)越成為大家移動(dòng)購(gòu)物的首選,尤其是在萬(wàn)眾矚目的雙十一等購(gòu)物節(jié)中,經(jīng)受住了巨大流量的沖擊和考驗(yàn),那么作為如此堅(jiān)挺的移動(dòng)購(gòu)物主流APP,手淘的移動(dòng)框架是怎樣實(shí)現(xiàn)功能優(yōu)化的?

本文將介紹,手淘移動(dòng)容器化框架Atlas是怎樣由來(lái)的,有什么樣的特性,以及在工程期和運(yùn)行期是如何工作的?阿里巴巴核心技術(shù)團(tuán)隊(duì)專(zhuān)家白衣將為您帶來(lái)精彩的分享。

背景

2013年,手淘航母戰(zhàn)略的制定,帶來(lái)了業(yè)務(wù)和開(kāi)發(fā)人員的翻倍膨脹。從不到100人猛增四五倍,同時(shí)業(yè)務(wù)數(shù)量大增,整個(gè)客戶端的架構(gòu)和發(fā)版節(jié)奏受到極大挑戰(zhàn),Atlas作為之前手淘客戶端的基礎(chǔ)框架,進(jìn)行了一次大的重構(gòu),形成了今天的Atlas。

一、Atlas容器架構(gòu)是什么?

Atlas是一個(gè)Android客戶端容器化框架,主要提供了組件化、動(dòng)態(tài)性、解耦化的支持。支持工程師在工程編碼期、Apk運(yùn)行期以及后續(xù)運(yùn)維修復(fù)期的各種問(wèn)題。

Atlas是工程期和運(yùn)行期共同起作用的框架,它的特點(diǎn)是盡量將一些工作放到工程期,這樣來(lái)保證運(yùn)行期的簡(jiǎn)單,穩(wěn)定。

二、Atlas的演變

2012年,Atlas基本成型,那時(shí)候是插件化的框架,進(jìn)程是隔離的。插件和APK完全沒(méi)有關(guān)系,而且是在獨(dú)立進(jìn)程里建起來(lái)的。隨著我們的發(fā)展,插件越來(lái)越多,進(jìn)程也越來(lái)越多,這就導(dǎo)致一些性能問(wèn)題,很多東西沒(méi)有辦法復(fù)用了。

2014年,我們建立了組件式的結(jié)構(gòu),基本上所有的東西都是在一個(gè)進(jìn)程里運(yùn)行,一些庫(kù)都是能夠復(fù)用的,我們?cè)贏tlas容器里做了隔離、控制,那時(shí)是靜態(tài)組件式,只能對(duì)拆出去的東西做一些動(dòng)態(tài)更新。

到2015-2016年,我們這時(shí)候基本上做到了除個(gè)別最前面系統(tǒng)建起來(lái)的那幾個(gè)類(lèi)不能動(dòng)態(tài)更新外,基本上所有的東西都能夠動(dòng)態(tài)更新,就是說(shuō)能夠?qū)tlas本身做動(dòng)態(tài)升級(jí)。

三、Atlas的特性

Atlas容器特性

在工程期,實(shí)現(xiàn)工程獨(dú)立開(kāi)發(fā),調(diào)試的功能,工程模塊獨(dú)立。

在運(yùn)行期,實(shí)現(xiàn)完整的組件生命周期的映射,類(lèi)隔離等機(jī)制。

在運(yùn)維期,提供快速增量的更新修復(fù)能力,快速升級(jí)。

Atlas動(dòng)態(tài)特性

支持類(lèi)型

具有全類(lèi)型動(dòng)態(tài)能力,支持Class文件,SO和資源的增刪改操作

開(kāi)發(fā)透明

對(duì)開(kāi)發(fā)者友好,與正常開(kāi)發(fā)功能無(wú)差別,自動(dòng)生成Diff包

成功率

具有非常高的部署成功率和效率

兼容性

兼容性高,適配4.x~7.x~O dp3版本,在線上穩(wěn)定運(yùn)行2年多

高性能

通過(guò)Verify等手段,達(dá)到極小的性能損耗

補(bǔ)丁大小

通過(guò)精細(xì)化Diff的方法,達(dá)到非常小的Patch包

Atlas價(jià)值

2013年,手淘基本上每個(gè)月發(fā)布一次版本, 2014年組件化改造后,一年發(fā)了200多次,到2015、2016這兩年版本發(fā)布的越來(lái)越多、越來(lái)越快,平均1.7天發(fā)布一次。手淘70多個(gè)業(yè)務(wù)、400多個(gè)工程師各玩各的,用戶幾乎是無(wú)察覺(jué)的,大家會(huì)覺(jué)得手淘還是這樣,但事實(shí)上在后臺(tái)基本每天都有發(fā)布的動(dòng)作。

四、Atlas工程期

Atlas包結(jié)構(gòu)

這是一個(gè)手機(jī)淘寶的APK包,第一層目錄上與標(biāo)準(zhǔn)的APK是完全一樣的,在APP會(huì)有很多的SO文件,如果解開(kāi)來(lái)看的話,它的結(jié)構(gòu)類(lèi)似于完整的APK,但本身并不能獨(dú)立運(yùn)行,它跟很多插件化的差別是在運(yùn)行期,它是運(yùn)行在整個(gè)容器里的,每一個(gè)組件都是獨(dú)立的Bundle。

Atlas包構(gòu)建流程

APK構(gòu)建,我們對(duì)它做了比較大的調(diào)整。上面的圖中,其實(shí)左邊這一部分是一個(gè)標(biāo)準(zhǔn)的APK的構(gòu)建過(guò)程,包括處理,編譯到簽名的過(guò)程。我們這個(gè)不同的地方是多了Awb需要特殊處理,其中Awb的資源根據(jù)宿主的resource.ap_和包內(nèi)資源構(gòu)建,R文件由Bundle R資源和宿主R資源合并而來(lái),然后我們對(duì)Aapt進(jìn)行了修改,對(duì)每個(gè)awb分配不同的packageId,然后進(jìn)行統(tǒng)一混淆,生產(chǎn)各個(gè)AWB的Dex,打包為APK,簽名之后復(fù)制到libs,改名為SO文件,然后合并到taobao APK. 這就是我們組件化的整個(gè)過(guò)程。

五、Atlas運(yùn)行期

系統(tǒng)結(jié)構(gòu)

這一塊是Atlas的整體設(shè)計(jì),分為五層:

第一層我們稱之為Hack層,包括OS Hack toolkit & verifier,這里我們對(duì)系統(tǒng)能力做一些擴(kuò)展,然后做一些安全校驗(yàn)。

第二層是Bundle Framework,就是我們的容器基礎(chǔ)框架,提供Bundle管理、加載、生命周期、安全等一些最基本的能力。

第三層是運(yùn)行期管理層,包括清單,我們會(huì)把所有的Bundle和它們的能力列在一個(gè)清單上,在調(diào)用時(shí)方便查找;另外是版本管理,會(huì)對(duì)所有Bundle的版本進(jìn)行管理;再就是代理,這里就是和業(yè)界一些插件化框架機(jī)制類(lèi)似的地方,我們會(huì)代理系統(tǒng)的運(yùn)行環(huán)境,讓Bundle運(yùn)行在我們的容器框架上;然后還有調(diào)試和監(jiān)控工具,是為了方便工程期開(kāi)發(fā)調(diào)試。

第四層是業(yè)務(wù)層了,這里我們向業(yè)務(wù)方暴露了一些接口,如框架生命周期、配置文件、工具庫(kù)等等。

最上面一層是應(yīng)用接入層,就是我們的業(yè)務(wù)代碼了。

所以Atlas作為一個(gè)框架提供了相對(duì)完整的能力,業(yè)務(wù)層的開(kāi)發(fā)可以在框架生命周期的各個(gè)環(huán)節(jié)做一些自定義的動(dòng)作,也可以自由的調(diào)用系統(tǒng)、框架,乃至其它組件釋放的能力。

資源加載

我們會(huì)用自己的DelegeteResources替換掉系統(tǒng)的resource,Bundle的資源會(huì)逐個(gè)在安裝的時(shí)候添加到AssertPath,由于添加Bundle的順序非固定,不分區(qū)會(huì)導(dǎo)致資源查找錯(cuò)亂.


類(lèi)加載

類(lèi)加載,這里利用Delegate ClassLoader來(lái)動(dòng)態(tài)加載組件的類(lèi)。Delegate ClassLoader先查找宿主Bundle的PathClassLoader,然后根據(jù)前面的BundleList找到對(duì)應(yīng)的BundleClassLoader.


動(dòng)態(tài)部署


1、業(yè)務(wù)組件動(dòng)態(tài)更新

通過(guò)組件Diff,Merge的過(guò)程進(jìn)行更新;直接在組件的生命周期內(nèi)做,兼容性極好

2、宿主動(dòng)態(tài)更新

通過(guò)類(lèi)、資源、SO文件等的diff算法,通過(guò)Merge算法來(lái)實(shí)現(xiàn)更新,有比較好的兼容性。

3、組件遠(yuǎn)程下載(從無(wú)到有)

在構(gòu)建期參與構(gòu)建,在最后發(fā)布階段從APK包中剔除。在用戶啟動(dòng)階段,通過(guò)遠(yuǎn)程下載的方式進(jìn)行安裝。適用于預(yù)裝、大體積業(yè)務(wù)等。

六、Atlas周邊與開(kāi)源

最后來(lái)講講我們的周邊優(yōu)化點(diǎn),為什么到今天才說(shuō)要開(kāi)源,做的過(guò)程當(dāng)中還是遇到了不少問(wèn)題。

第一點(diǎn)是Bundle的重復(fù)資源合并。我們發(fā)現(xiàn),因?yàn)樗拗鲉?wèn)題,必然而然會(huì)出現(xiàn)沖突的問(wèn)題,包括圖片資源,我們會(huì)放到整個(gè)宿主類(lèi)目中去。

第二是Bundle的依賴校驗(yàn),以前是代碼的話,是編譯過(guò)的,但因?yàn)榻裉焓嵌M(jìn)制,這個(gè)問(wèn)題會(huì)遺留到現(xiàn)場(chǎng)去,所以會(huì)看看API是否會(huì)影響B(tài)undle。

第三是類(lèi)庫(kù)“瘦身”,因?yàn)槭痔砸蕾嚨母鞣N中間件類(lèi)庫(kù)太多了,導(dǎo)致手淘本身很臃腫,方法數(shù)很大;所以打包的時(shí)候?qū)︻?lèi)庫(kù)有一個(gè)裁剪的過(guò)程,優(yōu)化方法數(shù)。

第四是依賴導(dǎo)致的,依賴查詢庫(kù)。

第五是做Dex File等,進(jìn)行混淆Mapping。

最后是開(kāi)源準(zhǔn)備中,我們?cè)诠こ唐?、運(yùn)行期都會(huì)去做開(kāi)源,并且將機(jī)制通過(guò)云服務(wù)的方式提供出來(lái),阿里百川會(huì)提供Atlas的研發(fā)支撐能力,包括快捷的生成,發(fā)布,回滾,監(jiān)控等能力。

?( 本文轉(zhuǎn)自微信公眾號(hào):安卓綠色聯(lián)盟 )

總結(jié)

以上是生活随笔為你收集整理的手淘Android容器架构——Atlas的前世今生的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。