ระบบจะสร้างไบนารีของตัวอัพเดตจาก bootable/recovery/updater
และใช้ในแพ็คเกจ OTA
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 คือนิพจน์เดียวซึ่งค่าทั้งหมดเป็นสตริง สตริงว่างถือเป็น เท็จ ในบริบทบูลีน และสตริงอื่นๆ ทั้งหมดเป็น 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
สตริงอักขระใดๆ az, AZ, 0-9, _, :, /, ที่ไม่ใช่คำสงวนจะถือเป็นสตริงลิเทอรัล (คำที่สงวนไว้คือ if else แล้ว endif ) ตัวอักษรสตริงอาจปรากฏในเครื่องหมายคำพูดคู่ด้วย นี่คือวิธีสร้างค่าด้วยช่องว่างและอักขระอื่นๆ ที่ไม่ได้อยู่ในชุดข้างต้น \n, \t, \" และ \\ ทำหน้าที่เป็นตัวหลีกภายในสตริงที่ยกมา เช่นเดียวกับ \x ##
&& และ || ตัวดำเนินการลัดวงจร ด้านขวาจะไม่ถูกประเมินหากผลลัพธ์เชิงตรรกะถูกกำหนดโดยด้านซ้าย สิ่งต่อไปนี้เทียบเท่า:
e1 && e2 if e1 then e2 endif
; ตัวดำเนินการเป็นจุดลำดับ หมายถึงการประเมินด้านซ้ายก่อนแล้วจึงประเมินด้านขวา ค่าของมันคือค่าของนิพจน์ด้านขวา อัฒภาคสามารถปรากฏหลังนิพจน์ได้ ดังนั้นเอฟเฟกต์จึงจำลองคำสั่งแบบ C:
prepare(); do_other_thing("argument"); finish_up();
ฟังก์ชั่นในตัว
ฟังก์ชันการอัพเดตส่วนใหญ่มีอยู่ในฟังก์ชันที่พร้อมใช้งานสำหรับการดำเนินการโดยสคริปต์ (พูดอย่างเคร่งครัด สิ่งเหล่านี้คือ มาโคร มากกว่า ฟังก์ชัน ในความหมายของ Lisp เนื่องจากไม่จำเป็นต้องประเมินอาร์กิวเมนต์ทั้งหมด) ฟังก์ชันจะส่งกลับ ค่าจริง เมื่อสำเร็จ และ ค่าเท็จ หากเกิดข้อผิดพลาด หากคุณต้องการให้มีข้อผิดพลาดในการยกเลิกการทำงานของสคริปต์ ให้ใช้ฟังก์ชัน abort()
และ/หรือ assert()
ชุดฟังก์ชันที่มีอยู่ในตัวอัปเดตสามารถขยายเพื่อให้มี ฟังก์ชันการทำงานเฉพาะอุปกรณ์ ได้
-
abort([ msg ])
- ยกเลิกการเรียกใช้สคริปต์ทันที โดยใช้ msg เผื่อเลือก หากผู้ใช้เปิดการแสดงข้อความ ข้อความ จะปรากฏขึ้นในบันทึกการกู้คืนและบนหน้าจอ
-
assert( expr [, expr , ...])
- ประเมิน expr แต่ละรายการตามลำดับ หากมีเท็จ ให้ยกเลิกการดำเนินการทันทีด้วยข้อความ "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 คือแพตช์ที่จะใช้เมื่อเนื้อหาปัจจุบันของไฟล์ต้นฉบับมี SHA1 ที่กำหนด
การแพตช์เสร็จสิ้นในลักษณะที่ปลอดภัยซึ่งรับประกันว่าไฟล์เป้าหมายจะมีแฮชและขนาด SHA1 ที่ต้องการ หรือไม่ก็ไม่ถูกแตะต้อง โดยจะไม่ปล่อยให้อยู่ในสถานะกลางที่ไม่สามารถกู้คืนได้ หากกระบวนการถูกขัดจังหวะระหว่างการแพตช์ ไฟล์เป้าหมายอาจอยู่ในสถานะระดับกลาง มีสำเนาอยู่ในพาร์ติชันแคช ดังนั้นการรีสตาร์ทการอัปเดตจึงสามารถอัปเดตไฟล์ได้สำเร็จ
รองรับไวยากรณ์พิเศษเพื่อรักษาเนื้อหาของพาร์ติชั่น Memory Technology Device (MTD) ให้เป็นไฟล์ ทำให้สามารถแพตช์พาร์ติชั่นดิบ เช่น การบูตได้ หากต้องการอ่านพาร์ติชัน MTD คุณต้องทราบจำนวนข้อมูลที่คุณต้องการอ่าน เนื่องจากพาร์ติชันไม่มีแนวคิดเรื่องสิ้นสุดไฟล์ คุณสามารถใช้สตริง "MTD: partition : size_1 : sha1_1 : size_2 : sha1_2 " เป็นชื่อไฟล์เพื่ออ่านพาร์ติชั่นที่กำหนด คุณต้องระบุคู่ (ขนาด sha-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 , ...])
- ประเมินแต่ละนิพจน์และต่อเข้าด้วยกัน ตัวดำเนินการ + คือน้ำตาลเชิงวากยสัมพันธ์สำหรับฟังก์ชันนี้ในกรณีพิเศษของอาร์กิวเมนต์สองตัว (แต่รูปแบบฟังก์ชันสามารถรับนิพจน์จำนวนเท่าใดก็ได้) นิพจน์ต้องเป็นสตริง มันไม่สามารถเชื่อม blobs เข้าด้วยกันได้
-
file_getprop( filename , key )
- อ่าน ชื่อไฟล์ ที่กำหนด แปลเป็นไฟล์คุณสมบัติ (เช่น
/system/build.prop
) และส่งกลับค่าของ คีย์ ที่กำหนด หรือสตริงว่างหากไม่มี คีย์ -
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 เป็นศูนย์ ระบบไฟล์จะครอบครองพาร์ติชันทั้งหมด หาก fs_size เป็นจำนวนบวก ระบบไฟล์จะใช้ไบต์ fs_size แรกของพาร์ติชัน ถ้า fs_size เป็นจำนวนลบ ระบบไฟล์จะใช้ทั้งหมดยกเว้น |fs_size| สุดท้าย ไบต์ของพาร์ติชัน
- fs_type="f2fs" และ partition_type="EMMC" ตำแหน่งจะต้องเป็นไฟล์อุปกรณ์สำหรับพาร์ติชัน fs_size ต้องเป็นตัวเลขที่ไม่เป็นลบ หาก fs_size เป็นศูนย์ ระบบไฟล์จะครอบครองพาร์ติชันทั้งหมด หาก fs_size เป็นจำนวนบวก ระบบไฟล์จะใช้ไบต์ fs_size แรกของพาร์ติชัน
- mount_point ควรเป็นจุดเมานต์ในอนาคตสำหรับระบบไฟล์
-
getprop( key )
- ส่งกลับค่าของ คีย์ คุณสมบัติของระบบ (หรือสตริงว่าง หากไม่ได้กำหนดไว้) ค่าคุณสมบัติของระบบที่กำหนดโดยพาร์ติชันการกู้คืนไม่จำเป็นต้องเหมือนกับค่าของระบบหลัก ฟังก์ชันนี้จะคืนค่าในการกู้คืน
-
greater_than_int( a , b )
- ส่งคืนค่าจริงก็ต่อเมื่อ (iff) a (แปลเป็นจำนวนเต็ม) มากกว่า b (แปลเป็นจำนวนเต็ม)
-
ifelse( cond , e1 [, e2 ])
- ประเมิน cond และหากเป็นจริง ให้ประเมินและส่งคืนค่าของ e1 มิฉะนั้นจะประเมินและส่งกลับ e2 (ถ้ามี) โครงสร้าง "if ... else ... then ... endif" เป็นเพียงน้ำตาลวากยสัมพันธ์สำหรับฟังก์ชันนี้
-
is_mounted( mount_point )
- คืนค่าจริงหากมีระบบไฟล์ติดตั้งอยู่ที่ mount_point
-
is_substring( needle , haystack )
- ส่งคืนค่าจริง iff เข็ม เป็นสตริงย่อยของ กองหญ้า
-
less_than_int( a , b )
- ส่งคืนค่าจริง iff a (ตีความว่าเป็นจำนวนเต็ม) น้อยกว่า b (ตีความว่าเป็นจำนวนเต็ม)
-
mount( fs_type , partition_type , name , mount_point )
- ติดตั้งระบบไฟล์ fs_type ที่ mount_point partition_type จะต้องเป็นหนึ่งใน:
- เอ็มทีดี . Name คือชื่อของพาร์ติชัน MTD (เช่น ระบบ ข้อมูลผู้ใช้ ดู
/proc/mtd
บนอุปกรณ์เพื่อดูรายการทั้งหมด) - อีเอ็มซี.
การกู้คืนไม่ได้ติดตั้งระบบไฟล์ใดๆ ตามค่าเริ่มต้น (ยกเว้นการ์ด SD หากผู้ใช้ทำการติดตั้งแพ็คเกจด้วยตนเองจากการ์ด SD) สคริปต์ของคุณต้องเมานต์พาร์ติชันใด ๆ ที่จำเป็นในการแก้ไข
- เอ็มทีดี . Name คือชื่อของพาร์ติชัน 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 จะส่งกลับเนื้อหาของไฟล์แพ็กเกจเป็นไบนารี่หยด
-
read_file( filename )
- อ่าน ชื่อไฟล์ และส่งกลับเนื้อหาเป็นไบนารีหยด
-
run_program( path [, arg , ...])
- ดำเนินการไบนารีที่ path ผ่าน arg s ส่งกลับสถานะการออกของโปรแกรม
-
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 หลัก) เมื่อมีอาร์กิวเมนต์ sha1 ตั้งแต่หนึ่งอาร์กิวเมนต์ขึ้นไป ฟังก์ชันนี้จะส่งคืนแฮช SHA1 หากเท่ากับอาร์กิวเมนต์ตัวใดตัวหนึ่ง หรือส่งคืนสตริงว่างหากไม่เท่ากับอาร์กิวเมนต์ใดๆ -
show_progress( frac , secs )
- เลื่อนมิเตอร์วัดความคืบหน้าไปใน frac ถัดไปของความยาวใน หน่วย วินาที (ต้องเป็นจำนวนเต็ม) วินาที อาจเป็น 0 ซึ่งในกรณีนี้มิเตอร์จะไม่ก้าวหน้าโดยอัตโนมัติ แต่ใช้ฟังก์ชัน
set_progress()
ที่กำหนดไว้ข้างต้น -
sleep( secs )
- เข้าสู่โหมดสลีป ไม่กี่ วินาที (ต้องเป็นจำนวนเต็ม)
-
stdout( expr [, expr , ...])
- ประเมินแต่ละนิพจน์และทิ้งค่าไปที่ stdout มีประโยชน์สำหรับการดีบัก
-
tune2fs( device [, arg , …])
- ปรับพารามิเตอร์ที่ปรับ ได้ บน อุปกรณ์
-
ui_print([ 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 อาจเป็นสตริงที่ตั้งชื่อไฟล์ในเครื่องหรืออาร์กิวเมนต์ที่มีค่าหยดซึ่งมีข้อมูลที่จะเขียน หากต้องการคัดลอกไฟล์จากแพ็คเกจ OTA ไปยังพาร์ติชัน ให้ใช้:
write_raw_image(package_extract_file("zip_filename"), "partition_name");
หมายเหตุ: ก่อน Android 4.1 ยอมรับเฉพาะชื่อไฟล์เท่านั้น ดังนั้นเพื่อให้บรรลุผลนี้ จะต้องแตกข้อมูลลงในไฟล์ในเครื่องชั่วคราวก่อน