OTA 套件內部

系統會從 bootable/recovery/updater 建構更新器二進位檔,並使用該二進位檔 封裝到 OTA 套件中

套件本身是 .zip 檔案 (ota_update.zipincremental_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_sha1tgt_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)
如果 needlehaystack 的子字串,則傳回 true。
less_than_int(a, b)
如果 a (解讀為整數) 小於 b (解讀為整數),則傳回 true 整數)。
mount(fs_type, partition_type, name, mount_point)
fs_type 的檔案系統掛接到 mount_pointpartition_type 必須為 下列其中一項:
  • MTD:名稱為 MTD 分區的名稱 (例如系統、使用者資料;請參閱 請參閱裝置的 /proc/mtd 以取得完整清單)。
  • EMMC。

根據預設,復原功能不會掛接任何檔案系統 (如果使用者 從 SD 卡手動安裝套件);指令碼必須將任何 需要修改的分區

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 以下版本中,系統只接受檔案名稱。 因此必須先將資料解壓縮到本機暫存檔中