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

จัดทุกอย่างให้เป็นระเบียบอยู่เสมอด้วยคอลเล็กชัน บันทึกและจัดหมวดหมู่เนื้อหาตามค่ากำหนดของคุณ

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

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

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