Android系統Recovery工做原理之使用update.zip升級過程分析(九)---u...

Android系統Recovery工做原理之使用update.zip升級過程分析(九)---updater-script腳本語法簡介以及執行流程



          目前update-script腳本格式是edify,其與amend有何區別,暫不討論,咱們只分析其中主要的語法,以及腳本的流程控制。
less

1、update-script腳本語法簡介:tcp

        咱們順着所生成的腳原本看其中主要涉及的語法。ionic

        1.assert(condition):若是condition參數的計算結果爲False,則中止腳本執行,不然繼續執行腳本。測試

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

        3.format(fs_type,partition_type,location):fs_type,文件系統類型,取值通常爲「yaffs2」或「ext4」。Partition_type,分區類型,通常取值爲「MTD」或則「EMMC」。主要用於格式化爲指定的文件系統。事例以下:format(」yaffs2」,」MTD」,」system」)。spa

        4.mount(fs_type,partition_type,location,mount_point):前兩個參數同上,location要掛載的設備,mount_point掛載點。做用:掛載一個文件系統到指定的掛載點。orm

        5.package_extract_dir(src_path,destination_path):src_path,要提取的目錄,destination_path目標目錄。做用:從升級包內,提取目錄到指定的位置。示例:package_extract_dir(「system」,」/system」)。ip

        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的屬性值。

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

          先看一下在測試過程當中用命令make otapackage生成的升級腳本以下:

assert(!less_than_int(1331176658, getprop("ro.build.date.utc"))); assert(getprop("ro.product.device") == "tcc8800" || getprop("ro.build.product") == "tcc8800"); 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("busybox", "/system/bin/cp", "/system/bin/grep", "/system/bin/tar", "/system/bin/unzip", "/system/bin/vi"); symlink("toolbox", "/system/bin/cat", "/system/bin/chmod", "/system/bin/chown", "/system/bin/cmp", "/system/bin/date", "/system/bin/dd", "/system/bin/df", "/system/bin/dmesg", "/system/bin/getevent", "/system/bin/getprop", "/system/bin/hd", "/system/bin/id", "/system/bin/ifconfig", "/system/bin/iftop", "/system/bin/insmod", "/system/bin/ioctl", "/system/bin/ionice", "/system/bin/kill", "/system/bin/ln", "/system/bin/log", "/system/bin/ls", "/system/bin/lsmod", "/system/bin/lsof", "/system/bin/mkdir", "/system/bin/mount", "/system/bin/mv", "/system/bin/nandread", "/system/bin/netstat", "/system/bin/newfs_msdos", "/system/bin/notify", "/system/bin/printenv", "/system/bin/ps", "/system/bin/reboot", "/system/bin/renice", "/system/bin/rm", "/system/bin/rmdir", "/system/bin/rmmod", "/system/bin/route", "/system/bin/schedtop", "/system/bin/sendevent", "/system/bin/setconsole", "/system/bin/setprop", "/system/bin/sleep", "/system/bin/smd", "/system/bin/start", "/system/bin/stop", "/system/bin/sync", "/system/bin/top", "/system/bin/umount", "/system/bin/uptime", "/system/bin/vmstat", "/system/bin/watchprops", "/system/bin/wipe"); set_perm_recursive(0, 0, 0755, 0644, "/system"); set_perm_recursive(0, 2000, 0755, 0755, "/system/bin"); set_perm(0, 3003, 02750, "/system/bin/netcfg"); set_perm(0, 3004, 02755, "/system/bin/ping"); set_perm(0, 2000, 06750, "/system/bin/run-as"); set_perm_recursive(1002, 1002, 0755, 0440, "/system/etc/bluetooth"); set_perm(0, 0, 0755, "/system/etc/bluetooth"); set_perm(1000, 1000, 0640, "/system/etc/bluetooth/auto_pairing.conf"); set_perm(3002, 3002, 0444, "/system/etc/bluetooth/blacklist.conf"); set_perm(1002, 1002, 0440, "/system/etc/dbus.conf"); set_perm(1014, 2000, 0550, "/system/etc/dhcpcd/dhcpcd-run-hooks"); set_perm(0, 2000, 0550, "/system/etc/init.goldfish.sh"); set_perm(0, 0, 0544, "/system/etc/install-recovery.sh"); set_perm_recursive(0, 0, 0755, 0555, "/system/etc/ppp"); set_perm_recursive(0, 2000, 0755, 0755, "/system/xbin"); set_perm(0, 0, 06755, "/system/xbin/librank"); set_perm(0, 0, 06755, "/system/xbin/procmem"); set_perm(0, 0, 06755, "/system/xbin/procrank"); set_perm(0, 0, 06755, "/system/xbin/su"); set_perm(0, 0, 06755, "/system/xbin/tcpdump"); show_progress(0.200000, 0); 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");
          下面分析下這個腳本的執行過程:

         比較時間戳:若是升級包較舊則終止腳本的執行。

         匹配設備信息:若是和當前的設備信息不一致,則中止腳本的執行。

         顯示進度條:若是以上兩步匹配則開始顯示升級進度條。

         格式化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包確實還存在於原來的位置。


3、總結

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

         不足之處,請你們不吝指正!
相關文章
相關標籤/搜索