Bản cập nhật hệ thống không phải A/B

Bản cập nhật không phải AB là phương thức OTA không còn được dùng nữa, được các Thiết bị Android cũ (Android 6 trở xuống) sử dụng. Những thiết bị này có một phân vùng khôi phục chuyên dụng chứa phần mềm cần thiết để giải nén gói cập nhật đã tải xuống và áp dụng bản cập nhật cho các phân vùng khác.

Trên các thiết bị Android cũ không có phân vùng A/B, không gian flash thường chứa các phân vùng sau:

khởi động
Chứa nhân Linux và hệ thống tệp gốc tối thiểu (được tải vào ổ RAM). Tệp này sẽ gắn hệ thống và các phân vùng khác, đồng thời khởi động thời gian chạy nằm trên phân vùng hệ thống.
system
Chứa các ứng dụng và thư viện hệ thống có mã nguồn trên Dự án nguồn mở Android (AOSP). Trong quá trình hoạt động bình thường, phân vùng này được gắn ở chế độ chỉ có thể đọc; nội dung của phân vùng này chỉ thay đổi trong quá trình cập nhật OTA.
nhà cung cấp
Chứa các ứng dụng và thư viện hệ thống không có mã nguồn trên Dự án nguồn mở Android (AOSP). Trong quá trình hoạt động bình thường, phân vùng này được gắn ở chế độ chỉ có thể đọc; nội dung của phân vùng này chỉ thay đổi trong quá trình cập nhật OTA.
userdata
Lưu trữ dữ liệu do các ứng dụng do người dùng cài đặt lưu, v.v. Quá trình cập nhật OTA thường không ảnh hưởng đến phân vùng này.
bộ nhớ đệm
Khu vực giữ tạm thời do một số ứng dụng sử dụng (cần có quyền đặc biệt của ứng dụng để truy cập vào phân vùng này) và để lưu trữ các gói cập nhật OTA đã tải xuống. Các chương trình khác sử dụng không gian này với kỳ vọng rằng các tệp có thể biến mất bất cứ lúc nào. Một số lượt cài đặt gói OTA có thể khiến phân vùng này bị xoá hoàn toàn. Bộ nhớ đệm cũng chứa các nhật ký cập nhật từ bản cập nhật OTA.
khôi phục
Chứa một hệ thống Linux hoàn chỉnh thứ hai, bao gồm một hạt nhân và tệp nhị phân khôi phục đặc biệt đọc một gói và sử dụng nội dung của gói đó để cập nhật các phân vùng khác.
misc
Một phân vùng nhỏ mà tính năng khôi phục sử dụng để lưu trữ một số thông tin về những gì đang diễn ra trong trường hợp thiết bị khởi động lại trong khi gói OTA đang được áp dụng.

Vòng đời của bản cập nhật OTA

Một bản cập nhật OTA thông thường bao gồm các bước sau:

  1. Thiết bị thường xuyên kiểm tra với máy chủ OTA và được thông báo về việc có bản cập nhật hay không, bao gồm cả URL của gói cập nhật và chuỗi mô tả để hiển thị cho người dùng.
  2. Cập nhật nội dung tải xuống vào bộ nhớ đệm hoặc phân vùng dữ liệu và chữ ký mã hoá của nội dung đó được xác minh dựa trên các chứng chỉ trong /system/etc/security/otacerts.zip. Người dùng được nhắc cài đặt bản cập nhật.
  3. Thiết bị khởi động lại vào chế độ khôi phục, trong đó hạt nhân và hệ thống trong phân vùng khôi phục sẽ được khởi động thay vì hạt nhân trong phân vùng khởi động.
  4. Tệp nhị phân khôi phục được khởi động bằng init. Tìm các đối số dòng lệnh trong /cache/recovery/command trỏ đến gói đã tải xuống.
  5. Tính năng khôi phục xác minh chữ ký mã hoá của gói dựa trên các khoá công khai trong /res/keys (một phần của ổ RAM có trong phân vùng khôi phục).
  6. Dữ liệu được lấy từ gói và dùng để cập nhật các phân vùng khởi động, hệ thống và/hoặc nhà cung cấp nếu cần. Một trong các tệp mới còn lại trên phân vùng hệ thống chứa nội dung của phân vùng khôi phục mới.
  7. Thiết bị khởi động lại bình thường.
    1. Phân vùng khởi động mới cập nhật sẽ được tải, sau đó sẽ gắn và bắt đầu thực thi các tệp nhị phân trong phân vùng hệ thống mới cập nhật.
    2. Trong quá trình khởi động bình thường, hệ thống sẽ kiểm tra nội dung của phân vùng khôi phục với nội dung mong muốn (trước đây được lưu trữ dưới dạng tệp trong /system). Nếu nội dung của phân vùng khôi phục khác với nội dung mong muốn, thì phân vùng khôi phục sẽ được cài đặt lại bằng nội dung mong muốn. (Trong các lần khởi động tiếp theo, phân vùng khôi phục đã chứa nội dung mới, vì vậy, bạn không cần phải cài đặt lại ROM.)

Đã cập nhật xong hệ thống! Bạn có thể tìm thấy nhật ký cập nhật trong /cache/recovery/last_log.#.

Cập nhật gói

Gói cập nhật là một tệp .zip chứa tệp nhị phân thực thi META-INF/com/google/android/update-binary. Sau khi xác minh chữ ký trên gói, recovery sẽ trích xuất tệp nhị phân này vào /tmp và chạy tệp nhị phân, truyền các đối số sau:

  • Cập nhật số phiên bản API tệp nhị phân. Nếu các đối số được truyền đến tệp nhị phân cập nhật thay đổi, thì số này sẽ tăng lên.
  • Chỉ số mô tả tệp của ống lệnh. Chương trình cập nhật có thể sử dụng ống này để gửi lệnh trở lại tệp nhị phân khôi phục, chủ yếu là đối với các thay đổi về giao diện người dùng, chẳng hạn như cho người dùng biết tiến trình.
  • Tên tệp của tệp .zip gói cập nhật.

Gói cập nhật có thể sử dụng bất kỳ tệp nhị phân được liên kết tĩnh nào làm tệp nhị phân cập nhật. Các công cụ tạo gói OTA sử dụng chương trình cập nhật (bootable/recovery/updater). Chương trình này cung cấp một ngôn ngữ tập lệnh đơn giản có thể thực hiện nhiều tác vụ cài đặt. Bạn có thể thay thế bất kỳ tệp nhị phân nào khác đang chạy trên thiết bị.

Để biết thông tin chi tiết về tệp nhị phân của trình cập nhật, cú pháp edify và các hàm tích hợp, hãy xem phần Bên trong gói OTA.

Di chuyển từ các bản phát hành trước

Khi di chuyển từ bản phát hành Android 2.3/3.0/4.0, thay đổi lớn nhất là việc chuyển đổi tất cả chức năng dành riêng cho thiết bị từ một tập hợp các hàm C có tên được xác định trước sang đối tượng C++. Bảng sau đây liệt kê các hàm cũ và phương thức mới có mục đích tương đương:

Hàm C Phương thức C++
device_recovery_start() Device::RecoveryStart()
device_toggle_display()
device_reboot_now()
RecoveryUI::CheckKey()
(cũng là RecoveryUI::IsKeyPressed())
device_handle_key() Device::HandleMenuKey()
device_perform_action() Device::InvokeMenuItem()
device_wipe_data() Device::WipeData()
device_ui_init() ScreenRecoveryUI::Init()

Việc chuyển đổi các hàm cũ sang phương thức mới phải đơn giản và hợp lý. Đừng quên thêm hàm make_device() mới để tạo và trả về một thực thể của lớp con Thiết bị mới.