張炎高
摘 要 Android最初是由Android Inc.開發(fā)的。2005年,谷歌收購(gòu)了移動(dòng)操作系統(tǒng)Android并在2007年首次向公眾展示。2008年10月,Android正式發(fā)布了1.0版本,每個(gè)廠商都可以使用這個(gè)操作系統(tǒng)。Android作為一個(gè)開源操作系統(tǒng)被進(jìn)一步開發(fā)廣泛應(yīng)用與手機(jī)、平板電腦和其他嵌入式設(shè)備。越來越多的中小企業(yè),采用Android系統(tǒng)來開發(fā)產(chǎn)品。產(chǎn)品發(fā)布后,增加新功能、修補(bǔ)漏洞,都需要更新固件,隨著功能的增加,Android系統(tǒng)的固件也越來越大,小小的修改卻要升級(jí)整個(gè)固件,這不僅浪費(fèi)網(wǎng)絡(luò)資源,同時(shí)也增加了升級(jí)需要的時(shí)間,于是增量升級(jí)成為一種好的解決方法。
關(guān)鍵詞 Android;安卓;OTA;增量升級(jí);差分升級(jí)
1增量升級(jí)的原理
Android OTA升級(jí)分全量升級(jí)、增量升級(jí)(也叫差分升級(jí))。增量升級(jí),將舊版本固件與新版本固件進(jìn)行比較,得到更新部分的補(bǔ)丁,并生成OTA升級(jí)zip壓縮包。將OTA升級(jí)zip壓縮包放到服務(wù)器上。設(shè)備連接到服務(wù)器,檢查是否需要更新,需要更新則通過網(wǎng)絡(luò)從服務(wù)器下載OTA升級(jí)zip壓縮包到本地,重啟進(jìn)入recovery系統(tǒng),通過應(yīng)用補(bǔ)丁形式,完成boot、system分區(qū)的升級(jí),完成boot、system分區(qū)的升級(jí)再次重啟進(jìn)入正常系統(tǒng),正常系統(tǒng)啟動(dòng)過程中,以補(bǔ)丁形式完成recovery系統(tǒng)的升級(jí)。在recvoery系統(tǒng)中升級(jí)boot、system分區(qū),在正常系統(tǒng)中升級(jí)recovery分區(qū),這樣可以保證正常系統(tǒng)與recovery系統(tǒng)至少有一個(gè)是可以正常工作的。增加了系統(tǒng)的健壯性[1]。
2增量升級(jí)不足之處
增量升級(jí)并非十全十美,存在不足之處。
(1)Android原生增量升級(jí),升級(jí)包管理復(fù)雜。隨著發(fā)布版本的增多,所需提供的增量升級(jí)包會(huì)越來越多。理論上,發(fā)布第n個(gè)版本時(shí),需要提供n-1個(gè)增量升級(jí)包,才能滿足現(xiàn)有用戶通過一次升級(jí),升級(jí)到版本n。否則用戶需要升級(jí)多次才能升級(jí)到版本n。例如:當(dāng)前處于第1個(gè)版本的用戶,需要升級(jí)n-1次才能升級(jí)到第版本n,這將會(huì)是糟糕的用戶體驗(yàn)。
(2)需要保留每個(gè)版本的中間文件,用于增量升級(jí)包的生成。小小的改動(dòng),也需要保留整個(gè)系統(tǒng)的中間文件,其中的大部分文件是冗余的。隨著版本的增加,消耗的磁盤空間也會(huì)越來越大。
(3)實(shí)際應(yīng)用中,固件對(duì)外發(fā)布后,系統(tǒng)層面的代碼很少改動(dòng),主要修改是APP相關(guān)的修改。APP的小小修改,也需要重新編譯整個(gè)Android系統(tǒng),大大降低開發(fā)效率。
(4)不修改源碼的情況下,全量升級(jí)只允許從編譯時(shí)間較早的版本升級(jí)到編譯時(shí)間較新的版本。增量升級(jí)則沒有這個(gè)限制,實(shí)際應(yīng)用中卻有這樣的限制需求[2]。
3增量升級(jí)改進(jìn)
中小企業(yè)為了加快產(chǎn)品上市,往往會(huì)先發(fā)布一版相對(duì)穩(wěn)定的固件,然后在實(shí)際應(yīng)用過程中不斷改進(jìn),版本迭代頻繁。開發(fā)調(diào)試過程中,一天可能出幾個(gè)調(diào)試版本固件,甚至更多。安卓系統(tǒng)原生的差分升級(jí),在這樣環(huán)境下的應(yīng)用,不足之處就會(huì)更加突出。對(duì)此,進(jìn)行改進(jìn),改進(jìn)后的差分升級(jí),對(duì)中小企業(yè)更加實(shí)用、高效。
3.1 固件打包方式修改
固件打包目錄由編譯好的kernel文件、root目錄、recovery目錄、system目錄組成。root目錄用于生成正常系統(tǒng)ramdisk.img(根文件系統(tǒng)一部分,與system組成Android的整個(gè)根文件系統(tǒng)),ramdisk.img與編譯好的kernel生成boot.img。recovery目錄用于生成recovery系統(tǒng)的ramdisk.img(一個(gè)小的根文件系統(tǒng)),再與編譯好的kernel生成recovery.img。system目錄,存放Android系統(tǒng)的文件及目錄,用生成system.img。每個(gè)鏡像增加鏡像頭,鏡像頭包含版本、大小、MD5校驗(yàn)和、版本兼容性等信息。增加固件頭,包含boot system recovery的版本、MD5校驗(yàn)和、大小、偏移。固件頭后是boot.img、recovery.img、system.img等鏡像。system分區(qū)以文件或目錄為單位為最小單元,在鏡像文件頭部存放system分區(qū)的文件列表,文件列表項(xiàng)由文件名(或目錄)、MD5校驗(yàn)和、偏移、大小組成。改進(jìn)后,打包與Android源碼分離。這樣只修改APP應(yīng)用時(shí)無須重新編譯Android源碼,加快了固件發(fā)布。
3.2 升級(jí)數(shù)據(jù)下載改進(jìn)
與原生的OTA升級(jí)下載整個(gè)OTA升級(jí)包不同,先下載固件頭部分?jǐn)?shù)據(jù),比較固件頭中的版本、MD5校驗(yàn)和信息。固件頭中對(duì)應(yīng)鏡像的版本、MD5校驗(yàn)和都相同則無須下載此部分鏡像,不同則繼續(xù)下載鏡像頭進(jìn)行比較。boot、recovery分區(qū)根據(jù)版本、MD5校驗(yàn)和比較結(jié)果進(jìn)行下載,版本、MD5校驗(yàn)和相同,無須升級(jí)則不進(jìn)行下載,否則下載固件中相應(yīng)部分的數(shù)據(jù),減少數(shù)據(jù)下載。system分區(qū)數(shù)據(jù)的下載,則進(jìn)一步比較當(dāng)前版本固件中system分區(qū)的文件列表與最新版本固件中system分區(qū)的文件列表,可以知道新版本固件system分區(qū)中哪些文件(或目錄)是新增加的,哪些文件(或目錄)需要?jiǎng)h除的,哪些文件(或目錄)需要修改的。只下載增加、修改的數(shù)據(jù),記錄刪除的文件(或目錄),就可以升級(jí)。增量升級(jí)數(shù)據(jù)的生成在設(shè)備端進(jìn)行,這樣不需要事先制作好2個(gè)版本間的增量升級(jí)包,服務(wù)器上只需發(fā)布完整的固件即可。固件版本的維護(hù),相對(duì)簡(jiǎn)單。設(shè)備當(dāng)前無論處于哪個(gè)固件版本,都可以通過一次更新升級(jí)到最新版本。system分區(qū)文件列表包含成千上萬個(gè)文件或目錄,為了加快比較速度,對(duì)本地文件列表根據(jù)文件名進(jìn)行快速排序,然后對(duì)最新版本的system分區(qū)文件列表項(xiàng),用2分查找法在本地文件列表中進(jìn)行搜索,這樣可以快速生成新增、修改、刪除表。
3.3 數(shù)據(jù)升級(jí)
與Android原生系統(tǒng)一樣,同樣啟動(dòng)進(jìn)recovery系統(tǒng)進(jìn)行增量升級(jí),不同改用掛載system分區(qū),進(jìn)行文件增加、刪除。
4結(jié)束語
綜上所述,改進(jìn)后的差分升級(jí)方式,更易維護(hù),更節(jié)省時(shí)間、空間,更適合中小企業(yè)快速迭代的需求。
參考文獻(xiàn)
[1] 林學(xué)森.深入理解Android內(nèi)核設(shè)計(jì)思想[M].北京:人民郵電出版社,2014:335.
[2] 佚名.android維基百科[ED/OL].https://en.droidwiki.org/wiki/Android,2020-5-2.