一般在升級過程,都會提示用戶,請勿斷電,不管是android的STB,TV還是PHONE,或者是其他的終端設備,升級過程,基本上都可以看到“正在升級,請勿斷電”,然后有個進度條,顯示升級的進度。
但是從系統安全的角度考慮,如果用戶真斷電了,我們仍然需要能夠從異常掉電的情況中,恢復系統或者繼續升級。
我們先理解下recovery的過程,我們升級過程,其實分為兩個階段,升級包校驗過程,以及升級包更新過程:
2.1 校驗過程掉電
在升級包校驗過程,是recovery對升級包zip的完整性以及合法性進行校驗,不會寫入任何數據,此時掉電,系統不受任何影響
2.2 更新升級包過程掉電
更新過程,會從升級包zip中提取數據,寫入到flash的分區中,此時如果掉電,可能系統就被寫壞了,在第一節中,我們了解了,其實我們是有兩個系統的:
Android啟動: uboot -> boot -> system
Recovery啟動:uboot -> recovery
也就是我們在recovery中,可以更新android系統需要所有的分區,但是發現有個問題,recovery本身依賴uboot以及recovery分區,那么recovery如果在更新uboot或者recovery分區過程掉電,那么掉電之后recovery是無法正常啟動的。
我們分為三種情況討論:
更新掉電區間
2.2.1 更新logo boot system等分區過程掉電
此過程,recovery系統仍然OK,我們重新上電之后,可以繼續進入recovery系統升級即可。
2.2.2 更新recovery分區掉電。
Google原生的recovery分區升級是在android中完成的,recovery更新android,android更新recovery,無論何時,都有一個系統正常,保證了系統不會變磚,recovery更新android的流程。
Recovery通過update.zip更新除recovery分區外的所有分區。
Android通過/system/etc/install-recovery.sh 把/system/etc/recovery-resource.dat更新到recovery分區
2.2.3更新uboot掉電
Uboot是我們系統的啟動分區。如果損壞就無法啟動,目前國內,基本上廠商都是使用的是emmc flash,emmc包含有BOOT0 BOOT1 USER部分的,一般我們會存儲三份uboot鏡像,這樣其實我們,在emmc上面是存儲了三份uboot,如果升級掉電,損壞了其中一個,還有兩個uboot是可以啟動的,所以不用擔心,更新uboot掉電導致的無法啟動問題。
有些人就有疑問了,如果是nand flash那么就沒有BOOT0 BOOT1了,怎么來保證呢,其實道理是相同的,我們可以在nand flash上面存儲兩份uboot,這樣如果損壞了其中一個,還有一個uboot是好的。
目前來看,國內做android設備的廠商,基本上都是使用的emmc,emmc等同於nand +壞塊管理模塊,所以emmc比nand的價格高一些,但是少了壞塊的處理,並且最終都是由消費者買單,所以普遍上廠商都樂於使用emmc存儲。
2.3 總結
升級校驗過程掉電,不影響系統本身。
升級更新過程掉電,可以保證重新上電之后進入recovery繼續升級。對於特殊分區,像uboot分區,我們需要特殊進行備份處理。
2.4 備注
上面講到的是整包升級掉電,還有一個特殊的升級,就是差分包升級,如果是差分包升級過程掉電呢,還可以繼續升級嗎?我們在下一節中詳解。