android ota机制,Android OTA简介
Android?OTA?簡介
OTA?全稱?over the air ,OTA升級是Android系統(tǒng)提供的標(biāo)準(zhǔn)軟件升級方式。
它功能強(qiáng)大,提供了完全升級、增量升級模式,可以通過SD卡升級,也可以通過
網(wǎng)絡(luò)升級。
這里,首先介紹SD卡升級,網(wǎng)絡(luò)升級原理和SD卡大致一樣.下面我們將介紹這一過程.
在升級前,我們要準(zhǔn)備升級包,所有編譯好的包都命名為update.zip ,不管是增量升級還
是完全升級.
1.生成完全升級包.
./mk prj new
./mk prj otapackage
編譯完成之后,將在\out\target\product\prj\目錄下生成prj-ota-eng.root.zip,這個
zip將是我們升級用的包,我們要把他改名為update.zip ,然后copy?到SD卡的根目錄下.
在運(yùn)行上面指令的過程中,同時會在?out\target\product\prj\obj\PACKAGING\target_files_intermediates\
目錄下生成prj-target_files-eng.root.zip這個文件非常重要,我們將他保存為old.zip
它是我們做增量包的基礎(chǔ)文件.
2.生成增量包.
當(dāng)代碼有更新時,我們更新新的代碼.同樣運(yùn)行./mk prj otapackage產(chǎn)生代碼更改后的完全升級包.
這時同樣會在out\target\product\prj\obj\PACKAGING\target_files_intermediates\?目錄下生成
prj-target_files-eng.root.zip?我們把它重命名為new.zip,接下來我們完成生成增量包的最后一步.
運(yùn)行./build/tools/releasetools/ota_from_target_files-iold.zip new.zip diff.zip ,產(chǎn)生new.zip
到old.zip?的增量包diff.zip ,同樣我們要把它命名為update.zip ,可以copy?到SD卡的更目錄下,做增量
式升級使用.
(備注:如果升級有特殊的要求,比如格式化data?分區(qū),更新uboot等分區(qū),需要修改ota_from_target_files.py?這個腳本)
上面的內(nèi)容介紹了如何準(zhǔn)備update.zip?升級文件.接下來介紹升級過程.先說一下正常開機(jī)過程,
按power?鍵開機(jī),uboot?在運(yùn)行完之后,將把boot?分區(qū)的內(nèi)容boot.img?文件加載到內(nèi)存,然后跳轉(zhuǎn)到boot中
linux內(nèi)核的開始位置,運(yùn)行l(wèi)inux?內(nèi)核代碼,在內(nèi)核的最后執(zhí)行正常啟動時的init.rc?文件,掛載system分區(qū)
到/system?目錄下,掛載data?分區(qū)到?/data?目錄下.啟動虛擬機(jī)等相關(guān)的一下服務(wù).
要升級程序,開機(jī)的時候,需要按住power?和下vol?鍵,這樣uboot?在運(yùn)行完之后將加載recovery分區(qū)
的recovery.img?文件到內(nèi)存.現(xiàn)在我們看一下,recovery.img?這個鏡像里面有什么內(nèi)容.詳細(xì)的內(nèi)容我們
可以查看build/core/makefile?文件,在這個文件里面我們查找?Recovery image ,從這里開始的內(nèi)容,主要
是打包recovery.img?的內(nèi)容.關(guān)于recovery.img的具體內(nèi)容,說的簡單點(diǎn),就是linux?內(nèi)核和將\out\target\
product\prj\recovery目錄打包成ramdisk?的一個鏡像的集合.對比正常開機(jī)的boot.img鏡像,區(qū)別為boot.img
里面的ramdisk鏡像是out\target\product\prj\root?打包來的.其內(nèi)核文件是同一個文件. recovery.img
鏡像里面的ramdisk?文件系統(tǒng)包含的用于數(shù)據(jù)升級相關(guān)的bin文件,比如gzip,recovery?等重要的程序.
在機(jī)器加載recovery.img ,執(zhí)行完內(nèi)核后,運(yùn)行recovery?模式下的init.rc?該文件在bootable\recovery\etc\
目錄下,我們拿它和正常開機(jī)的init.rc?文件相比.發(fā)現(xiàn)recovery?模式的init.rc?僅僅新建了幾個目錄,包括sdcard,
用于SD卡的掛載點(diǎn).啟動了2個service,一個ueventd,一個recovery的主菜單程序recovery(該文件是bootable\recovery\recovery.c?編程而成),內(nèi)容非常簡單.在recovery?的主界面,選擇更新程序后,recovery將會
解壓update.zip?文件,執(zhí)行其中的\META-INF\com\google\android\updater-script ,recovery會對腳本進(jìn)行解析.
下面是這個腳本的部分摘錄.
show_progress(0.500000, 0);
format("yaffs2", "MTD", "system");
mount("yaffs2", "MTD", "system", "/system");
package_extract_dir("recovery", "/system");
package_extract_dir("system", "/system");
symlink("toolbox", "/system/bin/cat", "/system/bin/chmod",
"/system/bin/chown", "/system/bin/cmp", "/system/bin/date",
.......
"/system/bin/wipe");
set_perm_recursive(0, 0, 0755, 0644, "/system");
........
show_progress(0.200000, 10);
assert(package_extract_file("boot.img", "/tmp/boot.img"),
write_raw_image("/tmp/boot.img", "boot"),
delete("/tmp/boot.img"));
show_progress(0.100000, 0);
unmount("/system");
(以上腳本為系統(tǒng)自動生成)
從腳本可以看到,首先格式化system區(qū)分,然后把updata.zip?里面的system目錄的內(nèi)容解壓到system
分區(qū).接著修改system分區(qū)下文件的權(quán)限.最后將boot.img?鏡像寫回到boot?分區(qū).
從以上的介紹,可以看到android?的功能非常強(qiáng)大,在recovery?模式下,linux?已經(jīng)已經(jīng)完全跑
了起來.除了apk,jar?不能運(yùn)行之外,你可以做任何你想做的事情.上面的例子中,更新了system分區(qū)
和boot分區(qū),如果需要還可以更新?uboot分區(qū),logo分區(qū),格式化data?分區(qū)等等?.
關(guān)于OTA的網(wǎng)絡(luò)實(shí)現(xiàn),實(shí)際上是檢查網(wǎng)絡(luò)上的更新,或者網(wǎng)絡(luò)通知更新.把更新包(update.zip)
下載到本地,在用戶的選擇下,重啟機(jī)器自動進(jìn)入recovery模式,執(zhí)行上面的過程.
總結(jié)
以上是生活随笔為你收集整理的android ota机制,Android OTA简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OTA测试
- 下一篇: 【华为云技术分享】一文看懂什么是汽车OT