ระบบจะสร้างไบนารีของตัวอัปเดตจาก bootable/recovery/updater
และนำไปใช้
ในแพ็กเกจ OTA
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 ด้วยตนเอง) สคริปต์ของคุณต้องต่อเชื่อม ที่ควรแก้ไข
-
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 เป็น 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 ระบบจะยอมรับเฉพาะชื่อไฟล์เท่านั้น ข้อมูลนี้จะต้องถูกคลายลงในไฟล์ชั่วคราวในเครื่องก่อน