ภายในแพ็กเกจ OTA

ระบบจะสร้างไบนารีของตัวอัปเดตจาก bootable/recovery/updater และนำไปใช้ ในแพ็กเกจ OTA

แพ็กเกจนั้นเป็นไฟล์ .zip (ota_update.zip incremental_ota_update.zip) ที่มีไบนารีที่ดำเนินการได้ META-INF/com/google/android/update-binary

โปรแกรมอัปเดตมีฟังก์ชันในตัวมากมายและล่ามสำหรับการเขียนสคริปต์แบบยืดหยุ่น ภาษา (แก้ไข) ที่รองรับคำสั่งสำหรับงานเกี่ยวกับการอัปเดตทั่วไป ลักษณะของโปรแกรมอัปเดต ในไฟล์แพ็กเกจ .zip สำหรับสคริปต์ในไฟล์ META-INF/com/google/android/updater-script

หมายเหตุ: การใช้สคริปต์การแก้ไขและ/หรือฟังก์ชันในตัวไม่ใช่กรณีที่พบบ่อย แต่อาจเป็นประโยชน์ในกรณีที่คุณต้องการแก้ไขข้อบกพร่องของไฟล์อัปเดต

ไวยากรณ์ Edify

สคริปต์ edify คือนิพจน์เดียวซึ่งมีค่าทั้งหมดเป็นสตริง สตริงว่างคือ 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 แต่ละรายการ หากรายการใดเป็นเท็จ จะล้มเลิกการดำเนินการด้วย ข้อความ "ยืนยันไม่สำเร็จ" และข้อความต้นฉบับของนิพจน์ที่ล้มเหลว
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 ที่ต้องการ หรือไม่ได้รับการแก้ไข จะไม่ทิ้งไว้ในที่กู้คืนไม่ได้ ระดับกลาง หากกระบวนการถูกขัดจังหวะระหว่างการแพตช์ ไฟล์เป้าหมายอาจอยู่ในสถานะ สถานะปานกลาง มีสำเนาอยู่ในพาร์ติชันแคช ดังนั้นให้รีสตาร์ทการอัปเดต จะสามารถอัปเดตไฟล์ได้สำเร็จ

รองรับไวยากรณ์พิเศษเพื่อจัดการเนื้อหาของ Memory Technology Device (MTD) พาร์ติชันเป็นไฟล์ ทำให้แพตช์พาร์ติชันดิบ เช่น การเปิดเครื่อง วิธีอ่าน MTD คุณต้องทราบปริมาณข้อมูลที่ต้องการอ่านเนื่องจากพาร์ติชันไม่มี แนวคิดในตอนท้ายไฟล์ คุณสามารถใช้สตริง "MTD:พาร์ติชัน:size_1:sha1_1:size_2: sha1_2" ในฐานะ ชื่อไฟล์ที่จะอ่านพาร์ติชันที่กำหนด คุณต้องระบุอย่างน้อยหนึ่ง (size, sha-1); คุณสามารถระบุได้มากกว่า 1 รายการถ้ามี ความเป็นไปได้สำหรับสิ่งที่คุณคาดว่าจะอ่าน

apply_patch_check(filename, sha1[, sha1, ...])
แสดงค่า "จริง" หากเนื้อหาของชื่อไฟล์ หรือสำเนาชั่วคราวในพาร์ติชันแคช (หากมี) มีการตรวจสอบข้อผิดพลาด SHA1 เท่ากับค่า sha1 ค่าใดค่าหนึ่งที่กำหนด ค่า sha1 จะระบุเป็นตัวเลขฐานสิบหก 40 หลัก ฟังก์ชันนี้แตกต่างจาก sha1_check(read_file(filename), sha1 [, ...]) ที่รู้ว่า ตรวจสอบสำเนาพาร์ติชันแคช เพื่อให้ apply_patch_check() ดำเนินการสำเร็จแม้ว่า ไฟล์เสียหายจากการขัดจังหวะ apply_patch() update
apply_patch_space(bytes)
แสดงค่า "จริง" หากมีพื้นที่ว่างอย่างน้อย ไบต์ สำหรับการใช้ไบนารี แพตช์
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 (ตีความเป็นจำนวนเต็ม) มากกว่า b (ตีความเป็นจำนวนเต็ม)
ifelse(cond, e1[, e2])
ประเมิน cond และหากเป็น true จะประเมินและแสดงผลค่าของ e1 มิฉะนั้น ระบบจะประเมินและแสดงผล e2 (หากมี) "ถ้า ... อย่างอื่น ... แล้ว ... endif" เป็นแค่น้ำตาลไวยากรณ์สำหรับฟังก์ชันนี้
is_mounted(mount_point)
แสดงผล "true iff" ที่มีระบบไฟล์ต่อเชื่อมที่ mount_point
is_substring(needle, haystack)
แสดงผลจริงของ needle เป็นสตริงย่อยของ haystack
less_than_int(a, b)
ส่งคืน iff จริง a (ตีความเป็นจำนวนเต็ม) น้อยกว่า b (ตีความเป็น จำนวนเต็ม)
mount(fs_type, partition_type, name, mount_point)
ต่อเชื่อมระบบไฟล์ fs_type ที่ mount_point partition_type ต้องเป็น ข้อใดข้อหนึ่ง:
  • MTD ชื่อของพาร์ติชัน MTD (เช่น ระบบ ข้อมูลผู้ใช้ โปรดดู /proc/mtdในอุปกรณ์เพื่อดูรายการทั้งหมด)
  • EMMC

การกู้คืนไม่ได้ต่อเชื่อมระบบไฟล์ใดๆ โดยค่าเริ่มต้น (ยกเว้นการ์ด SD หากผู้ใช้คือ ติดตั้งแพ็กเกจจากการ์ด 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 เป็น BLOB ในประเภทที่ read_file() หรือ รูปแบบอาร์กิวเมนต์เดียวของ package_extract_file() เมื่อไม่มีอาร์กิวเมนต์ sha1 ฟังก์ชันนี้จะแสดงผลแฮช SHA1 ของ BLOB (เป็นสตริงฐานสิบหก 40 หลัก) ที่มีอย่างน้อย 1 รายการ sha1 ฟังก์ชันนี้จะแสดงแฮช SHA1 หากเท่ากับหนึ่งใน อาร์กิวเมนต์ หรือสตริงว่างถ้าไม่เท่ากับอาร์กิวเมนต์ใดๆ
show_progress(frac, secs)
เลื่อนมิเตอร์ความคืบหน้าให้เกิน frac ถัดไปของความยาว sec วินาที (ต้องเป็นจำนวนเต็ม) วินาที อาจเป็น 0 ในกรณีนี้ มิเตอร์ ไม่ขั้นสูงโดยอัตโนมัติ แต่โดยการใช้ฟังก์ชัน set_progress() ที่กำหนดไว้ ที่ด้านบน
sleep(secs)
สลีปเป็นเวลา วินาที วินาที (ต้องเป็นจำนวนเต็ม)
stdout(expr[, expr, ...])
ประเมินนิพจน์แต่ละรายการและทิ้งค่าไปยัง Stdout มีประโยชน์ในการแก้ไขข้อบกพร่อง
tune2fs(device[, arg, …])
ปรับพารามิเตอร์ที่ปรับแต่งได้อาร์กิวเมนต์ในอุปกรณ์
ui_print([text, ...])
เชื่อมต่ออาร์กิวเมนต์ text ทั้งหมดและพิมพ์ผลลัพธ์ไปยัง UI (ซึ่งจะเป็น มองเห็นได้หากผู้ใช้เปิดการแสดงข้อความ)
unmount(mount_point)
ยกเลิกการต่อเชื่อมระบบไฟล์ที่ต่อเชื่อมที่ mount_point
wipe_block_device(block_dev, len)
ล้างข้อมูลไบต์ 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 ระบบจะยอมรับเฉพาะชื่อไฟล์เท่านั้น ข้อมูลนี้จะต้องถูกคลายลงในไฟล์ชั่วคราวในเครื่องก่อน