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

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

ตัวแพ็คเกจเองนั้นเป็นไฟล์ .zip ( 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) สคริปต์ของคุณต้องเมานต์พาร์ติชันใด ๆ ที่จำเป็นในการแก้ไข

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 ยอมรับเฉพาะชื่อไฟล์เท่านั้น ดังนั้นเพื่อให้บรรลุผลนี้ จะต้องแตกข้อมูลลงในไฟล์ในเครื่องชั่วคราวก่อน