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