手淘Android容器架构——Atlas的前世今生
導(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)題。
- 上一篇: Qt制作视频播放器
- 下一篇: Android本地视频播放器mediap