系統會從 bootable/recovery/updater
建構更新器二進位檔,並使用該二進位檔
封裝到 OTA 套件中
ota_update.zip
、
incremental_ota_update.zip
),內含可執行的二進位檔
META-INF/com/google/android/update-binary
。
Updater 包含數個內建函式,以及適用於可擴充指令碼的解譯器
語言 (edify) 來支援一般更新相關工作的指令。更新工具樣式
該檔案所在的指令碼專用 .zip 檔案
META-INF/com/google/android/updater-script
。
注意:在 edify 指令碼和/或內建函式中,並不是常見的情況 但如果您需要對更新檔案進行偵錯,則能解決問題。
Edify 語法
Eify 指令碼是單一運算式,其中所有值都是字串。空白字串是 布林結構定義中的 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,然後是 endif.)。字串 常值也可能會以雙引號括住;也就是如何使用空格字元和 其他字元。\n、\t、\" 和 \\ 會在引號內做為逸出字元 字串,如 \x##。
和和 ||運算子是短路如果 邏輯結果則取決於左側。以下是相等的結果:
e1 && e2 if e1 then e2 endif
;運算子是序列點應該先評估左側的左側 。其值則是右側運算式的值。也可能會在清單中顯示分號 因此,此效果會模擬 C 樣式陳述式:
prepare(); do_other_thing("argument"); finish_up();
內建函式
大多數的更新功能都包含在可由指令碼執行的函式中。
(嚴格說來,這些術語指的是「巨集」,而不是 Lisp 的「函式」。
因為他們不需要評估所有引數)。除非另有說明,否則函式會傳回
成功時傳回 true,發生錯誤時則為 false。如果您希望發生錯誤
指令碼,請使用 abort()
和/或 assert()
函式。其中一組
此外,也可以擴充更新工具所提供的函式
裝置專屬功能
abort([msg])
- 立即取消執行指令碼,並加上選擇性的 msg。如果使用者 已開啟文字顯示功能,訊息就會顯示在復原記錄和畫面上。
-
assert(expr[, expr, ...])
- 依次評估每個 expr。如果有任何 False,則立即取消執行。 「assert failed」訊息失敗運算式的來源文字
-
apply_patch(src_file, tgt_file, tgt_sha1, tgt_size, patch1_sha1, patch1_blob, [...])
-
將二進位修補程式套用至 src_file,以產生 tgt_file。如果
所需目標與來源相同,請傳送「-」tgt_file 專用。tgt_sha1 和
tgt_size 是目標檔案的最終 SHA1 雜湊和大小。剩餘的
引數必須成對表示:SHA1 雜湊 (40 個字元的十六進位字串) 和 blob。blob
是來源檔案目前內容包含指定 SHA1 時要套用的修補程式。
修補作業會以安全的方式完成,確保目標檔案 所需的 SHA1 雜湊和大小,或是未經變更,否則無法還原 中間狀態如果程序在修補期間中斷,目標檔案可能是 處於中間狀態一個副本存在於快取分區,因此重新啟動更新 才能順利更新檔案
系統支援特殊語法處理記憶體技術裝置 (MTD) 的內容 分割為檔案,可修補原始分區 (例如開機)。如何讀取 MTD 就必須知道要讀取多少資料,因為分區沒有 建立檔案結束記號您可以使用字串 "MTD:分區:size_1:sha1_1:size_2:sha1_2"作為 來讀取指定分區至少須指定一個值 (size, sha-1) 配對;如有多個 您預期讀取內容的可能性
-
apply_patch_check(filename, sha1[, sha1, ...])
-
如果 filename 的內容或快取分區中的臨時副本,傳回 true
(如果有的話) 的 SHA1 總和檢查碼等於其中一個指定的 sha1 值。
sha1 值會指定為 40 位數。這個函式與
sha1_check(read_file(filename), sha1 [, ...])
檢查快取分區副本,apply_patch_check()
因此即使 檔案因apply_patch() update
中斷而損毀。 apply_patch_space(bytes)
- 如果可用於套用二進位檔的暫存空間至少 位元組,則傳回 true 修補程式
-
concat(expr[, expr, ...])
- 評估每個運算式並將其串連。+ 運算子是這種語法的語法糖 函式在兩個引數的特殊案例中 (但函式形式可以使用任意數量的 運算式)。運算式須為字串;但無法串連 blob
-
file_getprop(filename, key)
-
讀取指定的檔案名稱,並將其解讀為屬性檔案 (例如
/system/build.prop
),並傳回指定鍵的值,或 如果沒有 key,則為空白字串。 -
format(fs_type, partition_type, location, fs_size, mount_point)
-
重新格式化指定分區。支援的分區類型:
- fs_type="yaffs2"和 partition_type="MTD"。位置必須是 MTD 的名稱 分區;就會建立一個空的 yaffs2 檔案系統其餘引數為 未使用的。
- fs_type="ext4"和 partition_type="EMMC"。位置必須是 這裡有一個空白的 ext4 檔案系統。如果 fs_size 為 0, 就會佔據整個分區如果 fs_size 為正數, 檔案系統會使用分區的前 fs_size 個位元組。如果 fs_size 是 負數,檔案系統會接受加總最後一個 |fs_size| 個位元組
- fs_type="f2fs"和 partition_type="EMMC"。位置必須是 fs_size 必須為非負數。如果 fs_size 為 0, 就會佔據整個分區如果 fs_size 為正數, 檔案系統會使用分區的前 fs_size 個位元組。
- mount_point 是檔案系統的未來掛接點。
getprop(key)
- 傳回系統屬性 key 的值 (如未定義,則為空白字串)。 復原分區定義的系統屬性值不一定相同 以及主系統的位址這個函式會傳回復原中的值。
-
greater_than_int(a, b)
- 只有在 (iff) a (解釋為整數) 大於時,才會傳回 true b (解讀為整數)。
-
ifelse(cond, e1[, e2])
- 會評估 cond;如果為 true,則會評估並傳回 e1 的值。 否則,就會評估並傳回 e2 (如有)。「if ... else ...」則 ... endif」就是這個函式的語法糖
is_mounted(mount_point)
- 如果檔案系統已掛接在 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 必須為
下列其中一項:
-
MTD:名稱為 MTD 分區的名稱 (例如系統、使用者資料;請參閱
請參閱裝置的
/proc/mtd
以取得完整清單)。 - EMMC。
根據預設,復原功能不會掛接任何檔案系統 (如果使用者 從 SD 卡手動安裝套件);指令碼必須將任何 需要修改的分區
-
MTD:名稱為 MTD 分區的名稱 (例如系統、使用者資料;請參閱
請參閱裝置的
-
package_extract_dir(package_dir, dest_dir)
- 從 package_dir 下的套件擷取所有檔案,然後將檔案寫入 dest_dir 底下的對應樹狀結構。現有的檔案都會遭到覆寫。
-
package_extract_file(package_file[, dest_file])
- 從更新套件擷取單一 package_file 並寫入 dest_file,覆寫現有檔案。如果沒有 dest_file 引數,會以二進位 blob 的形式傳回套件檔案的內容。
read_file(filename)
- 讀取 filename 並傳回其內容為二進位 blob。
-
run_program(path[, arg, ...])
- 在 path 執行二進位檔,傳遞 arg。傳回程式的結束狀態。
set_progress(frac)
-
設定進度計量在最近定義的區塊內的位置
show_progress()
呼叫。frac 的範圍必須是 [0.0, 1.0]。進度 計時器絕不會向後移動;的所有嘗試都會遭到忽略。 -
sha1_check(blob[, sha1])
-
blob 引數是
read_file()
或package_extract_file()
的單引數形式。不使用 sha1 引數時, 此函式會傳回 blob 的 SHA1 雜湊 (為 40 位數的十六進位字串)。包含一或多項 sha1 引數,如果 SHA1 雜湊是 或不等於任何空字串的空字串。 -
show_progress(frac, secs)
-
將進度公尺超過其長度的下一個切面,超過
secs 秒 (必須是整數)。secs 可能是 0,此時計量器為
不是自動進階,而是使用定義的
set_progress()
函式 。 sleep(secs)
- 休眠 秒 (必須是整數)。
-
stdout(expr[, expr, ...])
- 評估每個運算式,並將運算式的值轉儲至 stdout。適合用於偵錯。
-
tune2fs(device[, arg, …])
- 調整「device」上的可調整參數 args。
ui_print([text, ...])
- 串連所有「文字」引數,並將結果輸出至 UI (其位置為 才會看到)。
unmount(mount_point)
- 卸載位於 mount_point 的檔案系統。
-
wipe_block_device(block_dev, len)
- 抹除指定區塊裝置 block_dev 的長度位元組。
wipe_cache()
- 讓快取分區在安裝成功結束時清除。
-
write_raw_image(filename_or_blob, partition)
-
這個外掛程式能將 filename_or_blob 中的圖片寫入 MTD 分區。
「filename_or_blob」可以是命名本機檔案的字串或 blob 值引數
包含要寫入的資料如要將檔案從 OTA 套件複製到分區,請使用:
write_raw_image(package_extract_file("zip_filename"), "partition_name");
注意:在 Android 4.1 以下版本中,系統只接受檔案名稱。 因此必須先將資料解壓縮到本機暫存檔中