Để hỗ trợ tính năng quản lý nguồn pin dành riêng cho xe, Android cung cấp dịch vụ CarPowerManagementService
và giao diện CarPowerManager
.
Quá trình 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, trình tích hợp phải triển khai một số thành phần. Trình 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 của xe (VHAL) và triển khai hạt nhân. Trình tích hợp cũng chịu trách nhiệm vô hiệu hoá các nguồn đánh thức và đảm bảo rằng quá trình tắt máy không bị hoãn vô thời hạn.
Thuật ngữ
Các thuật ngữ sau đây được sử dụng trong toàn bộ tài liệu này:
suspend()
và shutdown()
.Thiết kế hệ thống
Phần này mô tả cách AAOS thể hiện trạng thái nguồn của bộ xử lý ứng dụng và mô-đun nào 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 chuyển đổi trạng thái thường xảy ra.
Máy trạng thái nguồn điện của ô tô
AAOS sử dụng 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 được minh hoạ bên dưới:
Hình 1. Máy trạng thái nguồn điện của ô tô.
Các hiệu ứng chuyển đổi 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 phổ biến:
- Tạm ngưng vào 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 tiếp tục từ trạng thái Tạm ngưng-vào-RAM và chuyển sang trạng thái Chờ VHAL, nơi chờ điều phối 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 đầy đủ và tương tác với trình điều khiển.
- Shutdown Prepare (Chuẩn bị tắt máy). Khi người lái xe đã lái xe xong, VHAL sẽ yêu cầu AAOS chuyển sang trạng thái Chuẩn bị tắt. Ở trạng thái này, màn hình và âm thanh sẽ tắt và AAOS không tương tác với trình điều khiển. Hệ thống Android vẫn đang chạy và có thể cập nhật ứng dụng cũng như hệ thống Android. Khi các bản cập nhật (nếu có) hoàn tất, hệ thống Android sẽ chuyển sang trạng thái Chờ VHAL hoàn tất.
- Chờ VHAL hoàn tất. Tại thời điểm này, AAOS sẽ thông báo cho VHAL rằng ứng dụng đã sẵn sàng tắt. VMCU dự kiến 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 Tạm ngưng vào 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 bao gồm các mô-đun sau:
Tên mô-đun | Nội dung 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. |
CarPowerPolicyDaemon | Giao tiếp với ứng dụng chính sách nguồn gốc. |
HAL của xe | Giao diện với VMCU. |
Kernel | Tạm ngưng để triển khai 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 hạt nhân.
Tính năng này được hiển thị trong không gian người dùng dưới dạng một tệp đặc biệt nằm ở /sys/power/state
. AAOS bị 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 trình quan sát khi quá trình chuyển đổi trạng thái nguồn điệ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 quản lý chính sách nguồn điện cho đến khi CPMS kiểm soát. Ứng dụng này cũng gửi thông báo thay đổi chính sách nguồn điện đến trình nghe gốc.
Một số thuộc tính được xác định trong VHAL. Để giao tiếp với VMCU, CPMS sẽ đọc và ghi các thuộc tính này. Ứng dụng có thể sử dụng giao diện được xác định trong CPM để theo dõi các thay đổi về trạng thái nguồn. Giao diện này cũng cho phép ứng dụng đăng ký trình nghe chính sách pin. Bạn có thể gọi API này từ Java và được chú thích bằng API @hide / @System, nghĩa là API này chỉ dành cho các ứng dụng đặc quyền. 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ề thành phần nguồn.
Trình tự tin nhắn
Phần trước đã mô tả các mô-đun bao gồm hệ thống quản lý nguồn. Phần này sử dụng các ví dụ về vào trạng thái ngủ sâu và thoát trạng thái ngủ sâu để giải thích cách các mô-đun và ứng dụng giao tiếp:
Chuyển sang trạng thái 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 thông báo đến CPMS thông qua VHAL. CPMS thay đổi trạng thái thành SHUTDOWN PREPARE và truyền tin về quá trình chuyển đổi trạng thái này cho tất cả trình quan sát (các ứng dụng và dịch vụ theo dõi CPMS) bằng cách gọi phương thức onStateChanged()
với mã trạng thái mới do CPM cung cấp.
CPM dàn xếp 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 quay lại từ lệnh gọi này. Các dịch vụ đặc quyền được phép tiếp tục quá trình chuẩn bị không đồng bộ sau khi trả về cho PRE_SHUTDOWN_PREPARE
, SUSPEND_ENTER
, POST_SUSPEND_ENTER
. Trong trường hợp này, dịch vụ đặc quyền sẽ 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 máy đến VHAL.
Khi tất cả các đối tượng CPM đã hoàn tất việc 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 để tạm ngưng hạt nhân.
Trình tự được mô tả ở trên được minh hoạ dưới đây:
Hình 3. Chuyển sang trạng thái 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 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:
- Để lấy thực thể CPM, hãy gọi API Ô tô.
- 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 đối tượng CPM, hãy gọi phương thức getCarManager()
của đối tượng Xe. Phương thức này là một mặt tiền dùng để tạo đố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ị đại diện cho 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à hiển thị trong bảng sau:
Tên | Nội dung mô tả |
---|---|
STATE_ON | Chuyển sang trạng thái bật. Hệ thống đang hoạt động bình thường. |
STATE_SHUTDOWN_CANCELLED | Quá trình tắt máy bị huỷ và trạng thái nguồn điện được trả về trạng thái bình thường. |
STATE_SHUTDOWN_ENTER | ứng dụng sẽ dọn dẹp và sẵn sàng tắt. |
STATE_POST_SHUTDOWN_ENTER | Các bước chuẩn bị để tắt máy đã hoàn tất và VMCU đã sẵn sàng tắt máy. Chuyển sang trạng thái tắt. |
STATE_PRE_SHUTDOWN_PREPARE | Quy trình tắt máy được yêu cầu nhưng CPMS chưa bắt đầu quy trình này. Màn hình và âm thanh vẫn bật |
STATE_SHUTDOWN_PREPARE | Chế độ gara có thể chạy trong khoảng thời gian đó. |
STATE_SUSPEND_ENTER | ứng dụng sẽ dọn dẹp và sẵn sàng cho trạng thái tạm ngưng vào RAM. |
STATE_POST_SUSPEND_ENTER | Các bước chuẩn bị để tạm ngưng vào RAM đã hoàn tất và VMCU đã sẵn sàng để 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 | ứng dụng sẽ dọn dẹp và sẵn sàng cho trạng thái ngủ đông. |
STATE_POST_HIBERNATION_ENTER | Các bước chuẩn bị cho trạng thái ngủ đông đã hoàn tất và VMCU đã sẵn sàng cho trạng thái ngủ đông. Chuyển sang trạng thái ngủ đông. |
STATE_HIBERNATION_EXIT | Thức dậy từ trạng thái ngủ đông hoặc tiếp tục từ trạng thái ngủ đông bị huỷ. |
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ả đố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 khi triển khai Android
Nhà tích hợp chịu trách nhiệm về các mụ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ải quá trình 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 máy từ Android đến ô tô.
- Bắt đầu tắt hoặc tạm ngưng Android thông qua giao diện nhân Linux.
- Đảm bảo rằng tất cả nguồn đánh thức đều bị tắt 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 vô thời hạn quy trình tắt.
- Đảm bảo rằng BSP bật (hoặc tắt) các thành phần 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ị vào 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
. Trình tích hợp phải cung cấp một hàm theo dõi tệp này và đưa Linux vào trạng thái nguồn điện tạm ngưng. Hàm này có thể gửi GPIO đến VMCU để thông báo cho VMCU rằng thiết bị đã tắt hoàn toàn. Trình tích hợp cũng chịu trách nhiệm xoá mọi điều kiện tương tranh giữa việc 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 giao diện giữa mạng ô tô và Android. VHAL:
- Truyền tải quá trình 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 máy từ Android đến ô tô.
- Bắt đầu tắt hoặc tạm ngưng Android thông qua giao diện nhân Linux.
Khi CPMS thông báo cho VHAL rằng CPMS đã sẵn sàng tắt, VHAL sẽ gửi thông báo sẵn sàng tắt cho 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 hạt nhân để tạm ngưng hoặc tắt thiết bị. Trước khi thực hiện việc này, VHAL hoặc BSP có thể bật/tắt GPIO để hướng dẫn VMCU rằng có thể rút nguồn điện khỏi thiết bị một cách an toàn.
VHAL phải hỗ trợ các thuộc tính sau đây để kiểm soát việc quản lý nguồn điện thông qua VHAL:
Tên | Nội dung mô tả |
---|---|
AP_POWER_STATE_REPORT | Android báo cáo các quá trình chuyển đổi trạng thá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 đổi 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 điện hiện tại của Android. Thuộc tính này chứa hai số nguyên:
int32Values[0]
: Loại 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 hoặc 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ị | Nội dung 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. | Phải được đặt |
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. | Phải được đặt |
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 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 thêm báo cáo SHUTDOWN_POSTPONE. | Phải được đặt |
SHUTDOWN_PREPARE | Android đang chuẩn bị tắt. | Phải được đặt |
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.) | Phải được đặt |
SHUTDOWN_CANCELLED | Android sẽ 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 tự động hoặc để phản hồi một yêu cầu thông qua VMCU.
AP_POWER_STATE_REQ
Thuộc tính này do VMCU gửi để chuyển Android sang một trạng thái nguồn khác và chứa hai số nguyên:
int32Values[0]
: Giá trị enumVehicleApPowerStateReq
, đại diện cho trạng thái mới cần chuyển đổi.int32Values[1]
: Giá trị enumVehicleApPowerStateShutdownParam
. Giá trị này chỉ được gửi cho một thông báoSHUTDOWN_PREPARE
và truyền đến Android các tuỳ chọn mà thông báo đó chứa.
Giá trị số nguyên đầu tiên thể hiện 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ị | Nội dung mô tả |
---|---|
ĐANG BẬT | AP sẽ bắt đầu hoạt động đầy đủ. |
SHUTDOWN_PREPARE | AP sẽ chuẩn bị tắt. Giá trị thứ hai cho biết liệu AP có được phép hoãn tắt hay không và liệu AP có nên tắt nguồn hay chuyển sang trạng thái ngủ sâu hay không. |
CANCEL_SHUTDOWN | AP sẽ ngừng chuẩn bị tắt và chuẩn bị BẬT. |
ĐÃ KẾT THÚC | AP hiện sẽ bị đóng 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ị | Nội dung mô tả |
---|---|
CAN_SLEEP | AP có thể chuyển sang trạng thái ngủ sâu thay vì tắt hoàn toàn. Bạn có thể hoãn. |
CAN_HIBERNATE | AP có thể chuyển sang trạng thái ngủ đông thay vì tắt hoàn toàn. Bạn có thể hoãn. |
SHUTDOWN_ONLY | AP sẽ tắt. Bạn có thể hoãn. Không cho phép chế độ ngủ sâu. |
SLEEP_IMMEDIATELY | AP có thể chuyển sang trạng thái 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 trạng thái tạm ngưng trên ổ đĩa, nhưng phải chuyển sang trạng thái 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 cho phép chế độ 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 ngắt từ VMCU để đánh thức SoC. Điều này giả định rằng VMCU có thể nghe modem cho 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 đẩy đến AP, thì bạn phải thêm một nguồn đánh thức khác để bảo dưỡng modem.
Ứng dụng
Nhà sản xuất thiết bị gốc (OEM) phải cẩn thận khi viết ứng dụng để có thể tắt ứng dụng 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ụ xử lý 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 hiển thị 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.
Quan hệ đố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 mục tiêu. Ví dụ: VehicleHAL có một tham chiếu đến đối tượng PropertyHalService.
Hình 5. Sơ đồ tham chiếu đối tượng.