2012年6月1日 星期五

ROM定制之Edify語法簡介(Updater-Script) _詳細說明

http://bbs.fengbao.com/thread-605539-1-1.html

最近在學習ROM定制,在Updater-Script語法上花了很多時間,找了不少資料,都不是很完整。
後來無意中找到一篇英文文檔,就整理了一下,必進行了翻譯。
原地址:http://www.freeyourandroid.com/guide/introdution_to_edify
水平有限,難免有誤,請高手們見笑。
詳細內容如下:

Edify語法簡介(Updater-Script)翻譯:Kawvin
這是Android系統來運行 updater-scripts的Edify語言的基本介紹。
大部分的 Edify 命名都是函數,當調用這些函數結束的時候,會返回數據給腳本。當然,你也可以使用這些函數的來確認成功與否,例如 :
ifelse(mount("yaffs2", "MTD", "system", "/system") == "system", ui_print("Successfully Mounted!"), ui_print("Mount Failed!");

這個命令會嘗試去掛載命名為“ system ”的“ MTD ”分區到“ /system ”。如果掛載成功,腳本會顯示“ Successfully Mounted! ”,否則會顯示“ Mount Failed!”。

現面是用在 Edify  Updater-script 中的函數例子 :

函數名稱: mount
函數語法 : mount(fs_type, partition_type, location, mount_point)
參數詳解 : fs_type-----------------"yaffs2"  "ext4"
partition_type----------"MTD"  "EMMC"
location ----------------- 分區 (partition)  驅動器 (device)
mount_poin------------ 掛載文件系統的目標文件夾 (target folder to mount FS)
作用解釋 : 掛載一個文件系統到指定的掛載點
 : 掛載成功則返回掛載點,失敗返回 null
函數示例 : mount("MTD", "system", "/system");掛載system分區,設置返回指針"/system”
mount("vfat", "/dev/block/mmcblk1p2", "/system"); 掛載/dev/block/mmcblk1p2,返回指針"/system”

函數名稱: is_mounted
函數語法 : is_mounted(mount_point)
參數詳解 : mount_point ----------- 字符串,檢查是否已經掛載的掛載點
作用解釋 : 檢查文件系統是否掛載
 : 掛載成功則返回掛載點,失敗返回 null
函數示例 :

函數名稱: unmount
函數語法 : unmount(mount_point)
參數詳解 : mount_point----------- 字符串,要解除掛載的掛載點
作用解釋 : 解除文件系統掛載
 : 解除掛載成功則返回掛載點,失敗返回 null
函數示例 : unmount("/system");卸載/system分區

函數名稱: format
函數語法 : format(fs_type, partition_type, location)
參數詳解 : fs_type----------------- 字符串,數據為 "yaffs2"  "ext4"
partition_type---------- 字符串 , "MTD"  "EMMC"
location----------------- 字符串 , 分區 (partition)  驅動器 (device)
作用解釋 : 格式化為指定的文件系統
函數示例 : format("MTD", "system");格式化system分區

函數名稱: delete
函數語法 : delete(file1, file2, ..., fileN)
參數詳解 : 字符串,要刪除的文件
作用解釋 : 刪除一個文件。最少指定一個文件;多個文件可以做為多個參數指定
函數示例 : delete("/data/zipalign.log");刪除文件/data/zipalign.log

函數名稱: delete_recursive
函數語法 : delete_recursive(dir1, dir2,...,dirN)
參數詳解 : 字符串,要遞歸刪除的目錄
作用解釋 : 刪除文件夾及其包含的所有內容。最少指定 1 個目錄;多個目錄可以做為多個參數指定
函數示例 : delete_recursive("/data/dalvik-cache");刪除文件夾/data/dalvik-cache

函數名稱: show_progress
函數語法 : show_progress(frac, sec)
參數詳解 : frac ---------------------- 進度完成數值
Sec---------------------- 總秒數
作用解釋 : 顯示在 Recovery 系統中進度
函數示例 : show_progress(0.1, 10);show_progress下面的操作可能進行10s,完成後進度條前進0.1(也就是10%)

函數名稱: set_progress
函數語法 : set_prograss(frac)
參數詳解 : frac--------------------- 進度數值
函數示例 :

函數名稱: package_extract_dir
函數語法 : package_extract_dir(package_path, destination_path)
參數詳解 : package_path---------- 字符串,升級包內要提取的目錄
destination_path -------- 字符串,提取文件的目標目錄
作用解釋 : 提取升級包內目錄中的所有文件到指定的目標目錄
函數示例 : package_extract_dir("system", "/system");釋放ROM包裡system文件夾下所有文件和子文件夾至/system

函數名稱: package_extract_file
函數語法 : package_extract_file(package_path)  package_extract_file(package_path, destination_path)
參數詳解 : package_path---------- 字符串,升級包內要提取的文件
destination_path------- 字符串,提取文件的目標目錄
作用解釋 : 提取升級包內的單個文件到指定的目標目錄
函數示例 : package_extract_file("my.zip", "/system");解壓ROM包裡的my.zip文件至/system

函數名稱: file_getprop
函數語法 : file_getprop(file, key)
參數詳解 : file---------------------- 字符串,要檢查的文件名
Key---------------------- 字符串,返回數據中的文件的鍵名字
作用解釋 : 在格式 "key"="value" 的文件中取得文件屬性值
函數示例 :

函數名稱: symlink
函數語法 : symlink(target, src1, src2, ..., srcN)
參數詳解 : target------------------- 字符串,符號鏈接的目標
srcX --------------------- 字符串,要創建的符號鏈接的目標點
作用解釋 : 在創建新的符號鏈接之前,要斷開已經存在的符號鏈接
函數示例 : symlink("toolbox", "/system/bin/ps");建立指向toolbox的符號鏈接/system/bin/ps

函數名稱: set_perm
函數語法 : set_perm(uid, gid, mode, file1, file2, ..., fileN)
參數詳解 : uid ---------------------- 用戶 ID(user id)
Gid ---------------------- 用戶組 ID(group id)
Mode-------------------- 權限模式 (permission mode)
fileX--------------------- 要設置許可的文件 (file to set permission on)
作用解釋 : 設置單個文件或一系列文件的權限,最少指定 1 個文件,前 4 個參數是必須的
函數示例 : set_perm(0,2000,0550, "system/etc/init.goldfish.sh");設置手機 system 中的 etc/init.goldfish.sh 的用戶為 root ,用戶組為 shell ,所有者以及所屬用戶組成員可以進行讀取和執行操作,其他用戶無操作權限)
這裡 0 代表用戶為 root 
2000 代表用戶組為 shell 我們來說明 0550 這組數據,這組數據的最後三位 550 ,分別代表“所有者 \ 組用戶 \ 其他用戶”的權限,也就是我們在 RE 管理中“用戶 \ 群組 \ 其他”三行。我們以 XXX 來表示這三組權限,其中:× =4 讀的權限× =2 寫的權限× =1 執行的權限我們必須首先了解用數字表示的屬性的含義: 0表示沒有權限, 1 表示可執行權限, 2 表示可寫權限, 4 表示可讀權限,然後將其相加。所以數字屬性的格式應為 3 個從 0  7 的八進制數。例如,如果想讓某個文件的屬主有 "  /  " 二種權限,需要把 4( 可讀 )+2( 可寫 )  6(  /  ) 若要 rwx 屬性則 4+2+1=7 ;若要 rw- 屬性則 4+2=6 ;若要 rx 屬性則 4+1=5常用修改權限的命令: Set_perm 0 0 0600 ××× ( 只有所有者有讀和寫的權限 ) Set_perm 0 0 0644 ××× ( 所有者有讀和寫的權限,組用戶只有讀的權限 )Set_perm 0 0 0700 ××× ( 只有所有者有讀和寫以及執行的權限 ) Set_perm 0 0 0666 ××× ( 每個人都有讀和寫的權限 ) Set_perm 0 0 0777 ××× ( 每個人都有讀和寫以及執行的權限 )













函數名稱: set_perm_recursive
函數語法 : set_perm_recursive(uid, gid, dirmode, filemode, dir1, dir2, ...dirN)
參數詳解 : uid---------------------- 用戶 ID(user id)
Gid---------------------- 用戶組 ID(group id)
Dirmode---------------- 指定目錄內的目錄的權限
Filemode--------------- 指定目錄內的文件的權限
dirX--------------------- 要設置權限的目標
作用解釋 : 設置單個目錄或一系列目錄的里面的所有文件的權限,最少指定 1 個目錄, 5 個參數都是必須的
函數示例 : set_perm_recursive 0 0 0755 0644 SYSTEM:app ;設置手機 system/app 文件夾及其中文件的用戶為 root ,用戶組為 root  app 文件夾權限為所有者可以進行讀、寫、執行操作,其他用戶可以進行讀取和執行操作,其中的文件的權限為所有者可以進行讀寫操作,其他用戶可以進行讀取操作

函數名稱: getprop
函數語法 : getprop(key)
參數詳解 : key--------------------- 字符串,想要係統返回的屬性
作用解釋 : 這個函數是用來返指定的屬性的值。它是用來從 build.props 文件中查詢手機的信息的。
函數示例 :

函數名稱: write_raw_image
函數語法 : write_raw_image(file, partition)
參數詳解 : file---------------------- 字符串,要讀取的 Img 源文件
Partition----------------- 字符串,要寫入 Img 文件的目標分區
作用解釋 : 這個函數是用來寫 Img 文件到分區
函數示例 : write_raw_image("/tmp/boot.img", "boot")將yaffs2格式的boot包直接寫入boot分區

函數名稱: apply_patch
函數語法 : apply_patch(srcfile, tgtfile, tgtsha1, tgtsize, sha1_1, patch_1, ..., sha1_x, patch1_x)
參數詳解 : srcfile------------------- 字符串,要打補丁的源文件 ( 要讀入的文件 )
Tgtfile------------------- 字符串,補丁文件要寫入的目標文件
tgtsha1----------------- 字符串,寫入補丁文件的目標文件的 sha1 哈希值
sha1_x------------------ 字符串,要寫入目標文件的補丁數據的 sha1 哈希值
patch1_x---------------- 字符串,實際上應用到目標文件的補丁
作用解釋 : 這個函數是用來打補丁到文件。
函數示例 :

函數名稱: apply_patch_check
函數語法 : apply_patch_check(file, sha1_1, ..., sha1_x)
參數詳解 : file---------------------- 字符串,要檢查的文件
sha1_x------------------ 要檢查的哈希值
作用解釋 : 檢查文件是否已經被打補丁,或者能不能被打補丁。需要檢查“ applypatch_check ”函數調用的源代碼。
函數示例 :

函數名稱: apply_patch_space
函數語法 : apply_patch_space(bytes)
參數詳解 : bytes------------------- 檢查的字節的數字
作用解釋 : 檢查緩存來確定是否有足夠的空間來寫入補丁文件並返回一些數據。
函數示例 :

函數名稱: read_file
函數語法 : read_file(filename)
參數詳解 : filename---------------- 字符串,要讀取內容的文件名
作用解釋 : 這個函數返回文件的內容
函數示例 :

函數名稱: sha1_check
函數語法 : sha1_check(data)  sha1_check(data, sha1_hex, ..., sha1_hexN)
參數詳解 : data--------------------- 要計算 sha1 哈希值的文件的內容 - 必須是只讀文件格式
sha1_hexN-------------- 文件數據要匹配的特定的十六進制 sha1_hex 哈希值字符串
作用解釋 : 如果只指定 data 參數,這個函數返回 data 參數的十六進制 sha1_hex 哈希值字符串。其他參數用來確認你檢查的文件是不是列表中的哈希值的一個。它返回匹配的哈希值,或者在沒有匹配任何哈希值時返回空。
函數示例 :

函數名稱: ui_print
函數語法 : ui_print(msg1, ..., msgN)
參數詳解 : msg---------------------- 字符串,要處理過程中輸出給用戶的信息
作用解釋 : 在腳本運行的時候,在控制台顯示的信息。最少要指定 1 個參數,你可以指定額外的 msg 參數,並且它們會連接起來輸了
函數示例 : ui_print("It s ready!"); 屏幕打印It's ready!

函數名稱: run_program
函數語法 : run_program(prog, arg1, .., argN)
參數詳解 : prog -------------------- 字符串,要執行的程序
argN-------------------- 字符串,要執行的程序的運行參數
作用解釋 : 以指定的參執行程序
函數示例 : run_program("/system/xbin/installbusybox.sh");運行installbusybox.sh腳本文件

函數名稱: ifelse
函數語法 : ifelse(condition, truecondition, falsecondition)
參數詳解 : condition---------------- 要運算的表達式
Truecondition ----------- 當值為 True 時執行的 Edify 腳本塊
Falsecodnition----------- 當值為 False 時執行的 Edify 腳本塊
作用解釋 : 這是 If-then 結構的 Edify 腳本語言。在真條件或非條件下語句可以是單條 Edify 命令或者腳本塊。腳本塊可以用圓括號來界定,用分號來隔開。
函數示例 :

函數名稱: abort
函數語法 : abort()
參數詳解 : 沒有參數
作用解釋 : 中止腳本執行
函數示例 :

函數名稱: assert
函數語法 : assert(condition)
參數詳解 : condition---------------boolean
作用解釋 : 如果 condition 參數的計算結果為 False ,則停止腳本執行,否則繼續執行腳本
函數示例 : assert(package_extract_file("boot.img","/tmp/boot.img"),write_raw_image("/tmp/boot.img","boot"),delete("/tmp/boot.img") )
執行package_extract_file,如果不返回錯誤則執行write_raw_image,如果write_raw_image不出錯則執行delete

沒有留言:

張貼留言