การอัปเดตที่ไม่ใช่ AB เป็นวิธีการ OTA ที่เลิกใช้งานแล้วซึ่งอุปกรณ์ Android รุ่นเก่าใช้ (Android 6 และเก่ากว่า) อุปกรณ์เหล่านี้มีพาร์ติชันการกู้คืนเฉพาะที่มีซอฟต์แวร์ที่จำเป็นในการแตกไฟล์แพ็กเกจการอัปเดตที่ดาวน์โหลดมาและใช้การอัปเดตกับพาร์ติชันอื่นๆ
ในอุปกรณ์ Android รุ่นเก่าที่ไม่มีพาร์ติชัน A/B พื้นที่เก็บข้อมูลแฟลชมักจะมีพาร์ติชันต่อไปนี้
- บูต
- มีเคอร์เนล Linux และระบบไฟล์รูทขั้นต่ำ (โหลดลงในดิสก์ RAM) โดยจะมาต่อเชื่อมระบบและพาร์ติชันอื่นๆ และเริ่มรันไทม์ที่อยู่ในพาร์ติชันระบบ
- ระบบ
- มีแอปพลิเคชันและไลบรารีของระบบที่มีซอร์สโค้ดอยู่ในโครงการโอเพนซอร์ส Android (AOSP) ในระหว่างการทํางานตามปกติ ระบบจะเมานต์พาร์ติชันนี้แบบอ่านอย่างเดียว เนื้อหาของพาร์ติชันจะเปลี่ยนแปลงเฉพาะระหว่างการอัปเดต OTA
- ผู้จำหน่าย
- มีแอปพลิเคชันและไลบรารีของระบบที่ไม่มีซอร์สโค้ดในโครงการโอเพนซอร์ส Android (AOSP) ในระหว่างการทํางานตามปกติ ระบบจะเมานต์พาร์ติชันนี้เป็นแบบอ่านอย่างเดียว โดยเนื้อหาจะเปลี่ยนแปลงเฉพาะระหว่างการอัปเดต OTA
- userdata
- จัดเก็บข้อมูลที่บันทึกโดยแอปพลิเคชันที่ผู้ใช้ติดตั้งไว้ ฯลฯ โดยปกติแล้วกระบวนการอัปเดต OTA จะไม่แตะต้องพาร์ติชันนี้
- แคช
- พื้นที่เก็บข้อมูลชั่วคราวที่แอปพลิเคชันบางรายการใช้ (การเข้าถึงพาร์ติชันนี้ต้องมีสิทธิ์พิเศษของแอป) และสำหรับจัดเก็บแพ็กเกจการอัปเดต OTA ที่ดาวน์โหลด โปรแกรมอื่นๆ ใช้พื้นที่นี้โดยคาดหวังว่าไฟล์อาจหายไปได้ทุกเมื่อ การติดตั้งแพ็กเกจ OTA บางรายการอาจส่งผลให้พาร์ติชันนี้ถูกล้างออกทั้งหมด แคชยังมีบันทึกการอัปเดตจากการอัปเดต OTA ด้วย
- การกู้คืน
- มีระบบ Linux ที่สมบูรณ์ระบบที่ 2 ซึ่งรวมถึงเคอร์เนลและไบนารีการกู้คืนพิเศษที่อ่านแพ็กเกจและใช้เนื้อหาของแพ็กเกจเพื่ออัปเดตพาร์ติชันอื่นๆ
- เบ็ดเตล็ด
- พาร์ติชันขนาดเล็กที่การกู้คืนใช้เพื่อเก็บข้อมูลบางอย่างเกี่ยวกับสิ่งที่กำลังทำไว้ในกรณีที่อุปกรณ์รีสตาร์ทขณะกำลังใช้แพ็กเกจ OTA
ระยะเวลาของการอัปเดต OTA
การอัปเดต OTA โดยทั่วไปมีขั้นตอนต่อไปนี้
- อุปกรณ์จะตรวจสอบกับเซิร์ฟเวอร์ OTA เป็นประจําและได้รับการแจ้งเตือนเมื่อมีอัปเดต รวมถึง URL ของแพ็กเกจอัปเดตและสตริงคําอธิบายที่จะแสดงต่อผู้ใช้
-
อัปเดตการดาวน์โหลดลงในแคชหรือพาร์ติชันข้อมูล และยืนยันลายเซ็นการเข้ารหัสเทียบกับใบรับรองใน
/system/etc/security/otacerts.zip
ระบบจะแจ้งให้ผู้ใช้ติดตั้งการอัปเดต - อุปกรณ์จะรีบูตเข้าสู่โหมดการกู้คืน ซึ่งระบบจะบูตเคอร์เนลและระบบในพาร์ติชันการกู้คืนแทนเคอร์เนลในพาร์ติชันการบูต
-
init เริ่มไบนารีการกู้คืน โดยจะค้นหาอาร์กิวเมนต์บรรทัดคำสั่งใน
/cache/recovery/command
ที่ชี้ไปยังแพ็กเกจที่ดาวน์โหลด -
การกู้คืนจะยืนยันลายเซ็นการเข้ารหัสของแพ็กเกจเทียบกับคีย์สาธารณะใน
/res/keys
(ส่วนหนึ่งของดิสก์ RAM ที่มีอยู่ในพาร์ติชันการกู้คืน) - ระบบจะดึงข้อมูลจากแพ็กเกจและใช้เพื่ออัปเดตพาร์ติชันสำหรับบูต ระบบ และ/หรือผู้ให้บริการตามที่จำเป็น ไฟล์ใหม่ 1 ไฟล์ที่เหลืออยู่ในพาร์ติชันระบบจะมีเนื้อหาของพาร์ติชันการกู้คืนใหม่
-
อุปกรณ์รีบูตตามปกติ
- ระบบจะโหลดพาร์ติชันสำหรับบูตที่อัปเดตใหม่ จากนั้นจะเมานต์และเริ่มดำเนินการไบนารีในพาร์ติชันระบบที่อัปเดตใหม่
-
ในการเริ่มต้นระบบตามปกติ ระบบจะตรวจสอบเนื้อหาของพาร์ติชันการกู้คืนเทียบกับเนื้อหาที่ต้องการ (ซึ่งก่อนหน้านี้จัดเก็บเป็นไฟล์ใน
/system
) หากเนื้อหาไม่ตรงกัน ระบบจะแฟลชพาร์ติชันการกู้คืนอีกครั้งด้วยเนื้อหาที่ต้องการ (ในการบูตครั้งต่อๆ ไป พาร์ติชันการกู้คืนจะมีเนื้อหาใหม่อยู่แล้ว จึงไม่จำเป็นต้องแฟลชอีกครั้ง)
การอัปเดตระบบเสร็จสมบูรณ์แล้ว ดูบันทึกการอัปเดตได้ใน
/cache/recovery/last_log.#
อัปเดตแพ็กเกจ
แพ็กเกจอัปเดตคือไฟล์ .zip
ที่มีไบนารีที่ปฏิบัติการได้
META-INF/com/google/android/update-binary
หลังจากยืนยันลายเซ็นในแพ็กเกจแล้ว recovery
จะแตกไฟล์ไบนารีนี้ไปยัง /tmp
และเรียกใช้ไบนารีโดยส่งอาร์กิวเมนต์ต่อไปนี้
- อัปเดตหมายเลขเวอร์ชันของ API แบบไบนารี หากอาร์กิวเมนต์ที่ส่งไปยังการอัปเดตไบนารีมีการเปลี่ยนแปลง ตัวเลขนี้จะเพิ่มขึ้น
- ตัวระบุไฟล์ของไปป์คำสั่ง โปรแกรมอัปเดตสามารถใช้ไปป์นี้เพื่อส่งคำสั่งกลับไปที่ไบนารีการกู้คืนได้ โดยส่วนใหญ่จะใช้สำหรับการเปลี่ยนแปลง UI เช่น แสดงความคืบหน้าต่อผู้ใช้
-
ชื่อไฟล์
.zip
ของแพ็กเกจอัปเดต
แพ็กเกจอัปเดตสามารถใช้ไบนารีที่ลิงก์แบบคงที่ใดก็ได้เป็นไบนารีอัปเดต เครื่องมือสร้างแพ็กเกจ OTA ใช้โปรแกรมอัปเดต (bootable/recovery/updater
) ซึ่งมีภาษาสคริปต์ง่ายๆ ที่ทํางานต่างๆ ของการติดตั้งได้ คุณแทนที่ไบนารีอื่นๆ ที่ทำงานในอุปกรณ์ได้
ดูรายละเอียดเกี่ยวกับไบนารีโปรแกรมอัปเดต ไวยากรณ์ edify และฟังก์ชันในตัวได้ที่ภายในแพ็กเกจ OTA
ย้ายข้อมูลจากรุ่นก่อนหน้า
เมื่อย้ายข้อมูลจากรุ่น Android 2.3/3.0/4.0 การเปลี่ยนแปลงที่สำคัญคือการเปลี่ยนฟังก์ชันการทำงานทั้งหมดที่เจาะจงอุปกรณ์จากชุดฟังก์ชัน C ที่มีชื่อที่กำหนดไว้ล่วงหน้าเป็นออบเจ็กต์ C++ ตารางต่อไปนี้แสดงฟังก์ชันเดิมและเมธอดใหม่ที่ทํางานสําหรับวัตถุประสงค์ที่เทียบเท่ากัน
ฟังก์ชัน C | เมธอด C++ |
---|---|
device_recovery_start() | Device::RecoveryStart() |
device_toggle_display() device_reboot_now() |
RecoveryUI::CheckKey() (หรือ RecoveryUI::IsKeyPressed()) |
device_handle_key() | Device::HandleMenuKey() |
device_perform_action() | Device::InvokeMenuItem() |
device_wipe_data() | Device::WipeData() |
device_ui_init() | ScreenRecoveryUI::Init() |
การแปลงฟังก์ชันเก่าเป็นเมธอดใหม่ควรทำได้ง่าย อย่าลืมเพิ่มmake_device()
ฟังก์ชันใหม่เพื่อสร้างและแสดงผลอินสแตนซ์ของคลาสย่อย Device ใหม่