Để hỗ trợ tính năng quản lý nguồn điện dành riêng cho xe, Android cung cấp dịch vụ CarPowerManagementService và giao diện CarPowerManager.
Các chuyển đổi trạng thái được kích hoạt bởi Bộ điều khiển chính của xe (VMCU). Để giao tiếp với VMCU, các đơn vị tích hợp phải triển khai một số thành phần. Các đơn vị tích hợp chịu trách nhiệm tích hợp với Lớp trừu tượng phần cứng (VHAL) của Xe và việc triển khai kernel. Các đơn vị tích hợp cũng chịu trách nhiệm tắt các nguồn đánh thức và đảm bảo rằng quá trình tắt không bị hoãn vô thời hạn.
Thuật ngữ
Các thuật ngữ này được dùng xuyên suốt tài liệu này:
Thiết kế hệ thống
Phần này mô tả cách AAOS biểu thị trạng thái nguồn của bộ xử lý ứng dụng và những mô-đun triển khai hệ thống quản lý nguồn. Tài liệu này cũng mô tả cách các mô-đun này hoạt động cùng nhau và cách các trạng thái thường chuyển đổi.
Trạng thái nguồn của ô tô
AAOS sử dụng một máy trạng thái để biểu thị trạng thái nguồn của AP. Máy trạng thái cung cấp các trạng thái minh hoạ bên dưới:

Hình 1. Trạng thái nguồn của ô tô.
Những chuyển cảnh phổ biến nhất được đánh dấu bằng màu xanh dương. Sau đây là các trạng thái và quá trình chuyển đổi thường gặp:
- Tạm ngưng để truy cập RAM. Xe và SoC đang tắt. Không có mã nào đang được thực thi. Nguồn điện được duy trì cho RAM SoC.
- Chờ VHAL. Khi người lái xe tương tác với xe, chẳng hạn như mở cửa, VMCU sẽ cấp nguồn cho SoC. AAOS sẽ tiếp tục từ trạng thái Tạm ngưng để truy cập RAM và chuyển sang trạng thái Chờ VHAL, nơi hệ thống chờ phối hợp với VHAL.
- Đang bật. VHAL yêu cầu AAOS chuyển sang trạng thái Bật. Ở trạng thái này, AAOS đang chạy hoàn toàn và tương tác với người lái xe.
- Chuẩn bị trước khi ngừng hoạt động. Khi lái xe xong, VHAL sẽ yêu cầu AAOS chuyển sang giai đoạn Chuẩn bị tắt bằng cách gửi
SHUTDOWN_PREPARE. Ở trạng thái này, các trình nghe thay đổi trạng thái nguồn sẽ nhận đượcSTATE_PRE_SHUTDOWN_PREPARE. Đây là cảnh báo sớm cho biết quá trình tắt đang bắt đầu. - Chuẩn bị tắt nguồn. Khi tất cả các trình nghe hoàn tất hoặc đạt đến thời gian chờ Chuẩn bị tắt trước, hệ thống Android sẽ chuyển sang giai đoạn Chuẩn bị tắt cốt lõi, thông báo cho các trình nghe bằng
STATE_SHUTDOWN_PREPARE. Màn hình và âm thanh đều tắt và AAOS không tương tác với người lái xe. Hệ thống Android vẫn đang chạy và có thể thực hiện các thao tác dọn dẹp và cập nhật, chẳng hạn như thực thi Chế độ nhà để xe. - Chờ VHAL hoàn tất. Tại thời điểm này, AAOS sẽ thông báo cho VHAL rằng hệ thống đã sẵn sàng tắt. Dự kiến VMCU sẽ đặt SoC ở chế độ Ngủ sâu và loại bỏ nguồn điện khỏi bộ xử lý ứng dụng. Sau đó, AAOS sẽ ở trạng thái Suspend-to-RAM (Tạm ngưng để truy cập RAM), mặc dù không có mã nào đang được thực thi.
Mô-đun quản lý nguồn
Hệ thống quản lý nguồn điện bao gồm các mô-đun sau:
| Tên mô-đun | Mô tả |
|---|---|
| CarPowerManager | API Java hoặc C++. |
| CarPowerManagementService | Điều phối các quá trình chuyển đổi trạng thái nguồn và uỷ quyền quản lý chính sách sử dụng điện cho CarPowerPolicyDaemon. |
| CarPowerPolicyDaemon | Quản lý các chính sách về nguồn điện và giao tiếp với các ứng dụng chính sách về nguồn điện gốc. |
| HAL của phương tiện | Giao diện với VMCU. |
| Kernel | Triển khai tạm ngưng vào RAM hoặc ổ đĩa. |
Tính năng ngủ sâu/ngủ đông (tạm ngưng Android vào RAM/ổ đĩa) được triển khai trong nhân.
Tính năng này được cung cấp cho không gian người dùng dưới dạng một tệp đặc biệt nằm tại /sys/power/state. AAOS sẽ tạm ngưng bằng cách ghi mem hoặc disk vào tệp này.
CPMS điều phối trạng thái nguồn với các dịch vụ và HAL khác. CPMS triển khai máy trạng thái được mô tả ở trên và gửi thông báo đến mọi đối tượng theo dõi khi quá trình chuyển đổi trạng thái nguồn xảy ra. Dịch vụ này cũng sử dụng VHAL để gửi thông báo đến phần cứng.
CPPD là nguồn thông tin đáng tin cậy cho các chính sách nguồn điện. Dịch vụ này quản lý các chính sách về nguồn điện trong suốt vòng đời của thiết bị và thông báo cho CPMS, VHAL cũng như các trình nghe gốc khác về những thay đổi đối với chính sách về nguồn điện. CPMS uỷ quyền cho CPPD xử lý các yêu cầu thay đổi chính sách về nguồn điện.
CPMS giao tiếp với VMCU bằng cách đọc và ghi các thuộc tính VHAL liên quan đến trạng thái nguồn, chẳng hạn như AP_POWER_STATE_REQ và AP_POWER_STATE_REPORT. Các ứng dụng có thể dùng giao diện được xác định trong CPM để theo dõi những thay đổi về trạng thái nguồn. Giao diện này cũng cho phép các ứng dụng đăng ký trình nghe chính sách sử dụng điện. API Java này được chú thích bằng @SystemApi và @hide, do đó chỉ các ứng dụng đặc quyền mới có thể sử dụng. Mối quan hệ giữa các mô-đun, ứng dụng và dịch vụ này được minh hoạ dưới đây:

Hình 2. Sơ đồ tham khảo về các thành phần nguồn.
Chuỗi tin nhắn
Phần trước mô tả các mô-đun tạo nên hệ thống quản lý nguồn. Phần này sử dụng các ví dụ enter deep sleep (chuyển sang chế độ ngủ sâu) và exit deep sleep (thoát chế độ ngủ sâu) để giải thích cách các mô-đun và ứng dụng giao tiếp:
Chuyển sang chế độ ngủ sâu
Chỉ VMCU mới có thể bắt đầu chế độ ngủ sâu. Sau khi chế độ ngủ sâu được bắt đầu, VMCU sẽ gửi một thông báo đến CPMS thông qua VHAL. CPMS thay đổi trạng thái thành SHUTDOWN PREPARE và phát trạng thái chuyển đổi này đến tất cả các đối tượng theo dõi (các ứng dụng và dịch vụ giám sát CPMS) bằng cách gọi phương thức onStateChanged() với một mã trạng thái mới do CPM cung cấp.
CPM đóng vai trò trung gian giữa các ứng dụng/dịch vụ và CPMS. Phương thức onStateChanged() cho các ứng dụng/dịch vụ được gọi đồng bộ trong phương thức onStateChanged() của CPM. Hầu hết các ứng dụng và dịch vụ đều phải hoàn tất quá trình chuẩn bị trước khi trả về từ lệnh gọi này. Các dịch vụ đặc quyền được phép tiếp tục chuẩn bị không đồng bộ sau khi trả về PRE_SHUTDOWN_PREPARE, SUSPEND_ENTER, POST_SUSPEND_ENTER. Trong trường hợp này, dịch vụ đặc quyền phải gọi complete() trên đối tượng CompletablePowerStateChangeFuture được cung cấp khi hoàn tất quá trình chuẩn bị. Xin lưu ý rằng bạn không được phép chuẩn bị không đồng bộ cho SHUTDOWN_PREPARE. Trước khi DEEP_SLEEP_ENTRY được gửi đến VHAL, CPMS sẽ định kỳ gửi các yêu cầu hoãn tắt đến VHAL.
Khi tất cả các đối tượng CPM đã hoàn tất quá trình chuẩn bị tắt, CPMS sẽ gửi AP_POWER_STATE_REPORT đến VHAL, sau đó VHAL sẽ thông báo cho VMCU rằng AP đã sẵn sàng tạm ngưng. CPMS cũng gọi phương thức tạm ngưng của nó, phương thức này sẽ tạm ngưng nhân.
Trình tự được mô tả ở trên được minh hoạ dưới đây:

Hình 3. Chuyển sang giai đoạn ngủ sâu.
Giao diện lập trình do CPM cung cấp
Phần này mô tả API Java do CPM cung cấp cho các ứng dụng và dịch vụ hệ thống. API này cho phép phần mềm hệ thống:
- Theo dõi các thay đổi về trạng thái nguồn trong AP.
- Áp dụng các chính sách nguồn điện.
Hãy làm theo các bước sau để gọi các API do CPM cung cấp:
- Để có được phiên bản CPM, hãy gọi Car API.
- Gọi phương thức thích hợp trên đối tượng được tạo ở Bước 1.
Tạo đối tượng CarPowerManager
Để tạo một đối tượng CPM, hãy gọi phương thức getCarManager() của đối tượng Car. Đây là một phương thức được dùng làm thành phần tượng trưng để tạo các đối tượng CPM. Chỉ định android.car.Car.POWER_SERVICE làm đối số để tạo đối tượng CPM.
Car car = Car.createCar(this); CarPowerManager powerManager = (CarPowerManager) car.getCarManager(android.car.Car.POWER_SERVICE);
CarPowerStateListener và đăng ký
Các ứng dụng và dịch vụ hệ thống có thể nhận thông báo thay đổi trạng thái nguồn bằng cách triển khai CarPowerManager.CarPowerStateListener. Giao diện này xác định một phương thức onStateChanged(). Đây là một hàm gọi lại được gọi khi trạng thái nguồn của CPMS thay đổi. Ví dụ sau đây xác định một lớp ẩn danh mới triển khai giao diện:
private final CarPowerManager.CarPowerStateListener powerListener = new CarPowerManager.CarPowerStateListener () { @Override public void onStateChanged(int state) { Log.i(TAG, "onStateChanged() state = " + state); } };
Để hướng dẫn đối tượng trình nghe này theo dõi quá trình chuyển đổi trạng thái nguồn, hãy tạo một luồng thực thi mới và đăng ký trình nghe cũng như luồng này vào đối tượng CPM:
executor = new ThreadPerTaskExecutor(); powerManager.setListener(powerListener, executor);
Khi trạng thái nguồn thay đổi, phương thức onStateChanged() của đối tượng trình nghe sẽ được gọi bằng một giá trị để biểu thị trạng thái nguồn mới. Mối liên kết giữa giá trị thực tế và trạng thái nguồn được xác định trong CarPowerManager và xuất hiện trong bảng sau:
| Tên | Mô tả |
|---|---|
| STATE_ON | Nhập trạng thái bật. Hệ thống đang hoạt động bình thường. |
| STATE_SHUTDOWN_CANCELLED | Thao tác tắt máy bị huỷ và trạng thái nguồn trở về trạng thái bình thường. |
| STATE_SHUTDOWN_ENTER | các ứng dụng dự kiến sẽ dọn dẹp và sẵn sàng tắt. |
| STATE_POST_SHUTDOWN_ENTER | Quá trình chuẩn bị tắt đã hoàn tất và VMCU đã sẵn sàng tắt. Chuyển sang trạng thái tắt. |
| STATE_PRE_SHUTDOWN_PREPARE | Đã yêu cầu quy trình tắt nhưng CPMS chưa bắt đầu quy trình. Màn hình và âm thanh vẫn bật |
| STATE_SHUTDOWN_PREPARE | Chế độ Garage có thể chạy trong khoảng thời gian này. |
| STATE_SUSPEND_ENTER | các ứng dụng dự kiến sẽ dọn dẹp và sẵn sàng cho chế độ tạm ngưng vào RAM. |
| STATE_POST_SUSPEND_ENTER | Quá trình chuẩn bị cho chế độ tạm ngưng vào RAM đã hoàn tất và VMCU đã sẵn sàng cho chế độ tạm ngưng vào RAM. Chuyển sang trạng thái tạm ngưng. |
| STATE_SUSPEND_EXIT | Đánh thức từ trạng thái tạm ngưng hoặc tiếp tục từ trạng thái tạm ngưng đã bị huỷ. |
| STATE_HIBERNATION_ENTER | các ứng dụng dự kiến sẽ dọn dẹp và sẵn sàng chuyển sang trạng thái ngủ đông. |
| STATE_POST_HIBERNATION_ENTER | Quá trình chuẩn bị cho chế độ ngủ đông đã hoàn tất và VMCU đã sẵn sàng chuyển sang chế độ ngủ đông. |
| STATE_HIBERNATION_EXIT | Thoát khỏi trạng thái ngủ đông hoặc tiếp tục sau khi huỷ trạng thái ngủ đông. |
| STATE_WAIT_FOR_VHAL | Hệ thống đang khởi động nhưng chờ thiết lập giao tiếp với VHAL trước khi chuyển sang trạng thái BẬT. |
Huỷ đăng ký CarPowerStateListener
Để huỷ đăng ký tất cả các đối tượng trình nghe đã đăng ký với CPM, hãy gọi phương thức clearListener:
powerManager.clearListener();
Tích hợp hệ thống trên bản triển khai Android
Đơn vị tích hợp chịu trách nhiệm về những việc sau:
- Triển khai giao diện nhân để tạm ngưng Android.
- Triển khai các hàm VHAL để:
- Truyền tín hiệu bắt đầu tạm ngưng hoặc tắt từ ô tô đến Android.
- Gửi thông báo sẵn sàng tắt từ Android đến ô tô.
- Bắt đầu tắt hoặc tạm ngưng Android thông qua giao diện hạt nhân Linux.
- Đảm bảo rằng tất cả các nguồn đánh thức đều bị vô hiệu hoá khi thiết bị ở trạng thái tạm ngưng.
- Đảm bảo rằng các ứng dụng tắt đủ nhanh để không trì hoãn quá trình tắt vô thời hạn.
- Đảm bảo rằng BSP bật (hoặc tắt) các thành phần của thiết bị theo chính sách nguồn để không chặn chế độ tạm ngưng hoặc ngủ đông
Giao diện nhân: /sys/power/state
AAOS đặt thiết bị ở chế độ tạm ngưng khi một ứng dụng hoặc dịch vụ ghi mem để tạm ngưng vào RAM hoặc disk để tạm ngưng vào ổ đĩa vào một tệp nằm tại /sys/power/state. Đơn vị tích hợp phải cung cấp một hàm giám sát tệp này và đưa Linux vào trạng thái nguồn tạm ngưng. Hàm này có thể gửi một GPIO đến VMCU để thông báo cho VMCU rằng thiết bị đã tắt hoàn toàn. Đơn vị tích hợp cũng chịu trách nhiệm loại bỏ mọi tình trạng xung đột giữa VHAL gửi thông báo cuối cùng đến VMCU và hệ thống chuyển sang chế độ tạm ngưng hoặc tắt.
Trách nhiệm của VHAL
VHAL cung cấp một giao diện giữa mạng lưới xe và Android. VHAL:
- Truyền tín hiệu bắt đầu tạm ngưng hoặc tắt từ ô tô đến Android.
- Gửi thông báo đã sẵn sàng tắt từ Android đến xe.
- Khởi động quá trình tắt hoặc tạm ngưng Android thông qua giao diện hạt nhân Linux.
Khi CPMS thông báo cho VHAL rằng hệ thống đã sẵn sàng tắt, VHAL sẽ gửi thông báo shutdown ready (sẵn sàng tắt) đến VMCU. Thông thường, các thiết bị ngoại vi trên chip như UART, SPI và USB sẽ truyền thông báo. Sau khi gửi thông báo, CPMS sẽ gọi lệnh của nhân để tạm ngưng hoặc tắt thiết bị. Trước khi làm như vậy, VHAL hoặc BSP có thể chuyển đổi một GPIO để hướng dẫn VMCU rằng việc rút nguồn khỏi thiết bị là an toàn.
VHAL phải hỗ trợ các thuộc tính sau, giúp kiểm soát việc quản lý nguồn qua VHAL:
| Tên | Mô tả |
|---|---|
| AP_POWER_STATE_REPORT | Android báo cáo các trạng thái chuyển đổi cho VMCU bằng thuộc tính này, sử dụng các giá trị enum VehicleApPowerStateReport. |
| AP_POWER_STATE_REQ | VMCU sử dụng thuộc tính này để hướng dẫn Android chuyển sang các trạng thái nguồn khác nhau, bằng cách sử dụng các giá trị enum VehicleApPowerStateReq. |
AP_POWER_STATE_REPORT
Sử dụng thuộc tính này để báo cáo trạng thái quản lý nguồn hiện tại của Android. Thuộc tính này chứa hai số nguyên:
int32Values[0]: Enum VehicleApPowerStateReport của trạng thái hiện tại.int32Values[1]: Thời gian tính bằng mili giây để hoãn, chuyển sang chế độ ngủ hoặc tắt. Ý nghĩa của giá trị này phụ thuộc vào giá trị đầu tiên.
Giá trị đầu tiên có thể nhận một trong các giá trị sau. VehicleApPowerStateReport.aidl chứa nội dung mô tả cụ thể hơn, được lưu trữ trong hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle.
| Tên giá trị | Mô tả | Giá trị thứ hai |
|---|---|---|
| WAIT_FOR_VHAL | AP đang khởi động và cần thiết lập giao tiếp với VHAL. | |
| DEEP_SLEEP_ENTRY | AP đang chuyển sang trạng thái ngủ sâu. VMCU sẽ bật lại AP sau khoảng thời gian được chỉ định trong giá trị thứ hai. | Bạn phải thiết lập |
| DEEP_SLEEP_EXIT | AP đang thoát khỏi trạng thái ngủ sâu. | |
| HIBERNATION_ENTRY | AP đang chuyển sang trạng thái ngủ đông. VMCU sẽ bật lại AP sau khoảng thời gian được chỉ định trong giá trị thứ hai. | Bạn phải thiết lập |
| HIBERNATION_EXIT | AP đang thoát khỏi trạng thái ngủ đông. | |
| SHUTDOWN_POSTPONE | Android chưa sẵn sàng tắt. VMCU sẽ đợi khoảng thời gian được chỉ định trong giá trị thứ hai trước khi tắt AP. Android có thể yêu cầu hoãn thêm bằng cách phát hành các báo cáo SHUTDOWN_POSTPONE bổ sung. | Bạn phải thiết lập |
| SHUTDOWN_PREPARE | Android đang chuẩn bị tắt. | Bạn phải thiết lập |
| SHUTDOWN_START | AP đã sẵn sàng tắt. VMCU sẽ bật lại AP sau khoảng thời gian được chỉ định trong giá trị thứ hai. (VMCU không bắt buộc phải hỗ trợ tính năng bật theo thời gian.) | Bạn phải thiết lập |
| SHUTDOWN_CANCELLED | Android đang ngừng chuẩn bị tắt và sẽ chuyển sang WAIT_FOR_VHAL. | |
| ĐANG BẬT | Android đang chạy bình thường. |
Trạng thái có thể được đặt một cách độc lập hoặc để phản hồi yêu cầu thông qua VMCU.
AP_POWER_STATE_REQ
VMCU gửi thuộc tính này để chuyển Android sang một trạng thái nguồn khác và chứa 2 số nguyên:
int32Values[0]: Giá trị enumVehicleApPowerStateReq, đại diện cho trạng thái mới mà bạn muốn chuyển sang.int32Values[1]: Giá trị enumVehicleApPowerStateShutdownParam. Giá trị này chỉ được gửi cho thông báoSHUTDOWN_PREPAREvà truyền đến Android các lựa chọn mà thông báo đó chứa.
Giá trị số nguyên đầu tiên biểu thị trạng thái mới mà Android sẽ chuyển sang. Ngữ nghĩa được xác định trong VehicleApPowerStateReq.aidl và được cung cấp dưới đây:
| Tên giá trị | Mô tả |
|---|---|
| ĐANG BẬT | AP sẽ bắt đầu hoạt động đầy đủ. |
| SHUTDOWN_PREPARE | AP nên chuẩn bị tắt. Giá trị thứ hai cho biết liệu AP có được phép hoãn tắt nguồn hay không và liệu AP có nên dự kiến tắt nguồn hoặc chuyển sang chế độ ngủ sâu hay không. |
| CANCEL_SHUTDOWN | AP sẽ dừng chuẩn bị tắt và chuẩn bị BẬT. |
| ĐÃ KẾT THÚC | AP sẽ bị tắt hoặc tạm ngưng. |
VehicleApPowerStateShutdownParam được xác định trong VehicleApPowerStateShutdownParam.aidl. Enum này có các phần tử sau:
| Tên giá trị | Mô tả |
|---|---|
| CAN_SLEEP | AP có thể chuyển sang chế độ ngủ sâu thay vì tắt hoàn toàn. Được phép hoãn. |
| CAN_HIBERNATE | AP có thể chuyển sang chế độ ngủ đông thay vì tắt hoàn toàn. Được phép hoãn. |
| SHUTDOWN_ONLY | AP sẽ tắt. Được phép hoãn. Không được ngủ sâu. |
| SLEEP_IMMEDIATELY | AP có thể chuyển sang chế độ ngủ sâu, nhưng phải ngủ hoặc tắt ngay lập tức. Không được phép hoãn. |
| HIBERNATE_IMMEDIATELY | AP có thể chuyển sang chế độ tạm ngưng ghi vào đĩa, nhưng phải chuyển sang chế độ ngủ đông hoặc tắt ngay lập tức. Không được phép hoãn. |
| SHUTDOWN_IMMEDIATELY | AP phải tắt ngay lập tức. Không được phép hoãn. Không được ngủ sâu. |
Nguồn đánh thức
Trình tích hợp phải tắt các nguồn đánh thức thích hợp khi thiết bị ở chế độ tạm ngưng. Các nguồn đánh thức phổ biến bao gồm nhịp tim, modem, Wi-Fi và Bluetooth. Nguồn đánh thức hợp lệ duy nhất phải là một tín hiệu gián đoạn từ VMCU để đánh thức SoC. Điều này giả định rằng VMCU có thể theo dõi modem để biết các sự kiện đánh thức từ xa (chẳng hạn như khởi động động cơ từ xa). Nếu chức năng này được chuyển sang AP, thì bạn phải thêm một nguồn đánh thức khác để phục vụ modem.
Ứng dụng
Các OEM phải cẩn thận khi viết ứng dụng để có thể tắt nhanh chóng và không trì hoãn quá trình này vô thời hạn.
Phụ lục
Các thư mục trong cây mã nguồn
| Nội dung | Thư mục |
|---|---|
| Mã liên quan đến CarPowerManager. | packages/services/Car/car-lib/src/android/car/hardware/power |
| CarPowerManagementService, v.v. | packages/services/Car/service/src/com/android/car/power |
Các dịch vụ liên quan đến VHAL, chẳng hạn như VehicleHal và HAlClient. |
packages/services/Car/service/src/com/android/car/hal |
| Giao diện VHAL và định nghĩa thuộc tính. | hardware/interfaces/automotive/vehicle/aidl/android/hardware/automotive/vehicle/ |
Ứng dụng mẫu để cung cấp một số ý tưởng về CarPowerManager |
packages/services/Car/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink |
Sơ đồ lớp
Sơ đồ lớp này cho thấy các lớp và giao diện Java trong hệ thống quản lý nguồn:

Hình 4. Sơ đồ lớp nguồn.
Mối quan hệ giữa các đối tượng
Hình 5 minh hoạ những đối tượng có tham chiếu đến các đối tượng khác. Cạnh có nghĩa là đối tượng nguồn giữ một tham chiếu đến đối tượng đích. Ví dụ: VehicleHAL có một tham chiếu đến đối tượng PropertyHalService.

Hình 5. Sơ đồ tham chiếu đối tượng.