Trình quản lý bản cập nhật thực hiện các bản cập nhật cho VM. Trình quản lý bản cập nhật phối hợp với ứng dụng khách do nhà tích hợp hệ thống cung cấp. Ứng dụng khách cung cấp tải trọng bản cập nhật và điều phối bản cập nhật tổng thể cho xe. Bản cập nhật bao gồm các bước sau:
- READY (SẴN SÀNG): Không có bản cập nhật nào đang diễn ra.
- PREPARE (CHUẨN BỊ): Trình quản lý bản cập nhật ghi bản cập nhật vào đĩa, nhưng không kích hoạt bản cập nhật đó.
- ACTIVATE (KÍCH HOẠT): Trình quản lý bản cập nhật kích hoạt bản cập nhật đã chuẩn bị để bản cập nhật có hiệu lực sau khi khởi động lại.
- COMMIT (XÁC NHẬN): Trình quản lý bản cập nhật thực hiện bản cập nhật vĩnh viễn.
Hình 1. Hoạt động cấp cao của Trình quản lý bản cập nhật.
Trình quản lý bản cập nhật hỗ trợ các bản cập nhật hệ thống và bản cập nhật gói dịch vụ được mô tả trên trang này.
Bản cập nhật hệ thống
Hệ điều hành Android sử dụng 2 tập hợp phân vùng được gọi là vị trí, chỉ có một vị trí hoạt động tại một thời điểm. Bản cập nhật hệ thống ghi một tập hợp phân vùng mới vào vị trí không hoạt động và hệ thống sẽ chuyển vị trí hoạt động khi khởi động lại tiếp theo. Để biết thêm thông tin về cách tạo bản cập nhật hệ thống, hãy xem bài viết Bản cập nhật hệ thống A/B.
Bản cập nhật gói dịch vụ
Trong AAOS SDV, các gói dịch vụ sẽ đóng gói các dịch vụ cùng nhau trong APEX. Các bản cập nhật gói dịch vụ sẽ dàn dựng các tệp APEX mới trong các phiên tạm thời. Hệ thống sẽ kích hoạt các gói đã cập nhật này sau khi khởi động lại hệ thống. Để biết thêm thông tin về cách tạo APEX gói dịch vụ, hãy xem bài viết Bản cập nhật gói dịch vụ.
Máy trạng thái
Các yêu cầu từ ứng dụng khách và sự kiện từ các dịch vụ hệ thống sẽ điều khiển máy trạng thái Trình quản lý bản cập nhật. Trình quản lý bản cập nhật được thiết kế để có khả năng phục hồi, khôi phục trạng thái và tiếp tục quá trình cập nhật ngay cả sau khi khởi động lại hoặc gặp sự cố không mong muốn.
Hình 2. Máy trạng thái Trình quản lý bản cập nhật.
API
Trình quản lý bản cập nhật cung cấp một API điều khiển quá trình cập nhật thông qua máy trạng thái. API này sử dụng VSIDL, hỗ trợ các ứng dụng khách nằm trong mọi VM hỗ trợ SDV Comms và cung cấp thông báo lỗi yêu cầu.
Bảo mật và quyền truy cập
Hệ thống hạn chế quyền truy cập vào API bằng các chính sách uỷ quyền. Chỉ ứng dụng khách được uỷ quyền mới có thể gọi Trình quản lý bản cập nhật.
Tin cập nhật trạng thái
Vì các thao tác cập nhật có thể mất nhiều thời gian, nên Trình quản lý bản cập nhật cung cấp tin cập nhật trạng thái không đồng bộ. Ứng dụng khách phải theo dõi trạng thái bằng cách đăng ký nhận tin cập nhật trạng thái.
Quản lý đăng ký
Đăng ký: Ứng dụng khách đăng ký nhận tin cập nhật trạng thái bằng cách gọi phương thức
SubscribeToStatusUpdates():rpc SubscribeToStatusUpdates(SubscribeToStatusUpdatesRequest) returns (SubscribeToStatusUpdatesResponse) {} message SubscribeToStatusUpdatesRequest {} message SubscribeToStatusUpdatesResponse {}Trước khi gọi
SubscribeToStatusUpdates(), ứng dụng khách phải khởi động một giao diện RPC triển khaiUpdateManagerListenerService.Huỷ đăng ký: Ứng dụng khách có thể ngừng nhận tin cập nhật trạng thái bằng cách gọi
UnsubscribeFromStatusUpdates():rpc UnsubscribeFromStatusUpdates(UnsubscribeFromStatusUpdatesRequest) returns (UnsubscribeFromStatusUpdatesResponse) {} message UnsubscribeFromStatusUpdatesRequest {} message UnsubscribeFromStatusUpdatesResponse {}
UpdateManagerListenerService
Các ứng dụng khách gọi SubscribeToStatusUpdates() trên UpdateManagerService phải triển khai dịch vụ sau để nhận tin cập nhật trạng thái:
service UpdateManagerListenerService {
/* Called when there is a status update from the Update Manager. */
rpc OnStatusUpdate(OnStatusUpdateRequest) returns (OnStatusUpdateResponse) {}
}
message OnStatusUpdateRequest {
oneof status_update {
UpdateManagerStatus update_manager_status = 1;
UpdateProgress update_progress = 2;
}
}
message OnStatusUpdateResponse {}
OnStatusUpdateRequest gửi một trong 2 thông báo có thể có bằng cách sử dụng trường status_update:
UpdateManagerStatus: Được gửi khi trạng thái của Trình quản lý bản cập nhật thay đổi.UpdateProgress: Được gửi để cho biết tiến trình cập nhật trong các trạng tháiPREPAREvàACTIVATE_PRE_REBOOTvì quá trình này có thể mất một khoảng thời gian đáng kể.
Thông báo trạng thái và lỗi
Thông báo trạng thái bao gồm thông tin chi tiết về trạng thái và mọi lỗi:
UpdateManagerStatus: Báo cáo giai đoạn hiện tại của bản cập nhật và mọi lý do gây ra lỗi:message UpdateManagerStatus { /* The current state of the update */ UpdateState update_state = 1; /* The reason for the failure, if the update failed */ FailureReason failure_reason = 2; } enum UpdateState { /* The Update Manager is ready to accept a new update. */ READY = 0; /* An update is being prepared. */ PREPARE = 1; /* The update failed during the prepare step. Roll back the update to start a * new update. */ PREPARE_FAILURE = 2; /* The update was prepared successfully. */ PREPARE_COMPLETE = 3; /* A rollback has started from the prepare step. When complete, transitions * to READY. */ PREPARE_ROLLBACK = 4; /* The prepared update is being activated. */ ACTIVATE_PRE_REBOOT = 5; /* The update failed during the activate step before the reboot. Roll back the * update to start a new update. */ ACTIVATE_PRE_REBOOT_FAILURE = 6; /* The update was activated successfully. Reboot to complete activation. */ ACTIVATE_PRE_REBOOT_COMPLETE = 7; /* A rollback has started from the activate pre-reboot step. When complete, * transitions to READY. */ ACTIVATE_PRE_REBOOT_ROLLBACK = 8; /* An update was successfully activated after the reboot. The update needs to * be committed or rolled back to be completed. */ ACTIVATE_POST_REBOOT_COMPLETE = 9; /* A rollback has started from the activate post-reboot step. */ ACTIVATE_POST_REBOOT_ROLLBACK = 10; /* The rollback was completed successfully. Reboot to complete the * rollback. */ ACTIVATE_POST_REBOOT_ROLLBACK_COMPLETE = 11; /* The update is being committed. When complete, transitions to READY */ COMMIT = 12; /* The prepare request is being cancelled */ PREPARE_CANCEL = 13; /* The system update has started suspending */ PREPARE_SUSPEND = 14; /* The system update has finished suspending */ PREPARE_SUSPEND_COMPLETE = 15; } message FailureReason { /* The original error that triggered the failure */ ErrorCode error_code = 1; /* Binder error message for most ErrorCodes. */ string error_message = 2; } enum ErrorCode { Unspecified = 0; /* Error from UpdateEngine service */ UpdateEngineError = 1; // Error from the ApexService ApexServiceError = 2; // Error from the BootControlService BootControlServiceError = 3; // Error from the VoldService VoldServiceError = 4; }UpdateProgress: Báo cáo trạng thái hiện tại từ Công cụ cập nhật trong quá trình cập nhật hệ thống:message UpdateProgress { /* Matches the enum UpdateStatus from the UpdateEngine service. */ int32 status_code = 1; /* A value ranging from 0.0 to 1.0, 1.0 representing the process is complete. */ float percentage = 2; }
Nhận trạng thái ngay lập tức
Bạn có thể truy xuất trạng thái và tải trọng hiện tại bất cứ lúc nào bằng cách gọi GetStatus(). Các thông báo SystemUpdatePayload và ServiceBundleUpdatePayload
được mô tả trong phần Chuẩn bị.
rpc GetStatus(GetStatusRequest) returns (GetStatusResponse) {}
message GetStatusRequest {}
message GetStatusResponse {
/* The status of the Update Manager */
UpdateManagerStatus update_manager_status = 1;
/* The current update payload, if one has been set through the Prepare() request */
oneof payload {
SystemUpdatePayload system_update_payload = 2;
ServiceBundleUpdatePayload service_bundle_update_payload = 3;
}
}
Chuẩn bị
Yêu cầu Prepare bắt đầu quá trình cập nhật bằng cách dàn dựng tải trọng, nhưng hệ thống sẽ chờ kích hoạt bản cập nhật:
rpc Prepare(PrepareRequest) returns (PrepareResponse) {}
message PrepareRequest {
oneof payload {
SystemUpdatePayload system_update_payload = 1;
ServiceBundleUpdatePayload service_bundle_update_payload = 2;
}
}
message PrepareResponse {}
Nếu yêu cầu hợp lệ, trạng thái sẽ chuyển sang PREPARE và Trình quản lý bản cập nhật sẽ bắt đầu cập nhật.
Loại tải trọng sẽ xác định loại bản cập nhật.
Tải trọng bản cập nhật hệ thống
Bản cập nhật hệ thống sử dụng dữ liệu SystemUpdatePayload, yêu cầu đường dẫn đến hình ảnh cập nhật qua mạng (OTA). Các tham số khác được phân tích cú pháp từ hình ảnh, nhưng bạn có thể chỉ định các tham số này để ghi đè các giá trị đã phân tích cú pháp.
message SystemUpdatePayload {
/* Absolute path to the update image (e.g., /updates/ota_update.zip) */
string payload = 1;
/* Offset (in bytes) into the payload where the payload binary starts. */
optional int64 payload_offset = 2;
/* The amount of data (in bytes) to read from "payload" as the update payload. */
optional int64 payload_size = 3;
/* The header key value pairs to apply with the payload. */
map<string, string> header_key_value_pairs = 4;
}
Trình quản lý bản cập nhật xử lý hình ảnh OTA (do ứng dụng khách cung cấp trong thư mục /data/ota_package) để chạy các bước sau khi cài đặt, nhưng không chuyển đổi vị trí khởi động đang hoạt động. Sau đó, trạng thái sẽ chuyển sang trạng thái PREPARE_COMPLETE nếu thành công hoặc trạng thái PREPARE_FAILURE nếu không thành công.
Tạm ngưng bản cập nhật hệ thống
Bạn chỉ có thể tạm dừng quá trình cập nhật đối với các bản cập nhật hệ thống. Yêu cầu này chỉ hợp lệ khi ở trạng thái PREPARE.
Suspend (Tạm ngưng): Tạm dừng bản cập nhật, chuyển trạng thái qua
PREPARE_SUSPEND.rpc Suspend(SuspendRequest) returns (SuspendResponse) {} message SuspendRequest {} message SuspendResponse {}Nếu thành công, trạng thái sẽ chuyển sang
PREPARE_SUSPEND_COMPLETE. Nếu không thành công, trạng thái sẽ chuyển sangPREPARE_FAILURE.Resume (Tiếp tục): Tiếp tục bản cập nhật đã tạm dừng. Yêu cầu này chỉ hợp lệ ở trạng thái
PREPARE_SUSPEND_COMPLETE.rpc Resume(ResumeRequest) returns (ResumeResponse) {} message ResumeRequest {} message ResumeResponse {}Trạng thái sẽ chuyển về trạng thái
PREPARE.
Tải trọng bản cập nhật gói dịch vụ
Bản cập nhật gói dịch vụ sử dụng ServiceBundleUpdatePayload, chứa các đường dẫn đến tệp APEX và đặt giới hạn số lần kích hoạt.
message ServiceBundleUpdatePayload {
/* Absolute path to an .apex file. Multiple .apex files can be included. */
repeated string apex_path = 1;
/* Number of boots to attempt activation before aborting. Must be > 0. */
int32 boot_attempts = 2;
}
Trình quản lý bản cập nhật xác minh rằng các tệp APEX được ký đúng cách và dàn dựng các tệp này trong một phiên. Nếu thành công, trạng thái sẽ chuyển sang PREPARE_COMPLETE. Nếu không thành công, trạng thái sẽ chuyển sang PREPARE_FAILURE.
Kích hoạt
Yêu cầu Activate sẽ kích hoạt bản cập nhật đã chuẩn bị khi khởi động lại tiếp theo.
rpc Activate(ActivateRequest) returns (ActivateResponse) {}
message ActivateRequest {}
message ActivateResponse {}
Trước khi khởi động lại
Trình quản lý bản cập nhật chuyển sang trạng thái ACTIVATE_PRE_REBOOT trong khi kích hoạt bản cập nhật. Trình quản lý bản cập nhật cũng tạo một điểm kiểm tra
dữ liệu người dùng có hiệu lực khi hệ thống khởi động lại.
Các thao tác kích hoạt sẽ khác nhau tuỳ thuộc vào loại bản cập nhật:
- Bản cập nhật hệ thống: Hệ thống chạy các bước sau khi cài đặt và đặt vị trí khởi động để chuyển đổi khi khởi động lại tiếp theo.
- Bản cập nhật gói dịch vụ: Hệ thống đánh dấu phiên APEX đã dàn dựng là sẵn sàng kích hoạt.
Nếu hệ thống kích hoạt bản cập nhật thành công, trạng thái sẽ chuyển sang ACTIVATE_PRE_REBOOT_COMPLETE, cho biết rằng VM đã sẵn sàng khởi động lại.
Nếu không, trạng thái sẽ chuyển sang ACTIVATE_PRE_REBOOT_FAILURE.
Sau khi khởi động lại
Sau khi khởi động lại, hệ thống sẽ bắt đầu ở chế độ điểm kiểm tra. Ở chế độ này, hệ thống không xác nhận bất kỳ thay đổi nào đối với phân vùng dữ liệu người dùng vào bộ nhớ vĩnh viễn. Nếu hệ thống không xác nhận bản cập nhật thành công, hệ thống sẽ hoàn nguyên các thay đổi này về trạng thái ban đầu.
Giới hạn khởi động
Hệ thống sẽ hoàn nguyên các thay đổi đối với phân vùng dữ liệu người dùng trong một trong các điều kiện sau:
- Ứng dụng khách gửi yêu cầu
Rollback()rõ ràng và khởi động lại hệ thống. - Hệ thống khởi động quá nhiều lần mà không có ứng dụng khách gọi
Commit()hoặcRollback(). Giới hạn khởi động khác nhau đối với từng loại bản cập nhật:- Bản cập nhật hệ thống: Việc triển khai
BootControlsẽ đặt giới hạn này. Ví dụ: giới hạn mặc định trong quá trình triển khai mà thiết bị Cuttlefish sử dụng là 7 lần khởi động. - Bản cập nhật gói dịch vụ: Trường
boot_attemptscủaServiceBundleUpdatePayloaddo ứng dụng khách cung cấp sẽ đặt giới hạn này khi yêu cầuPrepare()được thực hiện.
- Bản cập nhật hệ thống: Việc triển khai
Xác minh
Sau đó, hệ thống sẽ xác minh bản cập nhật:
- Bản cập nhật hệ thống: dm-verity kiểm tra vị trí đã cập nhật để phát hiện lỗi.
- Bản cập nhật gói dịch vụ:
apexdkiểm tra chữ ký của từng APEX và gắn hình ảnh của APEX vào hệ thống tệp.
Nếu xác minh thành công, trạng thái sẽ chuyển sang ACTIVATE_POST_REBOOT_COMPLETE. Trình quản lý bản cập nhật sẽ chờ Commit() hoặc Rollback().
Nếu xác minh không thành công, hệ thống sẽ khởi động lại. Khi hệ thống đạt đến giới hạn khởi động, hệ thống sẽ hoàn nguyên về trạng thái ban đầu:
- Bản cập nhật hệ thống: Hệ thống sẽ hoàn nguyên về vị trí ban đầu.
- Bản cập nhật gói dịch vụ: Các APEX đã cập nhật sẽ bị loại bỏ và các APEX ban đầu sẽ được kích hoạt lại.
Nếu xác minh không thành công đối với bất kỳ loại bản cập nhật nào, trạng thái sẽ chuyển sang ACTIVATE_PRE_REBOOT_FAILURE sau khi trạng thái ban đầu được khôi phục.
Khôi phục
Yêu cầu Rollback bắt đầu trả hệ thống về trạng thái trước khi cập nhật.
rpc Rollback(RollbackRequest) returns (RollbackResponse) {}
message RollbackRequest {}
message RollbackResponse {}
Bạn có thể đưa ra yêu cầu Rollback() trong nhiều trạng thái. Tuỳ thuộc vào trạng thái ban đầu, hệ thống sẽ thực hiện các thao tác khác nhau và các trạng thái khác nhau sẽ xuất hiện:
| Trạng thái khi khôi phục | Chuyển đổi trạng thái | Thao tác trên hệ thống |
|---|---|---|
(Chỉ bản cập nhật hệ thống) PREPARE, PREPARE_SUSPEND_COMPLETE |
→ PREPARE_CANCEL → PREPARE_ROLLBACK →
READY |
Bản cập nhật hệ thống: Huỷ bản cập nhật hệ thống. |
PREPARE_FAILURE, PREPARE_COMPLETE |
→ PREPARE_ROLLBACK → READY |
Bản cập nhật hệ thống: Huỷ bản cập nhật hệ thống. Bản cập nhật gói dịch vụ: Huỷ phiên APEX đã dàn dựng. |
ACTIVATE_PRE_REBOOT_COMPLETE, ACTIVATE_PRE_REBOOT_FAILURE |
→ ACTIVATE_PRE_REBOOT_ROLLBACK → READY |
Tắt điểm kiểm tra dữ liệu người dùng. Bản cập nhật hệ thống: Huỷ chuyển đổi vị trí khởi động. Bản cập nhật gói dịch vụ: Xoá APEX đã dàn dựng. |
ACTIVATE_POST_REBOOT_COMPLETE |
→
ACTIVATE_POST_REBOOT_ROLLBACK → ACTIVATE_POST_REBOOT_ROLLBACK_COMPLETE |
Tắt điểm kiểm tra dữ liệu người dùng. Bản cập nhật hệ thống: Chuyển đổi vị trí khởi động trở lại. Bản cập nhật gói dịch vụ: Hoàn nguyên các phiên APEX đang hoạt động. Bạn cần khởi động lại lần cuối để quá trình khôi phục có hiệu lực, sau đó trạng thái sẽ chuyển sang READY.
|
Xác nhận
Yêu cầu này cho biết rằng bản cập nhật đã hoàn tất thành công và áp dụng vĩnh viễn mọi thay đổi.
rpc Commit(CommitRequest) returns (CommitResponse) {}
message CommitRequest {}
message CommitResponse {}
Trạng thái sẽ chuyển sang COMMIT trong khi thực hiện các thao tác xác nhận:
- Bản cập nhật hệ thống: Trình quản lý bản cập nhật đánh dấu quá trình khởi động là thành công, ngăn quá trình khôi phục trong tương lai và chọn vị trí này khi khởi động tiếp theo.
- Bản cập nhật gói dịch vụ: Trình quản lý bản cập nhật đánh dấu phiên APEX đã dàn dựng là thành công, đóng phiên cập nhật và kích hoạt vĩnh viễn các gói.
Sau khi hệ thống xác nhận bản cập nhật, Trình quản lý bản cập nhật sẽ xác nhận điểm kiểm tra dữ liệu người dùng. Hệ thống sẽ xác nhận tất cả dữ liệu người dùng mới được ghi trong quá trình khởi động này vào bộ nhớ vĩnh viễn. Trình quản lý bản cập nhật sẽ chuyển về READY, cho biết rằng bản cập nhật đã hoàn tất.
Gỡ cài đặt APEX
Yêu cầu UninstallApex sẽ xoá phiên bản /data của các gói dịch vụ. Bạn có thể gọi UninstallApex trong bất kỳ trạng thái nào, nhưng VM phải khởi động lại để quá trình gỡ cài đặt có hiệu lực. Do đó, hãy tránh gọi UninstallApex khi quá trình cập nhật đang diễn ra. UninstallApex không xoá các APEX được cài đặt sẵn, xoá dữ liệu APEX hoặc xoá các phiên bản APEX không hoạt động.
rpc UninstallApex(UninstallApexRequest) returns (UninstallApexResponse) {}
message UninstallApexRequest {
message ApexInfo {
string module_name = 1;
int64 version_code = 2;
}
repeated ApexInfo apexes = 1;
}
message UninstallApexResponse {}