คำถามที่พบบ่อย

Google เคยใช้ OTA แบบ A/B ในอุปกรณ์ใดบ้าง

ได้ ชื่อทางการตลาดสำหรับการอัปเดต A/B คือการอัปเดตที่ราบรื่น โทรศัพท์ Pixel และ Pixel XL ที่จัดส่งตั้งแต่เดือนตุลาคม 2016 มาพร้อมกับ A/B และ Chromebook ทุกเครื่องใช้ update_engine การติดตั้งใช้งาน A/B เดียวกัน การติดตั้งใช้งานโค้ดแพลตฟอร์มที่จำเป็นเป็นแบบสาธารณะใน Android 7.1 ขึ้นไป

เหตุใด OTA ที่ทำการทดสอบ A/B จึงดีกว่า

OTA แบบ A/B ช่วยให้ผู้ใช้ได้รับประสบการณ์การใช้งานที่ดียิ่งขึ้นเมื่อทำการอัปเดต  การวัดผลจากการอัปเดตความปลอดภัยรายเดือนแสดงให้เห็นว่าฟีเจอร์นี้ประสบความสำเร็จแล้ว โดยในเดือนพฤษภาคม 2017 เจ้าของ Pixel 95% ใช้การอัปเดตความปลอดภัยล่าสุดหลังจากผ่านไป 1 เดือน เทียบกับผู้ใช้ Nexus 87% และผู้ใช้ Pixel อัปเดตเร็วกว่าผู้ใช้ Nexus การอัปเดตบล็อกระหว่าง OTA ที่ล้มเหลวจะไม่ทำให้อุปกรณ์บูตไม่ได้อีกต่อไป จนกว่าอิมเมจระบบใหม่จะบูตสำเร็จ Android จะยังคงมีความสามารถในการย้อนกลับไปยังอิมเมจระบบที่ใช้งานได้ก่อนหน้า

system_other คืออะไร

แอปพลิเคชันจะจัดเก็บไว้ในไฟล์ .apk ซึ่งเป็นไฟล์ ZIP ไฟล์ .apk แต่ละไฟล์มีไฟล์ .dex อย่างน้อย 1 ไฟล์อยู่ภายใน ซึ่งมีไบต์โค้ด Dalvik แบบพกพา ไฟล์ .odex (optimized .dex) จะแยกจากไฟล์ .apk และอาจมีโค้ดเครื่องที่เฉพาะเจาะจงกับอุปกรณ์ หากมีไฟล์ .odex Android จะเรียกใช้แอปพลิเคชันด้วยความเร็วที่คอมไพล์ล่วงหน้าได้ โดยไม่ต้องรอให้คอมไพล์โค้ดทุกครั้งที่เปิดแอปพลิเคชัน ไฟล์ .odex ไม่ได้จำเป็นอย่างเคร่งครัด: Android สามารถเรียกใช้โค้ด .dex ได้โดยตรงผ่าน การตีความหรือการคอมไพล์แบบ Just-In-Time (JIT) แต่ไฟล์ .odex จะให้ การผสมผสานที่ดีที่สุดระหว่างความเร็วในการเปิดตัวและความเร็วขณะรันไทม์หากมีพื้นที่ว่าง

ตัวอย่าง: สำหรับไฟล์ installed-files.txt จาก Nexus 6P ที่ใช้ Android 7.1 ซึ่งมีขนาดอิมเมจระบบทั้งหมด 2628MiB (2755792836 ไบต์) รายละเอียดของผู้ที่มีส่วนทำให้ขนาดอิมเมจระบบโดยรวม มีขนาดใหญ่ที่สุดตามประเภทไฟล์มีดังนี้

.odex 1391770312 ไบต์ 50.5%
.apk 846878259 ไบต์ 30.7%
.so (โค้ด C/C++ แบบเนทีฟ) 202162479 ไบต์ 7.3%
ไฟล์ .oat/รูปภาพ .art 163892188 ไบต์ 5.9%
แบบอักษร 38952361 ไบต์ 1.4%
ข้อมูลภาษา ICU 27468687 ไบต์ 0.9%

ตัวเลขเหล่านี้คล้ายกันสำหรับอุปกรณ์อื่นๆ ด้วย ดังนั้นในอุปกรณ์ Nexus/Pixel ไฟล์ .odex จะใช้พื้นที่ประมาณครึ่งหนึ่งของพาร์ติชันระบบ ซึ่งหมายความว่าเราจะใช้ ext4 ต่อไปได้ แต่จะเขียนไฟล์ .odex ไปยังพาร์ติชัน B ที่โรงงาน แล้วคัดลอกไปยัง /data ในการบูตครั้งแรก พื้นที่เก็บข้อมูลจริงที่ใช้กับ A/B ของ ext4 จะเหมือนกับ A/B ของ SquashFS เนื่องจากหากเราใช้ SquashFS เราจะจัดส่งไฟล์ .odex ที่มีการเพิ่มประสิทธิภาพล่วงหน้าใน system_a แทนที่จะเป็น system_b

การคัดลอกไฟล์ .odex ไปยัง /data ไม่ได้หมายความว่าพื้นที่ที่ประหยัดได้ใน /system จะหายไปใน /data ใช่ไหม

ก็ไม่เชิง ใน Pixel พื้นที่ส่วนใหญ่ที่ไฟล์ .odex ใช้จะเป็นของแอป ซึ่งโดยปกติจะ อยู่ใน /data แอปเหล่านี้จะได้รับการอัปเดตจาก Google Play ดังนั้นไฟล์ .apk และ .odex ในอิมเมจระบบจึงไม่ได้ใช้ตลอดอายุการใช้งานส่วนใหญ่ของอุปกรณ์ คุณสามารถยกเว้นไฟล์ดังกล่าว ทั้งหมดและแทนที่ด้วยไฟล์ .odex ขนาดเล็กที่อิงตามโปรไฟล์เมื่อผู้ใช้ใช้งานแต่ละแอปจริง (จึงไม่ต้องใช้พื้นที่สำหรับแอปที่ผู้ใช้ไม่ได้ใช้) โปรดดูรายละเอียดที่การพูดคุยในงาน Google I/O 2016 เรื่องวิวัฒนาการของศิลปะ

การเปรียบเทียบทำได้ยากเนื่องจากเหตุผลสำคัญ 2-3 ประการ ดังนี้

  • แอปที่ Google Play อัปเดตจะมีไฟล์ .odex ใน /data เสมอ ทันทีที่ได้รับการอัปเดตครั้งแรก
  • แอปที่ผู้ใช้ไม่ได้เรียกใช้ไม่จำเป็นต้องมีไฟล์ .odex
  • การคอมไพล์ที่อิงตามโปรไฟล์จะสร้างไฟล์ .odex ที่มีขนาดเล็กกว่าการคอมไพล์ล่วงหน้า (เนื่องจากแบบแรกจะเพิ่มประสิทธิภาพเฉพาะโค้ดที่สำคัญต่อประสิทธิภาพเท่านั้น)

ดูรายละเอียดเกี่ยวกับตัวเลือกการปรับแต่งที่มีให้สำหรับ OEM ได้ที่ การกำหนดค่า ART

มีไฟล์ .odex 2 สำเนาใน /data ใช่ไหม

ซึ่งจะซับซ้อนขึ้นเล็กน้อย ... หลังจากเขียนอิมเมจระบบใหม่แล้ว ระบบจะเรียกใช้ dex2oat เวอร์ชันใหม่กับไฟล์ .dex ใหม่เพื่อสร้างไฟล์ .odex ใหม่ ซึ่งจะเกิดขึ้นขณะที่ระบบเดิมยังทำงานอยู่ ดังนั้นไฟล์ .odex ทั้งเก่าและใหม่จะอยู่ใน /data พร้อมกัน

โค้ดใน OtaDexoptService (frameworks/base/+/android16-release/services/core/java/com/android/server/pm/OtaDexoptService.java) จะเรียกใช้ getAvailableSpace ก่อนที่จะเพิ่มประสิทธิภาพแต่ละแพ็กเกจเพื่อหลีกเลี่ยงการเพิ่มประสิทธิภาพมากเกินไป /data โปรดทราบว่าคำว่าพร้อมใช้งานในที่นี้ยังคงเป็นค่าประมาณแบบระมัดระวัง ซึ่งเป็นปริมาณพื้นที่ที่เหลือก่อนถึงเกณฑ์พื้นที่เหลือน้อยของระบบตามปกติ (วัดเป็นทั้งเปอร์เซ็นต์และจำนวนไบต์) ดังนั้นหาก /data เต็ม ระบบจะไม่ทำสำเนาไฟล์ .odex ทุกไฟล์ โค้ดเดียวกันนี้ยังมี BULK_DELETE_THRESHOLD ด้วย หากอุปกรณ์ใกล้จะใช้พื้นที่ว่างจนเต็ม (ตามที่อธิบายไว้) ระบบจะนำไฟล์ .odex ที่เป็นของแอปที่ไม่ได้ใช้งานออก นั่นเป็นอีกกรณีที่ไม่มีไฟล์ .odex 2 ชุด

ในกรณีที่/dataเต็มจนไม่สามารถใช้งานได้ การอัปเดตจะรอจนกว่า อุปกรณ์จะรีบูตเข้าสู่ระบบใหม่และไม่จำเป็นต้องใช้ไฟล์ .odex ของระบบเก่าอีกต่อไป PackageManager จะจัดการเรื่องนี้ (frameworks/base/+/android16-release/services/core/java/com/android/server/pm/PackageManagerService.java#7215) หลังจากที่ระบบใหม่บูตเรียบร้อยแล้ว installd (frameworks/native/+/android16-release/cmds/installd/dexopt.cpp#2422) จะนำไฟล์ .odex ที่ระบบเก่าใช้ไปออกได้ ซึ่งจะทำให้อุปกรณ์กลับสู่ สถานะปกติที่มีสำเนาเพียงชุดเดียว

ดังนั้นแม้ว่า /data อาจมีไฟล์ .odex ทั้งหมด 2 ชุด (ก) แต่การดำเนินการนี้เป็นเพียงชั่วคราวและ (ข) จะเกิดขึ้นก็ต่อเมื่อคุณมีพื้นที่ว่างเพียงพอใน /data อยู่แล้ว โดยจะมีสำเนาเพียงฉบับเดียวเท่านั้น ยกเว้นในระหว่างการอัปเดต และในส่วนของฟีเจอร์ความเสถียรทั่วไปของ ART ระบบจะไม่เติม /data ด้วยไฟล์ .odex อยู่แล้ว (เนื่องจากจะเป็นปัญหาในระบบที่ไม่ใช่ A/B ด้วย)

การเขียน/คัดลอกทั้งหมดนี้จะทำให้แฟลชเสื่อมสภาพมากขึ้นไหม

โดยจะเขียนทับเฉพาะส่วนเล็กๆ ของหน่วยความจำแฟลชเท่านั้น ซึ่งการอัปเดตระบบ Pixel แบบเต็มจะเขียนทับประมาณ 2.3 GiB (ระบบจะคอมไพล์แอปอีกครั้งด้วย แต่การดำเนินการนี้จะเกิดขึ้นกับอุปกรณ์ที่ไม่ใช่ A/B ด้วย) โดยปกติแล้ว OTA แบบเต็มที่อิงตามบล็อกจะเขียนข้อมูลในปริมาณที่คล้ายกัน ดังนั้นอัตราการสึกหรอของหน่วยความจำแฟลชจึงควรคล้ายกัน

การแฟลชพาร์ติชันระบบ 2 รายการจะเพิ่มเวลาในการแฟลชจากโรงงานไหม

ไม่ Pixel ไม่ได้เพิ่มขนาดอิมเมจของระบบ (เพียงแค่แบ่งพื้นที่ออกเป็น 2 พาร์ติชัน เท่านั้น)

การเก็บไฟล์ .odex ไว้ใน B จะทำให้การรีบูตหลังจากรีเซ็ตข้อมูลเป็นค่าเริ่มต้นช้าลงใช่ไหม

ได้ หากคุณใช้อุปกรณ์จริง รับ OTA และรีเซ็ตข้อมูลเป็นค่าเริ่มต้น การรีบูตครั้งแรกจะช้ากว่าปกติ (1 นาที 40 วินาที เทียบกับ 40 วินาทีใน Pixel XL) เนื่องจากไฟล์ .odex จะหายไปจาก B หลังจาก OTA ครั้งแรก จึงคัดลอกไปยัง /data ไม่ได้ นั่นคือข้อแลกเปลี่ยน

การรีเซ็ตข้อมูลเป็นค่าเริ่มต้นจากโรงงานควรเป็นการดำเนินการที่เกิดขึ้นไม่บ่อยนักเมื่อเทียบกับการบูตปกติ ดังนั้นเวลาที่ใช้จึงมีความสำคัญน้อยกว่า (การดำเนินการนี้ไม่ส่งผลต่อผู้ใช้หรือผู้ตรวจสอบที่ได้รับอุปกรณ์จากโรงงาน เนื่องจากในกรณีดังกล่าว พาร์ติชัน B จะพร้อมใช้งาน) การใช้คอมไพเลอร์ JIT หมายความว่าเรา ไม่จำเป็นต้องคอมไพล์ทุกอย่างใหม่ จึงไม่ได้แย่อย่างที่คุณคิด นอกจากนี้ คุณยัง ทำเครื่องหมายแอปว่าต้องมีการคอมไพล์ล่วงหน้าได้โดยใช้ coreApp="true" ในไฟล์ Manifest (frameworks/base/+/android16-release/packages/SystemUI/AndroidManifest.xml#23) ปัจจุบัน system_server ใช้การคอมไพล์ล่วงหน้านี้เนื่องจากไม่อนุญาตให้ใช้ JIT ด้วยเหตุผลด้านความปลอดภัย

การเก็บไฟล์ .odex ไว้ใน /data แทนที่จะเก็บไว้ใน /system จะทำให้การรีบูตหลังจาก OTA ช้าลงใช่ไหม

ไม่ ตามที่อธิบายไว้ข้างต้น ระบบจะเรียกใช้ dex2oat ใหม่ขณะที่อิมเมจระบบเก่ากำลังทำงานอยู่เพื่อ สร้างไฟล์ที่ระบบใหม่จะต้องใช้ ระบบจะไม่ถือว่าการอัปเดตพร้อมใช้งานจนกว่าจะดำเนินการดังกล่าวเสร็จสิ้น

เราควรจัดส่งอุปกรณ์ A/B ขนาด 32 GiB ไหม 16 GiB 8 GiB

32 GiB ทำงานได้ดีเนื่องจากได้รับการพิสูจน์แล้วใน Pixel และ 320 MiB จาก 16 GiB หมายถึงการลดลง 2% ในทำนองเดียวกัน 320 MiB จาก 8 GiB ก็ลดลง 4% แน่นอนว่า A/B ไม่ใช่ตัวเลือกที่แนะนำ ในอุปกรณ์ที่มี 4 GiB เนื่องจากค่าใช้จ่ายเพิ่มเติม 320 MiB คิดเป็นเกือบ 10% ของพื้นที่ทั้งหมดที่ใช้ได้

AVB2.0 ต้องใช้ OTA แบบ A/B ไหม

ไม่ Verified Boot ของ Android กำหนดให้ใช้การอัปเดตแบบบล็อกมาโดยตลอด แต่ไม่จำเป็นต้องเป็นการอัปเดต A/B

OTA แบบ A/B ต้องใช้ AVB2.0 ไหม

ไม่

OTA แบบ A/B จะทำให้การป้องกันการย้อนกลับของ AVB2.0 หยุดทำงานไหม

ไม่ ระบบ A/B จะไม่เปลี่ยนกลับไปใช้พาร์ติชันที่ใช้งานอยู่ก่อนหน้าโดยอัตโนมัติหากบูตเข้าสู่รูปภาพระบบใหม่ไม่สำเร็จ (หลังจากลองใหม่ตามจำนวนครั้งที่กำหนดโดยโปรแกรมโหลดบูต) แต่จะเปลี่ยนกลับไปใช้รูปภาพระบบ "ก่อนหน้า" โดยอัตโนมัติ แต่ประเด็นสำคัญในที่นี้คือ "ก่อนหน้า" ในความหมายของ A/B ยังคงเป็นอิมเมจระบบ "ปัจจุบัน" ทันทีที่อุปกรณ์บูตอิมเมจใหม่ได้สำเร็จ การป้องกันการย้อนกลับจะเริ่มทำงานและรับประกันว่าคุณจะย้อนกลับไม่ได้ แต่จนกว่าคุณจะ บูตอิมเมจใหม่ได้สำเร็จจริงๆ การป้องกันการย้อนกลับจะไม่ถือว่าอิมเมจนั้นเป็น อิมเมจระบบปัจจุบัน

หากติดตั้งการอัปเดตขณะที่ระบบทำงานอยู่ จะไม่ช้าไปหน่อยหรือ

การอัปเดตแบบไม่ใช่ A/B มีเป้าหมายคือการติดตั้งการอัปเดตให้เร็วที่สุดเท่าที่จะเป็นไปได้ เนื่องจากผู้ใช้ กำลังรอและใช้อุปกรณ์ไม่ได้ในขณะที่ระบบใช้การอัปเดต แต่การอัปเดต A/B จะตรงกันข้าม เนื่องจากผู้ใช้ยังคงใช้อุปกรณ์อยู่ เป้าหมายคือการลดผลกระทบให้เหลือน้อยที่สุด ดังนั้นการอัปเดตจึงจะช้าโดยเจตนา ผ่านตรรกะในไคลเอ็นต์การอัปเดตระบบ Java (ซึ่งสำหรับ Google คือ GmsCore ซึ่งเป็นแพ็กเกจหลักที่ GMS จัดหาให้) Android ยังพยายาม เลือกเวลาที่ผู้ใช้ไม่ได้ใช้อุปกรณ์เลยด้วย แพลตฟอร์มรองรับ การหยุด/กลับมาอัปเดตต่อ และไคลเอ็นต์สามารถใช้ฟีเจอร์นี้เพื่อหยุดการอัปเดตชั่วคราวหากผู้ใช้ เริ่มใช้อุปกรณ์ และกลับมาอัปเดตต่อเมื่ออุปกรณ์ไม่ได้ใช้งานอีกครั้ง

การทำ OTA มี 2 เฟส ซึ่งแสดงอย่างชัดเจนใน UI เป็นขั้นตอนที่ 1 จาก 2 และ ขั้นตอนที่ 2 จาก 2 ใต้แถบความคืบหน้า ขั้นตอนที่ 1 สอดคล้องกับการเขียนบล็อกข้อมูล ส่วนขั้นตอนที่ 2 คือการคอมไพล์ไฟล์ .dex ล่วงหน้า ทั้ง 2 เฟสนี้มีความแตกต่างกันอย่างมากในแง่ของ ผลกระทบต่อประสิทธิภาพ ระยะแรกคือ I/O อย่างง่าย การดำเนินการนี้ใช้ทรัพยากร (RAM, CPU, I/O) น้อยมากเนื่องจากเป็นการคัดลอกบล็อกอย่างช้าๆ

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

กระบวนการนี้คล้ายกับตอนที่ Google Play ติดตั้งการอัปเดตแอปในเบื้องหลังก่อน แสดงการแจ้งเตือนอัปเดตแอป 5 รายการแล้ว ซึ่งดำเนินการมาหลายปีแล้ว

จะเกิดอะไรขึ้นหากผู้ใช้รอการอัปเดตอยู่

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

จะเกิดอะไรขึ้นหากอัปเดตไม่สำเร็จ

ในการอัปเดตแบบไม่ใช่ A/B หากการอัปเดตใช้ไม่ได้ ผู้ใช้มักจะเหลือเพียงอุปกรณ์ที่ใช้ไม่ได้ ข้อยกเว้นเพียงอย่างเดียวคือหากเกิดข้อผิดพลาดก่อนที่แอปพลิเคชันจะเริ่มทำงาน (เนื่องจากแพ็กเกจยืนยันไม่สำเร็จ เป็นต้น) การอัปเดต A/B ทำให้การอัปเดตไม่สำเร็จ ไม่ส่งผลต่อระบบที่กำลังทำงานอยู่ คุณลองอัปเดตอีกครั้งในภายหลังได้