สร้างแพ็กเกจ OTA

คุณใช้เครื่องมือ ota_from_target_files ที่ระบุไว้ใน build/make/tools/releasetools เพื่อสร้างแพ็กเกจ OTA แบบเต็มและแบบเพิ่ม สำหรับอุปกรณ์ที่ใช้การอัปเดตระบบ A/B หรือการอัปเดตระบบที่ไม่ใช่ A/B ได้ เครื่องมือนี้ใช้ไฟล์ target-files.zipที่ระบบบิลด์ของ Android สร้างขึ้นเป็นอินพุต

สำหรับอุปกรณ์ที่ใช้ Android 11 ขึ้นไป คุณสามารถสร้าง แพ็กเกจ OTA 1 รายการสำหรับอุปกรณ์หลายเครื่องที่มี SKU ต่างกัน การดำเนินการนี้ต้องมีการกำหนดค่าอุปกรณ์เป้าหมายให้ใช้ฟิงเกอร์ปรินต์แบบไดนามิก และอัปเดตข้อมูลเมตา OTA เพื่อรวมชื่อและฟิงเกอร์ปรินต์ของอุปกรณ์ไว้ในรายการเงื่อนไขก่อนและหลัง

Android 8.0 เลิกใช้งานแพ็กเกจ OTA ที่อิงตามไฟล์สำหรับอุปกรณ์ที่ไม่ใช่ A/B ซึ่งต้องใช้แพ็กเกจ OTA ที่อิงตามบล็อกแทน หากต้องการสร้างแพ็กเกจ OTA ที่อิงตามบล็อกหรืออุปกรณ์ที่ใช้ Android 7.x หรือต่ำกว่า ให้ส่งตัวเลือก --block ไปยังพารามิเตอร์ ota_from_target_files

สร้างการอัปเดตแบบเต็ม

การอัปเดตแบบเต็มคือแพ็กเกจ OTA ที่มีสถานะสุดท้ายทั้งหมดของ อุปกรณ์ (พาร์ติชันระบบ การบูต และการกู้คืน) ตราบใดที่อุปกรณ์รับและใช้แพ็กเกจได้ แพ็กเกจจะติดตั้งบิลด์ได้ ไม่ว่าอุปกรณ์จะมีสถานะเป็นอย่างไรก็ตาม เช่น คำสั่งต่อไปนี้ ใช้เครื่องมือเผยแพร่เพื่อสร้างtarget-files.zip อาร์ไคฟ์สำหรับอุปกรณ์ tardis

. build/envsetup.sh && lunch tardis-eng
mkdir dist_output
make dist DIST_DIR=dist_output

make dist สร้างแพ็กเกจ OTA แบบเต็ม (ใน $OUT) ไฟล์ .zip ที่ได้ มีทุกอย่างที่จำเป็นในการสร้างแพ็กเกจ OTA สำหรับอุปกรณ์ tardis นอกจากนี้ คุณยังสร้าง ota_from_target_files เป็นไบนารี Python และเรียกใช้เพื่อสร้างแพ็กเกจแบบเต็มหรือแบบเพิ่มได้ด้วย

ota_from_target_files dist_output/tardis-target_files.zip ota_update.zip

ระบบจะตั้งค่าเส้นทาง ota_from_target_files ใน $PATH และไบนารี python ที่ได้จะอยู่ในไดเรกทอรี out/

ota_update.zip พร้อมส่งไปยังอุปกรณ์ทดสอบแล้ว (ทุกอย่างลงนามด้วยคีย์ทดสอบ) สำหรับอุปกรณ์ของผู้ใช้ ให้สร้างและใช้คีย์ส่วนตัวของคุณเองตามที่อธิบายไว้ในการลงนามในบิลด์สำหรับการเผยแพร่

สร้างการอัปเดตแบบเพิ่มทีละส่วน

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

คุณจะติดตั้งแพ็กเกจการอัปเดตแบบเพิ่มทีละรายการได้เฉพาะในอุปกรณ์ที่มี บิลด์ต้นทางที่ใช้ในการสร้างแพ็กเกจ หากต้องการสร้างการอัปเดตแบบเพิ่ม คุณจะต้องมีไฟล์ target_files.zip จากบิลด์ก่อนหน้า (บิลด์ที่คุณต้องการอัปเดตจาก) รวมถึงไฟล์ target_files.zip จากบิลด์ใหม่ ตัวอย่างเช่น คำสั่งต่อไปนี้ใช้เครื่องมือเผยแพร่เพื่อสร้างการอัปเดตแบบเพิ่มทีละรายการ สำหรับอุปกรณ์ tardis

ota_from_target_files -i PREVIOUS-tardis-target_files.zip dist_output/tardis-target_files.zip incremental_ota_update.zip

บิลด์นี้คล้ายกับบิลด์ก่อนหน้ามาก และแพ็กเกจการอัปเดตแบบเพิ่ม (incremental_ota_update.zip) มีขนาดเล็กกว่าการอัปเดตแบบเต็มที่เกี่ยวข้องมาก (ประมาณ 1 MB แทนที่จะเป็น 60 MB)

เผยแพร่แพ็กเกจแบบเพิ่มเฉพาะไปยังอุปกรณ์ที่ใช้บิลด์ก่อนหน้า แบบเดียวกันทุกประการซึ่งใช้เป็นจุดเริ่มต้นของแพ็กเกจแบบเพิ่ม คุณต้องแฟลช รูปภาพใน PREVIOUS-tardis-target_files.zip หรือ PREVIOUS-tardis-img.zip (ทั้ง 2 รายการสร้างด้วย make dist เพื่อแฟลชด้วย fastboot update) แทน รายการที่อยู่ในไดเรกทอรี PRODUCT_OUT (สร้างด้วย make ซึ่งจะ แฟลชด้วย fastboot flashall) การพยายามติดตั้งแพ็กเกจที่เพิ่มขึ้น ในอุปกรณ์ที่มีบิลด์อื่นๆ จะทำให้เกิดข้อผิดพลาดในการติดตั้ง เมื่อ การติดตั้งล้มเหลว อุปกรณ์จะยังคงอยู่ในสถานะการทำงานเดิม (ใช้ ระบบเก่า) แพ็กเกจจะตรวจสอบสถานะก่อนหน้าของไฟล์ทั้งหมดที่อัปเดต ก่อนที่จะแตะไฟล์เหล่านั้น ดังนั้นอุปกรณ์จึงไม่ติดอยู่ในสถานะที่อัปเกรดไม่เสร็จ

เพื่อประสบการณ์การใช้งานที่ดีที่สุด โปรดเสนอการอัปเดตแบบเต็มทุกๆ 3-4 การอัปเดตแบบเพิ่ม ซึ่งจะช่วยให้ผู้ใช้ได้รับเวอร์ชันล่าสุดและหลีกเลี่ยงการติดตั้งอัปเดตแบบเพิ่มทีละรายการเป็นเวลานาน

สร้างแพ็กเกจ OTA สำหรับ SKU หลายรายการ

Android 11 ขึ้นไปรองรับการใช้แพ็กเกจ OTA เดียวสำหรับอุปกรณ์หลายเครื่องที่มี SKU ต่างกัน การดำเนินการดังกล่าวต้องกำหนดค่า อุปกรณ์เป้าหมายให้ใช้ฟิงเกอร์ปรินต์แบบไดนามิกและอัปเดตข้อมูลเมตา OTA (โดยใช้เครื่องมือ OTA) เพื่อรวมชื่ออุปกรณ์และฟิงเกอร์ปรินต์ในรายการเงื่อนไขก่อนและหลัง

เกี่ยวกับ SKU

รูปแบบของ SKU คือรูปแบบที่แตกต่างกันของค่าพารามิเตอร์ build ที่รวมกัน และโดยปกติจะเป็นชุดย่อยที่ไม่ได้ประกาศของพารามิเตอร์ build_fingerprint ปัจจุบัน OEM สามารถใช้พารามิเตอร์การสร้างที่ได้รับอนุมัติจาก CDD สำหรับ SKU ในขณะที่ใช้รูปภาพเดียวสำหรับ SKU เหล่านั้นได้ด้วย เช่น SKU ต่อไปนี้มี หลายรูปแบบ

SKU = <product><device><modifierA><modifierB><modifierC>
  • modifierA คือระดับอุปกรณ์ (เช่น Pro, Premium หรือ Plus)
  • modifierB คือความแตกต่างของฮาร์ดแวร์ (เช่น วิทยุ)
  • modifierC คือภูมิภาค ซึ่งอาจเป็นภูมิภาคทั่วไป (เช่น NA, EMEA หรือ CHN) หรือภูมิภาคที่เฉพาะเจาะจงประเทศหรือภาษา (เช่น JPN, ENG หรือ CHN)

OEM หลายรายใช้รูปภาพเดียวสำหรับ SKU หลายรายการ จากนั้นจึงได้ชื่อผลิตภัณฑ์สุดท้ายและลายนิ้วมือของอุปกรณ์ในขณะรันไทม์หลังจากที่อุปกรณ์บูตขึ้น กระบวนการนี้ ช่วยให้กระบวนการพัฒนาแพลตฟอร์มง่ายขึ้น ทำให้อุปกรณ์ที่มีการปรับแต่งเล็กน้อย แต่มีชื่อผลิตภัณฑ์ต่างกันสามารถแชร์รูปภาพทั่วไป (เช่น tardis และ tardispro) ได้

ใช้ลายนิ้วมือแบบไดนามิก

ลายนิ้วมือคือการต่อกันของพารามิเตอร์บิลด์ที่กำหนดไว้ เช่น ro.product.brand, ro.product.name และ ro.product.device ลายนิ้วมือ ของอุปกรณ์ได้มาจากลายนิ้วมือของพาร์ติชันระบบและใช้เป็น ตัวระบุที่ไม่ซ้ำกันของอิมเมจ (และไบต์) ที่ทำงานในอุปกรณ์ หากต้องการสร้างลายนิ้วมือแบบไดนามิก ให้ใช้ตรรกะแบบไดนามิกในไฟล์ build.prop ของอุปกรณ์เพื่อ รับค่าของตัวแปร Bootloader ในเวลาที่บูตอุปกรณ์ จากนั้นใช้ข้อมูลดังกล่าวเพื่อ สร้างลายนิ้วมือแบบไดนามิกสำหรับอุปกรณ์นั้น

ตัวอย่างเช่น หากต้องการใช้ลายนิ้วมือแบบไดนามิกสำหรับอุปกรณ์ tardis และ tardispro ให้อัปเดตไฟล์ต่อไปนี้ตามที่แสดงด้านล่าง

  • อัปเดตไฟล์ odm/etc/build_std.prop ให้มีบรรทัดต่อไปนี้

    ro.odm.product.device=tardis
    
  • อัปเดตไฟล์ odm/etc/build_pro.prop ให้มีบรรทัดต่อไปนี้

    ro.odm.product.device=tardispro
    
  • อัปเดตodm/etc/build.propไฟล์ให้มีบรรทัดต่อไปนี้

    ro.odm.product.device=tardis
    import /odm/etc/build_${ro.boot.product.hardware.sku}.prop
    

บรรทัดเหล่านี้จะตั้งค่าชื่ออุปกรณ์ ลายนิ้วมือ และ ro.build.fingerprint แบบไดนามิกตามค่าของพร็อพเพอร์ตี้ ro.boot.product.hardware.sku ของ Bootloader (ซึ่งเป็นแบบอ่านอย่างเดียว)

อัปเดตข้อมูลเมตาของแพ็กเกจ OTA

แพ็กเกจ OTA มีไฟล์ข้อมูลเมตา (META-INF/com/android/metadata) ที่อธิบายแพ็กเกจ รวมถึงข้อกำหนดเบื้องต้นและข้อกำหนดภายหลังของแพ็กเกจ OTA ตัวอย่างเช่น โค้ดต่อไปนี้คือไฟล์ข้อมูลเมตาสำหรับแพ็กเกจ OTA ที่กำหนดเป้าหมายเป็นอุปกรณ์ tardis

post-build=google/tardis/tardis:11/RP1A.200521.001/6516341:userdebug/dev-keys
post-build-incremental=6516341
post-sdk-level=30
post-security-patch-level=2020-07-05
post-timestamp=1590026334
pre-build=google/tardis/tardis:11/RP1A.200519.002.A1/6515794:userdebug/dev-keys
pre-build-incremental=6515794
pre-device=tardis

ค่า pre-device, pre-build-incremental และ pre-build จะกำหนด สถานะที่อุปกรณ์ต้องมีก่อนจึงจะติดตั้งแพ็กเกจ OTA ได้ ค่า post-build-incremental และ post-build จะกำหนดสถานะที่คาดหวังของอุปกรณ์ หลังจากติดตั้งแพ็กเกจ OTA ค่าของฟิลด์ pre- และ post- ได้มาจากพร็อพเพอร์ตี้การสร้างที่สอดคล้องกันต่อไปนี้

  • ค่า pre-device ได้มาจากพร็อพเพอร์ตี้บิลด์ ro.product.device
  • ค่า pre-build-incremental และ post-build-incremental ได้มาจากพร็อพเพอร์ตี้บิลด์ ro.build.version.incremental
  • ค่า pre-build และ post-build ได้มาจากพร็อพเพอร์ตี้บิลด์ ro.build.fingerprint

ในอุปกรณ์ที่ใช้ Android 11 ขึ้นไป คุณสามารถใช้ แฟล็ก --boot_variable_file ในเครื่องมือ OTA เพื่อระบุเส้นทางไปยังไฟล์ที่มี ค่าของตัวแปรรันไทม์ที่ใช้ในการสร้าง ลายนิ้วมือแบบไดนามิกของอุปกรณ์ จากนั้นระบบจะใช้ข้อมูลดังกล่าวเพื่ออัปเดตข้อมูลเมตาของ OTA ให้มี ชื่อและลายนิ้วมือของอุปกรณ์ในเงื่อนไข pre- และ post- (โดยใช้ อักขระไปป์ | เป็นตัวคั่น) แฟล็ก --boot_variable_file มีไวยากรณ์และคำอธิบายต่อไปนี้

  • ไวยากรณ์: --boot_variable_file <path>
  • คำอธิบาย: ระบุเส้นทางไปยังไฟล์ที่มีค่าที่เป็นไปได้ของพร็อพเพอร์ตี้ ro.boot.* ใช้เพื่อคำนวณลายนิ้วมือของรันไทม์ที่เป็นไปได้ เมื่อคำสั่งนำเข้าลบล้างพร็อพเพอร์ตี้บางรายการของ ro.product.* ไฟล์คาดว่าจะมีพร็อพเพอร์ตี้ 1 รายการต่อบรรทัด โดยแต่ละบรรทัดจะมีรูปแบบดังนี้ prop_name=value1,value2

เช่น เมื่อพร็อพเพอร์ตี้เป็น ro.boot.product.hardware.sku=std,pro ข้อมูลเมตาของ OTA สำหรับอุปกรณ์ tardis และ tardispro จะเป็นดังที่แสดงด้านล่าง

post-build=google/tardis/tardis:11/<suffix>|google/tardis/tardispro:11/<suffix>
pre-build=google/tardis/tardis:11/<suffix>|google/tardis/tardispro:11/<suffix>
pre-device=tardis|tardispro

หากต้องการรองรับฟังก์ชันนี้ในอุปกรณ์ที่ใช้ Android 10 โปรดดูการติดตั้งใช้งานอ้างอิง รายการการเปลี่ยนแปลงนี้จะแยกวิเคราะห์คำสั่ง import ในไฟล์ build.prop แบบมีเงื่อนไข ซึ่งช่วยให้ระบบจดจำการลบล้างพร็อพเพอร์ตี้และแสดงในการ อัปเดตข้อมูลเมตาผ่าน OTA ขั้นสุดท้ายได้