ระบบสร้างไบนารีของตัวอัปเดตจาก bootable/recovery/updater
เดตและใช้ในแพ็คเกจ OTA
ota_update.zip
, incremental_ota_update.zip
) ที่มีไบนารี META-INF/com/google/android/update-binary
Updater มีฟังก์ชันในตัวหลายตัวและตัวแปลสำหรับภาษาสคริปต์ที่ขยายได้ ( edify ) ที่รองรับคำสั่งสำหรับงานที่เกี่ยวข้องกับการอัปเดตทั่วไป Updater จะค้นหาสคริปต์ในไฟล์ package .zip เพื่อหาสคริปต์ในไฟล์ META-INF/com/google/android/updater-script
หมายเหตุ: การใช้สคริปต์ edify และ/หรือฟังก์ชันบิวด์อินไม่ใช่กิจกรรมทั่วไป แต่จะมีประโยชน์หากคุณจำเป็นต้องดีบักไฟล์อัพเดต
แก้ไขไวยากรณ์
สคริปต์ edify เป็นนิพจน์เดียวซึ่งค่าทั้งหมดเป็นสตริง สตริงว่างเป็น เท็จ ในบริบทบูลีน และสตริงอื่นๆ ทั้งหมดเป็น จริง 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, \", และ \\ ทำหน้าที่เป็น Escape ภายในสตริงที่ยกมา เช่นเดียวกับ \x ##
&& และ || ตัวดำเนินการลัดวงจร ด้านขวาจะไม่ถูกประเมินหากผลลัพธ์ทางตรรกะถูกกำหนดโดยด้านซ้าย ต่อไปนี้เทียบเท่า:
e1 && e2 if e1 then e2 endif
ที่ ; โอเปอเรเตอร์คือจุดลำดับ มันหมายถึงการประเมินก่อนจากด้านซ้ายและด้านขวา ค่าของมันคือค่าของนิพจน์ด้านขวา อัฒภาคยังสามารถปรากฏหลังนิพจน์ ดังนั้นเอฟเฟกต์จะจำลองคำสั่งสไตล์ C:
prepare(); do_other_thing("argument"); finish_up();
ฟังก์ชั่นในตัว
ฟังก์ชันการอัปเดตส่วนใหญ่มีอยู่ในฟังก์ชันที่พร้อมใช้งานสำหรับการดำเนินการตามสคริปต์ (พูดอย่างเคร่งครัดว่าสิ่งเหล่านี้คือ มาโคร แทนที่จะเป็น ฟังก์ชัน ในแง่ของ Lisp เนื่องจากไม่จำเป็นต้องประเมินข้อโต้แย้งทั้งหมด) เว้นแต่จะระบุไว้เป็นอย่างอื่น ฟังก์ชันจะส่งกลับค่า จริง เมื่อสำเร็จและ เท็จ เมื่อเกิดข้อผิดพลาด หากคุณต้องการให้ข้อผิดพลาดหยุดการทำงานของสคริปต์ ให้ใช้ฟังก์ชัน abort()
และ/หรือ assert()
นอกจากนี้ยังสามารถขยายชุดของฟังก์ชันที่มีอยู่ในตัวอัปเดตเพื่อให้ ฟังก์ชันเฉพาะของอุปกรณ์ ได้อีกด้วย
-
abort([ msg ])
- ยกเลิกการดำเนินการของสคริปต์ทันที ด้วยตัวเลือก 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 คือโปรแกรมแก้ไขที่จะใช้เมื่อเนื้อหาปัจจุบันของไฟล์ต้นฉบับมี 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 , ...])
- ประเมินแต่ละนิพจน์และเชื่อมเข้าด้วยกัน ตัวดำเนินการ + คือ น้ำตาลประโยคสำหรับฟังก์ชันนี้ในกรณีพิเศษของสองอาร์กิวเมนต์ (แต่รูปแบบฟังก์ชันสามารถรับนิพจน์จำนวนเท่าใดก็ได้) นิพจน์ต้องเป็นสตริง มันเชื่อมรอยเปื้อนไม่ได้
-
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 )
- คืนค่า true หากมีการติดตั้งระบบไฟล์ที่ 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 ต้องเป็นหนึ่งใน:
- เอ็ มทีดี. ชื่อ คือชื่อของพาร์ติชัน MTD (เช่น ระบบ ข้อมูลผู้ใช้ โปรดดูรายการทั้งหมดบนอุปกรณ์
/proc/mtd
) - อีเอ็มซี
การกู้คืนไม่ได้ติดตั้งระบบไฟล์ใด ๆ ตามค่าเริ่มต้น (ยกเว้นการ์ด SD หากผู้ใช้ทำการติดตั้งแพ็คเกจด้วยตนเองจากการ์ด SD) สคริปต์ของคุณต้องเมาต์พาร์ติชั่นใด ๆ ที่ต้องการแก้ไข
- เอ็ มทีดี. ชื่อ คือชื่อของพาร์ติชัน 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 , …])
- ปรับ args พารามิเตอร์ที่ปรับได้บน อุปกรณ์
-
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 สามารถเป็นสตริงที่ตั้งชื่อไฟล์ในเครื่องหรืออาร์กิวเมนต์ที่มีค่า blob ที่มีข้อมูลที่จะเขียน ในการคัดลอกไฟล์จากแพ็คเกจ OTA ไปยังพาร์ติชั่น ให้ใช้:
write_raw_image(package_extract_file("zip_filename"), "partition_name");
หมายเหตุ: ก่อนหน้า Android 4.1 จะยอมรับเฉพาะชื่อไฟล์เท่านั้น ดังนั้นเพื่อให้สำเร็จ ข้อมูลต้องถูกคลายซิปลงในไฟล์ชั่วคราวในเครื่องก่อน