การอัปเดตระบบที่ไม่ใช่ A/B

บนอุปกรณ์ Android รุ่นเก่าที่ไม่มีพาร์ติชั่น A/B พื้นที่แฟลชโดยทั่วไปจะมีพาร์ติชั่นต่อไปนี้:

boot
ประกอบด้วยเคอร์เนล Linux และระบบไฟล์รูทขั้นต่ำ (โหลดลงในดิสก์ RAM) มันติดตั้งระบบและพาร์ติชั่นอื่น ๆ และเริ่มรันไทม์ที่อยู่บนพาร์ติชั่นระบบ
ระบบ
ประกอบด้วยแอปพลิเคชันระบบและไลบรารีที่มีซอร์สโค้ดอยู่ใน Android Open Source Project (AOSP) ระหว่างการทำงานปกติ พาร์ติชั่นนี้จะถูกเมาต์แบบอ่านอย่างเดียว เนื้อหาจะเปลี่ยนเฉพาะระหว่างการอัปเดต OTA
ผู้ขาย
ประกอบด้วยแอปพลิเคชันระบบและไลบรารีที่ ไม่มี ซอร์สโค้ดใน Android Open Source Project (AOSP) ระหว่างการทำงานปกติ พาร์ติชั่นนี้จะถูกเมาต์แบบอ่านอย่างเดียว เนื้อหาจะเปลี่ยนเฉพาะระหว่างการอัปเดต OTA
ข้อมูลผู้ใช้
จัดเก็บข้อมูลที่บันทึกโดยแอปพลิเคชันที่ติดตั้งโดยผู้ใช้ ฯลฯ พาร์ติชันนี้ปกติจะไม่ถูกแตะต้องโดยกระบวนการอัปเดต OTA
แคช
พื้นที่เก็บชั่วคราวที่ใช้โดยแอปพลิเคชั่นบางตัว (การเข้าถึงพาร์ติชั่นนี้ต้องได้รับอนุญาตจากแอพพิเศษ) และสำหรับการจัดเก็บแพ็คเกจการอัปเดต OTA ที่ดาวน์โหลด โปรแกรมอื่นๆ ใช้พื้นที่นี้โดยคาดหวังว่าไฟล์จะหายไปได้ทุกเมื่อ การติดตั้งแพ็คเกจ OTA บางอย่างอาจทำให้พาร์ติชั่นนี้ถูกล้างอย่างสมบูรณ์ แคชยังมีบันทึกการอัปเดตจากการอัปเดต OTA
การกู้คืน
ประกอบด้วยระบบ Linux ที่สมบูรณ์ตัวที่สอง รวมถึงเคอร์เนลและไบนารีการกู้คืนพิเศษที่อ่านแพ็คเกจและใช้เนื้อหาเพื่ออัพเดตพาร์ติชั่นอื่น
อื่น ๆ
พาร์ติชั่นเล็กๆ ที่ใช้โดยการกู้คืนเพื่อซ่อนข้อมูลบางอย่างเกี่ยวกับสิ่งที่กำลังทำในกรณีที่อุปกรณ์ถูกรีสตาร์ทในขณะที่กำลังใช้แพ็คเกจ OTA

ชีวิตของการอัปเดต OTA

การอัปเดต OTA ทั่วไปประกอบด้วยขั้นตอนต่อไปนี้:

  1. อุปกรณ์ทำการเช็คอินเป็นประจำกับเซิร์ฟเวอร์ OTA และได้รับแจ้งถึงความพร้อมใช้งานของการอัปเดต รวมถึง URL ของแพ็คเกจการอัปเดตและสตริงคำอธิบายที่จะแสดงให้ผู้ใช้เห็น
  2. อัปเดตการดาวน์โหลดไปยังแคชหรือพาร์ติชั่นข้อมูล และลายเซ็นเข้ารหัสของมันถูกตรวจสอบกับใบรับรองใน /system/etc/security/otacerts.zip ผู้ใช้จะได้รับแจ้งให้ติดตั้งการอัปเดต
  3. อุปกรณ์จะรีบูตเข้าสู่โหมดการกู้คืน ซึ่งเคอร์เนลและระบบในพาร์ติชั่นการกู้คืนจะถูกบู๊ตแทนเคอร์เนลในพาร์ติชั่นสำหรับเริ่มระบบ
  4. ไบนารีการกู้คืนเริ่มต้นโดย init พบอาร์กิวเมนต์บรรทัดคำสั่งใน /cache/recovery/command ที่ชี้ไปที่แพ็คเกจที่ดาวน์โหลด
  5. Recovery ตรวจสอบลายเซ็นเข้ารหัสของแพ็คเกจกับพับลิกคีย์ใน /res/keys (ส่วนหนึ่งของดิสก์ RAM ที่มีอยู่ในพาร์ติชั่นการกู้คืน)
  6. ข้อมูลจะถูกดึงออกจากแพ็คเกจและใช้เพื่ออัพเดตพาร์ติชั่นสำหรับบู๊ต ระบบ และ/หรือผู้จำหน่ายตามความจำเป็น ไฟล์ใหม่ที่เหลืออยู่ในพาร์ติชั่นระบบมีเนื้อหาของพาร์ติชั่นการกู้คืนใหม่
  7. อุปกรณ์รีบูตตามปกติ
    1. มีการโหลดพาร์ติชันสำหรับเริ่มระบบที่อัปเดตใหม่ และติดตั้งและเริ่มดำเนินการไบนารีในพาร์ติชันระบบที่อัปเดตใหม่
    2. เป็นส่วนหนึ่งของการเริ่มต้นปกติ ระบบจะตรวจสอบเนื้อหาของพาร์ติชันการกู้คืนกับเนื้อหาที่ต้องการ (ซึ่งก่อนหน้านี้ถูกจัดเก็บเป็นไฟล์ใน /system ) ต่างกัน ดังนั้นพาร์ติชั่นการกู้คืนจึงถูกรีเฟรชด้วยเนื้อหาที่ต้องการ (ในการบู๊ตครั้งถัดไป พาร์ติชั่นการกู้คืนมีเนื้อหาใหม่อยู่แล้ว ดังนั้นจึงไม่จำเป็นต้องรีแฟลช)

การอัปเดตระบบเสร็จสมบูรณ์! บันทึกการอัพเดทสามารถพบได้ใน /cache/recovery/last_log. # .

อัพเดทแพ็คเกจ

แพ็คเกจการอัปเดตคือไฟล์ .zip ที่มีไบนารีที่เรียกใช้งาน META-INF/com/google/android/update-binary หลังจากตรวจสอบลายเซ็นบนแพ็คเกจแล้ว recovery จะแยกไบนารีนี้ไปที่ /tmp และรันไบนารี โดยส่งผ่านอาร์กิวเมนต์ต่อไปนี้:

  • อัปเดตหมายเลขเวอร์ชันไบนารี API หากอาร์กิวเมนต์ส่งผ่านไปยังการเปลี่ยนแปลงไบนารีของการอัปเดต ตัวเลขนี้จะเพิ่มขึ้น
  • ตัวอธิบายไฟล์ของ ไพพ์คำสั่ง โปรแกรมอัพเดตสามารถใช้ไพพ์นี้เพื่อส่งคำสั่งกลับไปยังไบนารีการกู้คืน ส่วนใหญ่สำหรับการเปลี่ยนแปลง UI เช่น การแสดงความคืบหน้าไปยังผู้ใช้
  • ชื่อไฟล์ของแพ็คเกจการอัปเดต ไฟล์ .zip

แพ็คเกจการอัพเดทสามารถใช้ไบนารีที่เชื่อมโยงแบบสถิตเป็นไบนารีการอัพเดท เครื่องมือสร้างแพ็คเกจ OTA ใช้โปรแกรมอัพเดต ( bootable/recovery/updater ) ซึ่งจัดเตรียมภาษาสคริปต์อย่างง่ายที่สามารถทำงานได้หลายอย่างในการติดตั้ง คุณสามารถแทนที่ไบนารีอื่น ๆ ที่ทำงานบนอุปกรณ์ได้

สำหรับรายละเอียดเกี่ยวกับไบนารี updater, edify syntax และฟังก์ชันในตัว โปรดดูที่ Inside OTA Packages

การย้ายจากรุ่นก่อนหน้า

เมื่อโยกย้ายจากรุ่น Android 2.3/3.0/4.0 การเปลี่ยนแปลงที่สำคัญคือการแปลงฟังก์ชันการทำงานเฉพาะอุปกรณ์ทั้งหมดจากชุดฟังก์ชัน C ที่มีชื่อที่กำหนดไว้ล่วงหน้าเป็นออบเจ็กต์ C++ ตารางต่อไปนี้แสดงรายการฟังก์ชันเก่าและเมธอดใหม่ที่มีจุดประสงค์เทียบเท่าอย่างคร่าวๆ:

ฟังก์ชัน C วิธี C++
device_recovery_start() อุปกรณ์::RecoveryStart()
อุปกรณ์_toggle_display()
device_reboot_now()
RecoveryUI::CheckKey()
(ด้วย RecoveryUI::IsKeyPressed())
device_handle_key() อุปกรณ์::HandleMenuKey()
device_perform_action() อุปกรณ์::InvokeMenuItem()
อุปกรณ์_wipe_data() อุปกรณ์::WipeData()
อุปกรณ์_ui_init() ScreenRecoveryUI::Init()

การแปลงฟังก์ชันเก่าเป็นวิธีการใหม่ควรตรงไปตรงมาพอสมควร อย่าลืมเพิ่ม make_device() ใหม่เพื่อสร้างและส่งคืนอินสแตนซ์ของคลาสย่อย Device ใหม่ของคุณ