天天看點

Android系統Recovery工作原理之使用update.zip更新過程---updater-script腳本文法簡介以及執行流程(轉)

目前update-script腳本格式是edify,其與amend有何差別,暫不讨論,我們隻分析其中主要的文法,以及腳本的流程控制。

一、update-script腳本文法簡介:

        我們順着所生成的腳本來看其中主要涉及的文法。

        1.assert(condition):如果condition參數的計算結果為False,則停止腳本執行,否則繼續執行腳本。

        2.show_progress(frac,sec):frac表示進度完成的數值,sec表示整個過程的總秒數。主要用與顯示UI上的進度條。

        3.format(fs_type,partition_type,location):fs_type,檔案系統類型,取值一般為“yaffs2”或“ext4”。Partition_type,分區類型,一般取值為“MTD”或則“EMMC”。主要用于格式化為指定的檔案系統。事例如下:format(”yaffs2”,”MTD”,”system”)。

        4.mount(fs_type,partition_type,location,mount_point):前兩個參數同上,location要挂載的裝置,mount_point挂載點。作用:挂載一個檔案系統到指定的挂載點。

        5.package_extract_dir(src_path,destination_path):src_path,要提取的目錄,destination_path目标目錄。作用:從更新包内,提取目錄到指定的位置。示例:package_extract_dir(“system”,”/system”)。

        6.symlink(target,src1,src2,……,srcN):target,字元串類型,是符号連接配接的目标。SrcX代表要建立的符号連接配接的目标點。示例:symlink(“toolbox”,”/system/bin/ps”),建立指向toolbox符号連接配接/system/bin/ps,值得注意的是,在建立新的符号連接配接之前,要斷開已經存在的符号連接配接。

        7.set_perm(uid,gid,mode,file1,file2,……,fileN):作用是設定單個檔案或則一系列檔案的權限,最少要指定一個檔案。

        8.set_perm_recursive(uid,gid,mode,dir1,dir2,……,dirN):作用同上,但是這裡同時改變的是一個或多個目錄及其檔案的權限。

        9.package_extract_file(srcfile_path,desfile_paht):srcfile_path,要提取的檔案,desfile_path,提取檔案的目标位置。示例:package_extract_file(“boot.img”,”/tmp/boot.img”)将更新包中的boot.img檔案拷貝到記憶體檔案系統的/tmp下。

      10.write_raw_image(src-image,partition):src-image源鏡像檔案,partition,目标分區。作用:将鏡像寫入目标分區。示例:write_raw_image(“/tmp/boot.img”,”boot”)将boot.img鏡像寫入到系統的boot分區。

      11.getprop(key):通過指定key的值來擷取對應的屬性資訊。示例:getprop(“ro.product.device”)擷取ro.product.device的屬性值。

     12. ui_print(String): 用于在Flash Mode要顯示的内容

     13. delete(FilePath): 用于删除檔案的指令

     14. run_program(Shell, ScriptPath): 例如:run_program("/sbin/sh", "/system/bin/install.sh");

     15. umount(Path): 解除安裝檔案系統

     16. cmdlist:

二、updater-script腳本執行流程分析:

          先看一下在測試過程中用指令make otapackage生成的更新腳本如下:

下面分析下這個腳本的執行過程:

         ①比較時間戳:如果更新包較舊則終止腳本的執行。

         ②比對裝置資訊:如果和目前的裝置資訊不一緻,則停止腳本的執行。

         ③顯示進度條:如果以上兩步比對則開始顯示更新進度條。

         ④格式化system分區并挂載。

         ⑤提取包中的recovery以及system目錄下的内容到系統的/system下。

         ⑥為/system/bin/下的指令檔案建立符号連接配接。

         ⑦設定/system/下目錄以及檔案的屬性。

         ⑧将包中的boot.img提取到/tmp/boot.img。

         ⑨将/tmp/boot.img鏡像檔案寫入到boot分區。

         ⑩完成後解除安裝/system。

         以上就是updater-script腳本中的文法,及其執行的具體過程。通過分析其執行流程,我們可以發現在執行過程中,并未将更新包另外解壓到一個地方,而是需要什麼提取什麼。值得主要的是在提取recovery和system目錄中的内容時,一并放在了/system/下。在操作的過程中,并未删除或改變update.zip包中的任何内容。在實際的更新完成後,我們的update.zip包确實還存在于原來的位置。

三、總結

        以上的九篇着重分析了Android系統中Recovery模式中的一種,即我們做好的update.zip包在系統更新時所走過的流程。其核心部分就是Recovery服務的工作原理。其他兩種FACTORY RESET、ENCRYPTED FILE SYSTEM ENABLE/DISABLE與OTA INSTALL是相通的。重點是要了解Recovery服務的工作原理。另外詳細分析其更新過程,對于我們在實際更新時,可以根據我們的需要做出相應的修改。

<a href="http://blog.csdn.net/tody_guo/article/details/7948083">http://blog.csdn.net/tody_guo/article/details/7948083</a>