系統從bootable/recovery/updater中構建updater二進位制程式,並且在ota更新包裡面使用他.
更新包本身是乙個.zip壓縮包檔案(ota_update.zip,incremental_ota_update.zip),壓縮包內包含可執行二進位制程式 meta-inf/com.google/android/update-binary .
updater包含幾個內建函式和用於可擴充套件指令碼語言(edify)的直譯器,可擴充套件指令碼語言支援與更新任務相關的命令.updater從.zip中的 meta-inf/com/google/android/updater-script查詢指令碼.
注意:使用edify指令碼和內建的函式不是命令,但是如果你需要除錯這個更新檔案的話是非常有用的
edify語法
乙個edify指令碼是乙個單一的語句,在指令碼中,所有的值都是字串.空字串在乙個boolean上下文中是false,其他所有的字串都是true.edify支援下面的操作(都是通常的含義)
(expr )
expr + expr # string concatenation, not integer addition
expr == expr
expr != expr
expr && expr
expr || expr
! expr
if expr then expr endif
if expr then expr else expr endif
function_name(expr, expr,...)
expr; expr
任何由a-z,a-z,0-9,_,:,/,.這些字元組成的,凡不是保留字的,都看作是字串.(保留字是if else then endif).字串使用雙引號因起來,下面是如何建立空格和其他不在上面集合中的自負值.\n,\t,\」,和\為轉義字元.
&&和||操作符是和我們平時程式設計的時候一樣的,下面兩個是等價的:
e1 && e2
if e1 then e2 endif
;操作符號是乙個序列點;他的意思是,首先分析左邊的表示式,然後分析右邊的表示式.他的值是右邊表示式的值.分號也用於乙個表示式的後面,像是c語言風格的模擬.
prepare();
do_other_thing("argument");
finish_up();
內建函式
大多數更新功能都被包含在可用的函式中被指令碼執行.(在lisp意義上,嚴格的說這些是巨集而不是函式,他們需要分析所有的引數).除非另有說明,函式返回true表示執行成功,返回false表示執行出錯.如果你想在出錯的時候停止指令碼的執行,使用abort()或者是asset()函式.在updater中可用的函式集合也可以被擴充套件提供裝置特定功能(後面會講到).
getprop(key)
返回系統屬性key的值(如果沒有定義,返回空字串).被recovery分割槽定義的系統屬性值不必和主系統定義的一樣.這個函式在recovery模式中返回值.
greater_than_int(a, b)
如果a比b大的話,返回true
ifelse(cond, e1[, e2])
分析條件,如果條件為真,返回e1的值,如果條件為假,返回e2的值(如果存在的話).」if…else..then..endif」是該函式的乙個語法糖.
is_mounted(mount_point)
如果檔案系統在掛載點被掛載了返回true
is_substring(needle, haystack)
如果needle是haystack的子串的話返回true
less_than_int(a, b)
如果a小於b的話返回true
mount(fs_type, partition_type, name, mount_point)
掛載fs_type在mount_point的檔案系統.partition_type一定是下面的乙個:
package_extract_dir(package_dir, dest_dir)
從package_dir下提取所有的檔案,並且將他們寫到相應的dest_dir下面.任何存在的檔案都要被重寫.
package_extract_file(package_file[, dest_file])
從更新包中提取乙個單一的package_file,並且將他們寫入到dest_file中,如果必要的話,重寫存在的檔案.如果沒有dest_dir引數的話,將包檔案的內容作為二進位制塊返回.
read_file(filename)
讀取檔案並且返回他的內容作為乙個二進位制塊.
rename(src_filename, tgt_filename)
run_program(path[, arg, ...])
在path中,通過傳遞args執行二進位制程式.返回程式的退出狀態.
set_metadata(filename, key1, value1[, key2 , value2, ...])
給給定的檔名稱的鍵賦值.舉個例子:
set_metadata("/system/bin/netcfg", "uid", 0, "gid", 3003, "mode", 02750, "selabel", "u:object_r:system_file:s0", "capabilities", 0x0).
set_metadata_recursive(dirname, key1, value1[, key2, value2, ...])
遞迴設定給定目錄和他的子檔案的鍵和值.舉個例子:
set_metadata_recursive("/system", "uid", 0, "gid", 0, "fmode", 0644, "dmode", 0755, "selabel", "u:object_r:system_file:s0", "capabilities", 0x0)
set_progress(frac)
在由show_progress()呼叫建立的塊中設定進度條的位置.frac必須在[0.0,1.0]區間內.進度條不會後退.嘗試這樣的做法被忽略了.
sha1_check(blob[, sha1])
blob引數是有read_file()返回的型別的塊或者是package_extract_file()的乙個引數形式.如果沒有sha1引數,該函式返回塊的sha1雜湊.如果存在乙個或多個sha1引數,如果sha1和乙個引數相等的話,返回sha1雜湊,如果沒有相等的,則返回空字串.
show_progress(frac, secs)
推進進度條在sec秒中到達frac長度.secs可能為0,在這種情況下,進度條不會被自動推進.
sleep(secs)
睡眠secs秒(必須是整數)
stdout(expr[, expr, ...])
分析每乙個表示式並且將他的值轉儲到stdout.在除錯的時候有用.
symlink(target[, source, ...])
建立所有原始碼為鏈結到目標中.
tune2fs(device[, arg, …])
在裝置上調整可調引數args
ui_print([text, ...])
連線所有的文字引數並且將結果列印到ui中(如果使用者轉換到文字顯示的話結果就是可視的)
unmount(mount_point)
解除安裝在掛載點掛載的檔案系統
wipe_block_device(block_dev, len)
清楚給定塊裝置block_dev的len位的資料.
wipe_cache()
在成功安裝之後,清空cache分割槽
write_raw_image(filename_or_blob, partition)
在filename_or_blob中把映象寫入到mtd分割槽中. filename_or_blob可以是乙個字串名稱是本地檔案或者是乙個包含資料的塊值引數.為了能夠從ota包中複製乙個檔案到分割槽中,使用:
write_raw_image(package_extract_file("zip_filename"), "partition_name")
注意:之前android 4.1,僅僅接收檔名稱,所以,為了能夠完成這個工作,資料需要首先去解壓縮到乙個臨時本地檔案中.
OTA更新包內部
系統從bootable recovery updater中構建updater二進位制程式,並且在ota更新包裡面使用他 更新包本身是乙個.zip壓縮包檔案 ota update.zip,incremental ota update.zip 壓縮包內包含可執行二進位制程式 meta inf com.g...
npm 發布 更新包
更新版本號 包的版本號可表示為x.y.z,分別對應 major minor 和 patch。所以,更新版本號可使用 npm version major npm version minor npm version patch發布 npm publish註冊或者登入 npm 賬號 可在npm官網註冊,或...
python如何更新包
python如何更新包 python安裝新包,pip是很好用的安裝工具。pip list 可以查詢所有已安裝的包和版本。怎麼知道本地安裝包的版本是否有可以更新的新版本呢?通過pip list函式可以實現。具體實現方式如下 pip list outdated format legacy pip lis...