android P OTA 初探 —— 1、OTA简单介绍
本系列介紹自己理解的基于android P的OTA系統(tǒng)。由于工作需要開(kāi)始研究,實(shí)踐經(jīng)驗(yàn)匱乏,難免有理解不夠或者錯(cuò)誤之處。還請(qǐng)多多指正,不吝賜教!
1、
本文提及的OTA指的是android手機(jī)的基礎(chǔ)操作系統(tǒng)、系統(tǒng)分區(qū)上安裝的只讀應(yīng)用和/或時(shí)區(qū)規(guī)則的無(wú)線下載 (OTA) 更新。根據(jù)升級(jí)方式不同,分為:A/B(無(wú)縫)系統(tǒng)更新(android O新增)、 傳統(tǒng)的非 A/B 系統(tǒng)更新、 時(shí)區(qū)規(guī)則更新(Android 8.1 開(kāi)始支持)。
 其中,傳統(tǒng)的非 A/B 系統(tǒng)更新 又可以分為 基于文件的ota(android5.0之前) 和 基于塊的ota(block , android5.0開(kāi)始支持,即升級(jí)android5.0以上的系統(tǒng),可以用基于block的ota包)。
 塊 OTA 不會(huì)比較各個(gè)文件,也不會(huì)分別計(jì)算各個(gè)二進(jìn)制補(bǔ)丁程序,而是將整個(gè)分區(qū)處理為一個(gè)文件并計(jì)算單個(gè)二進(jìn)制補(bǔ)丁程序,以確保生成的分區(qū)剛好包含預(yù)期的位數(shù)。這樣一來(lái),設(shè)備系統(tǒng)映像就能夠通過(guò) fastboot 或 OTA 達(dá)到相同的狀態(tài)。因?yàn)閴K OTA 可確保每個(gè)設(shè)備使用相同的分區(qū),所以它能夠使用 dm-verity 以加密的方式為系統(tǒng)分區(qū)簽名。dm-verity是驗(yàn)證啟動(dòng)相關(guān)的,具體的可以查看官網(wǎng)介紹。
根據(jù)升級(jí)內(nèi)容不同,又可以分為整包升級(jí)和差分升級(jí)。
 文件和塊OTA的區(qū)別主要在差分包:系統(tǒng)分區(qū)的內(nèi)容可能會(huì)在 adb remount 期間或由于惡意軟件而被修改。如果某分區(qū)已經(jīng)被修改,執(zhí)行基于塊的OTA升級(jí)就會(huì)失敗。而對(duì)于基于文件的OTA方式,只要當(dāng)前設(shè)備的系統(tǒng)中此差分包要升級(jí)的文件沒(méi)有被修改,就不會(huì)有沖突。
 相應(yīng)的,塊升級(jí)前檢查到當(dāng)前設(shè)備分區(qū)被修改,就升級(jí)失敗,系統(tǒng)以舊系統(tǒng)重啟運(yùn)行。而文件OTA雖然能升級(jí)成功,但重啟運(yùn)行后可能會(huì)有問(wèn)題。
2、
A/B系統(tǒng)更新 與 非 A/B 系統(tǒng)更新 兩者是不兼容的。因?yàn)樗麄儗?duì)應(yīng)的系統(tǒng)分區(qū)和升級(jí)邏輯完全不同。3、
現(xiàn)在基本用的都是基于塊的OTA方式。 android P的代碼中關(guān)于OTA升級(jí)包的制作已經(jīng)默認(rèn)只有基于塊的OTA和AB系統(tǒng)OTA這兩種包的制作流程了。 不再支持基于文件的OTA包的制作。 但,基于AB系統(tǒng)的OTA還不流行,主要是因?yàn)樗黃ystem、Vendor等分區(qū)都是兩份,占用存儲(chǔ)空間太多。4、
OTA流程:1)、設(shè)備會(huì)與 OTA 服務(wù)器進(jìn)行定期確認(rèn),并被告知是否有更新可用,包括更新軟件包的 URL 和向用戶顯示的描述字符串。
 2)、將更新下載到緩存或數(shù)據(jù)分區(qū),并根據(jù) /system/etc/security/otacerts.zip 中的證書(shū)驗(yàn)證加密簽名。系統(tǒng)提示用戶安裝更新。
 3)、設(shè)備重新啟動(dòng)進(jìn)入Recovery模式,引導(dǎo)恢復(fù)分區(qū)中的內(nèi)核和系統(tǒng)啟動(dòng),而非引導(dǎo)分區(qū)中的內(nèi)核。
 恢復(fù)分區(qū)的二進(jìn)制文件由 init 啟動(dòng)。它會(huì)在 /cache/recovery/command 中尋找將其指向下載軟件包的命令行參數(shù)。
 4)、恢復(fù)操作會(huì)根據(jù) /res/keys (包含在恢復(fù)分區(qū)中的 RAM 磁盤(pán)的一部分)中的公鑰來(lái)驗(yàn)證軟件包的加密簽名。
 5)、從軟件包中提取數(shù)據(jù),并根據(jù)需要使用該數(shù)據(jù)更新引導(dǎo)、系統(tǒng)和/或供應(yīng)商分區(qū)。系統(tǒng)分區(qū)上其中一個(gè)新文件包含新恢復(fù)分區(qū)內(nèi)容。
 6)、設(shè)備正常重啟。加載最新更新的引導(dǎo)分區(qū),在最新更新的系統(tǒng)分區(qū)中裝載并開(kāi)始執(zhí)行二進(jìn)制文件。
 7)、作為正常啟動(dòng)的一部分,系統(tǒng)會(huì)根據(jù)所需內(nèi)容(預(yù)先存儲(chǔ)為 /system 中的一個(gè)文件)檢查恢復(fù)分區(qū)的內(nèi)容。如果二者內(nèi)容不同,則恢復(fù)分區(qū)會(huì)被所需內(nèi)容重新刷寫(xiě)(在后續(xù)引導(dǎo)中,恢復(fù)分區(qū)已經(jīng)包含新內(nèi)容,因此無(wú)需重新刷寫(xiě))。
 系統(tǒng)更新完成!
5、還有一點(diǎn)要補(bǔ)充
OTA過(guò)程中相關(guān)的幾種軟件包:
 (1)、Target包。
 這個(gè)包可以理解為系統(tǒng)內(nèi)容資料收集包,它對(duì)應(yīng)了某個(gè)版本的軟件。里面基本包含了系統(tǒng)的所有內(nèi)容。是用來(lái)生成升級(jí)包的中間包。我們每次編譯android系統(tǒng)軟件,都可以同步生成Target包,特別是發(fā)布的軟件一定要備份對(duì)應(yīng)的Target包,以便后面升級(jí)使用。
(2)、完整升級(jí)包。
 這個(gè)是用來(lái)進(jìn)行系統(tǒng)完整升級(jí)的包。任何版本的軟件都可以用這個(gè)包升級(jí)到指定的版本。比如,從android O升級(jí)到android P一般會(huì)通過(guò)完整升級(jí)包進(jìn)行升級(jí)。它是通過(guò)腳本,從Target包生成的。
(3)、增量升級(jí)包。
 這個(gè)是用來(lái)進(jìn)行增量升級(jí)的包。里面一般只包含了一些新版本對(duì)比老版本變化了的內(nèi)容。理所當(dāng)然的,這種升級(jí)包要求只能從指定的版本(版本1)升級(jí)到當(dāng)前新版本(版本2)。它是在版本1 和版本2 對(duì)應(yīng)的Target包基礎(chǔ)上生成的。
總結(jié)
以上是生活随笔為你收集整理的android P OTA 初探 —— 1、OTA简单介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
                            
                        - 上一篇: OTA 升级中的跟文件系统切换
 - 下一篇: OTA自动化测试解决方案