手淘Android容器架构——Atlas的前世今生
導語
手淘因其使用的便捷性,越來越成為大家移動購物的首選,尤其是在萬眾矚目的雙十一等購物節中,經受住了巨大流量的沖擊和考驗,那么作為如此堅挺的移動購物主流APP,手淘的移動框架是怎樣實現功能優化的?
本文將介紹,手淘移動容器化框架Atlas是怎樣由來的,有什么樣的特性,以及在工程期和運行期是如何工作的?阿里巴巴核心技術團隊專家白衣將為您帶來精彩的分享。
背景
2013年,手淘航母戰略的制定,帶來了業務和開發人員的翻倍膨脹。從不到100人猛增四五倍,同時業務數量大增,整個客戶端的架構和發版節奏受到極大挑戰,Atlas作為之前手淘客戶端的基礎框架,進行了一次大的重構,形成了今天的Atlas。
一、Atlas容器架構是什么?
Atlas是一個Android客戶端容器化框架,主要提供了組件化、動態性、解耦化的支持。支持工程師在工程編碼期、Apk運行期以及后續運維修復期的各種問題。
Atlas是工程期和運行期共同起作用的框架,它的特點是盡量將一些工作放到工程期,這樣來保證運行期的簡單,穩定。
二、Atlas的演變
2012年,Atlas基本成型,那時候是插件化的框架,進程是隔離的。插件和APK完全沒有關系,而且是在獨立進程里建起來的。隨著我們的發展,插件越來越多,進程也越來越多,這就導致一些性能問題,很多東西沒有辦法復用了。
2014年,我們建立了組件式的結構,基本上所有的東西都是在一個進程里運行,一些庫都是能夠復用的,我們在Atlas容器里做了隔離、控制,那時是靜態組件式,只能對拆出去的東西做一些動態更新。
到2015-2016年,我們這時候基本上做到了除個別最前面系統建起來的那幾個類不能動態更新外,基本上所有的東西都能夠動態更新,就是說能夠對Atlas本身做動態升級。
三、Atlas的特性
Atlas容器特性
在工程期,實現工程獨立開發,調試的功能,工程模塊獨立。
在運行期,實現完整的組件生命周期的映射,類隔離等機制。
在運維期,提供快速增量的更新修復能力,快速升級。
Atlas動態特性
支持類型
具有全類型動態能力,支持Class文件,SO和資源的增刪改操作
開發透明
對開發者友好,與正常開發功能無差別,自動生成Diff包
成功率
具有非常高的部署成功率和效率
兼容性
兼容性高,適配4.x~7.x~O dp3版本,在線上穩定運行2年多
高性能
通過Verify等手段,達到極小的性能損耗
補丁大小
通過精細化Diff的方法,達到非常小的Patch包
Atlas價值
2013年,手淘基本上每個月發布一次版本, 2014年組件化改造后,一年發了200多次,到2015、2016這兩年版本發布的越來越多、越來越快,平均1.7天發布一次。手淘70多個業務、400多個工程師各玩各的,用戶幾乎是無察覺的,大家會覺得手淘還是這樣,但事實上在后臺基本每天都有發布的動作。
四、Atlas工程期
Atlas包結構
這是一個手機淘寶的APK包,第一層目錄上與標準的APK是完全一樣的,在APP會有很多的SO文件,如果解開來看的話,它的結構類似于完整的APK,但本身并不能獨立運行,它跟很多插件化的差別是在運行期,它是運行在整個容器里的,每一個組件都是獨立的Bundle。
Atlas包構建流程
APK構建,我們對它做了比較大的調整。上面的圖中,其實左邊這一部分是一個標準的APK的構建過程,包括處理,編譯到簽名的過程。我們這個不同的地方是多了Awb需要特殊處理,其中Awb的資源根據宿主的resource.ap_和包內資源構建,R文件由Bundle R資源和宿主R資源合并而來,然后我們對Aapt進行了修改,對每個awb分配不同的packageId,然后進行統一混淆,生產各個AWB的Dex,打包為APK,簽名之后復制到libs,改名為SO文件,然后合并到taobao APK. 這就是我們組件化的整個過程。
五、Atlas運行期
系統結構
這一塊是Atlas的整體設計,分為五層:
第一層我們稱之為Hack層,包括OS Hack toolkit & verifier,這里我們對系統能力做一些擴展,然后做一些安全校驗。
第二層是Bundle Framework,就是我們的容器基礎框架,提供Bundle管理、加載、生命周期、安全等一些最基本的能力。
第三層是運行期管理層,包括清單,我們會把所有的Bundle和它們的能力列在一個清單上,在調用時方便查找;另外是版本管理,會對所有Bundle的版本進行管理;再就是代理,這里就是和業界一些插件化框架機制類似的地方,我們會代理系統的運行環境,讓Bundle運行在我們的容器框架上;然后還有調試和監控工具,是為了方便工程期開發調試。
第四層是業務層了,這里我們向業務方暴露了一些接口,如框架生命周期、配置文件、工具庫等等。
最上面一層是應用接入層,就是我們的業務代碼了。
所以Atlas作為一個框架提供了相對完整的能力,業務層的開發可以在框架生命周期的各個環節做一些自定義的動作,也可以自由的調用系統、框架,乃至其它組件釋放的能力。
資源加載
我們會用自己的DelegeteResources替換掉系統的resource,Bundle的資源會逐個在安裝的時候添加到AssertPath,由于添加Bundle的順序非固定,不分區會導致資源查找錯亂.
類加載
類加載,這里利用Delegate ClassLoader來動態加載組件的類。Delegate ClassLoader先查找宿主Bundle的PathClassLoader,然后根據前面的BundleList找到對應的BundleClassLoader.
動態部署
1、業務組件動態更新
通過組件Diff,Merge的過程進行更新;直接在組件的生命周期內做,兼容性極好
2、宿主動態更新
通過類、資源、SO文件等的diff算法,通過Merge算法來實現更新,有比較好的兼容性。
3、組件遠程下載(從無到有)
在構建期參與構建,在最后發布階段從APK包中剔除。在用戶啟動階段,通過遠程下載的方式進行安裝。適用于預裝、大體積業務等。
六、Atlas周邊與開源
最后來講講我們的周邊優化點,為什么到今天才說要開源,做的過程當中還是遇到了不少問題。
第一點是Bundle的重復資源合并。我們發現,因為宿主問題,必然而然會出現沖突的問題,包括圖片資源,我們會放到整個宿主類目中去。
第二是Bundle的依賴校驗,以前是代碼的話,是編譯過的,但因為今天是二進制,這個問題會遺留到現場去,所以會看看API是否會影響Bundle。
第三是類庫“瘦身”,因為手淘依賴的各種中間件類庫太多了,導致手淘本身很臃腫,方法數很大;所以打包的時候對類庫有一個裁剪的過程,優化方法數。
第四是依賴導致的,依賴查詢庫。
第五是做Dex File等,進行混淆Mapping。
最后是開源準備中,我們在工程期、運行期都會去做開源,并且將機制通過云服務的方式提供出來,阿里百川會提供Atlas的研發支撐能力,包括快捷的生成,發布,回滾,監控等能力。
?( 本文轉自微信公眾號:安卓綠色聯盟 )
總結
以上是生活随笔為你收集整理的手淘Android容器架构——Atlas的前世今生的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt制作视频播放器
- 下一篇: 数据分析报告流程展现