AIDL VHAL được xác định trong
android.hardware.automotive.vehicle namespace.
Giao diện VHAL được xác định tại
IVehicle.aidl.
Trừ phi được chỉ định, tất cả phương thức đều phải được triển khai cho một phiên bản VHAL cụ thể.
Phiên bản
| Phiên bản Android | Phiên bản VHAL mới nhất | Phiên bản thuộc tính VHAL mới nhất | Phiên bản VHAL tối thiểu tương thích |
|---|---|---|---|
| Android 16 | Phiên bản 4 | Phiên bản 4 | V1 |
| Android 15 | V3 | V3 | V1 |
| Android 14 | V2 | V2 | V1 |
| Android 13 | V1 | (Giao diện thuộc tính VHAL không được chia tách) | V1 |
Bạn NÊN triển khai phiên bản VHAL mới nhất cho một phiên bản Android cụ thể.
Hàm và lệnh gọi lại
Các hàm VHAL được xác định tại
IVehicle.aidl.
| Phương thức | |
|---|---|
VehiclePropConfigs getAllPropConfigs()
|
|
VehiclePropConfigs getPropConfigs(in int[] props)
|
|
void getValues(IVehicleCallback callback, in GetValueRequests requests)
GetValueRequest một cách không đồng bộ. Kết quả được gửi qua
onGetValues phương thức của lệnh gọi lại. |
|
void setValues(IVehicleCallback callback, in SetValueRequests requests)
SetValueRequest một cách không đồng bộ. Kết quả được gửi qua the
onSetValues phương thức của lệnh gọi lại. |
|
void subscribe(in IVehicleCallback callback, in SubscribeOptions[] options, int maxSharedMemoryFileCount)
maxSharedMemoryFileCount không được sử dụng. |
|
void unsubscribe(in IVehicleCallback callback, in int[] propIds)
|
|
returnSharedMemory(in IVehicleCallback callback, long sharedMemoryId)
|
|
(Mới trong Android 16)SupportedValuesListResults getSupportedValuesLists(in List
|
|
(Mới trong Android 16)MinMaxSupportedValueResults getMinMaxSupportedValue(in List
|
|
void registerSupportedValueChangeCallback(in IVehicleCallback callback, in List
|
|
void unregisterSupportedValueChangeCallback(in IVehicleCallback callback, in List
|
|
Các lệnh gọi lại được xác định tại
IVehicleCallback.aidl
và chứa các phương thức này.
| Phương thức | |
|---|---|
oneway void onGetValues(in GetValueResults responses)
getValues để gửi kết quả nhận giá trị. Được gọi
khi một số giá trị cần tìm nạp đã sẵn sàng. |
|
oneway void onSetValues(in SetValueResults responses)
setValues để gửi kết quả đặt giá trị. Được gọi khi
VHAL đã hoàn tất việc xử lý một số yêu cầu đặt thuộc tính. |
|
oneway void onPropertyEvent(in VehiclePropValues propValues, int sharedMemoryFileCount)
CONTINUOUS thuộc tính, một sự kiện thuộc tính xảy ra dựa trên tỷ lệ lấy mẫu đăng ký
tính bằng Hz hoặc tần suất thông báo trên bus của xe. Một sự kiện thuộc tính cũng có thể xảy ra nếu trạng thái của một thuộc tính
thay đổi. Ví dụ: từ không có sẵn thành có sẵn.ON_CHANGE, một sự kiện thuộc tính xảy ra khi giá trị
hoặc trạng thái của một thuộc tính thay đổi.VehiclePropValue có trạng thái không có sẵn hoặc lỗi
và giá trị trống.SharedMemoryFileCount luôn là 0. |
|
oneway void onPropertySetError(in VehiclePropErrors errors)
onSetValues có kết quả lỗi thay vì lệnh gọi lại này. |
|
oneway void onSupportedValueChange(in List
getMinMaxSupportedValue hoặc
getSupportedValuesLists để nhận các giá trị đã cập nhật. |
|
Quá trình triển khai VHAL được VHAL VTS xác thực tại
VtsHalAutomotiveVehicle_TargetTest.cpp.
Bài kiểm thử này xác minh rằng các phương thức cơ bản được triển khai đúng cách và các cấu hình thuộc tính
được hỗ trợ là chính xác. Bài kiểm thử này chạy trên tất cả các thực thể VHAL trên thiết bị, tuy nhiên, AAOS chỉ sử dụng
thực thể mặc định (android.hardware.automotive.vehicle.IVehicle/default)
Giá trị thuộc tính của xe
Sử dụng cấu trúc
VehiclePropValue
để mô tả giá trị của từng thuộc tính, có các trường sau:
| Trường | Mô tả |
|---|---|
timestamp
| Dấu thời gian biểu thị thời điểm sự kiện xảy ra và được đồng bộ hoá với đồng hồ
SystemClock.elapsedRealtimeNano(). |
prop |
Mã thuộc tính cho giá trị này. |
areaid |
Mã khu vực cho giá trị này. Khu vực phải là một trong các khu vực được hỗ trợ có trong cấu hình mã khu vực
hoặc 0 đối với các thuộc tính chung. |
value |
Cấu trúc dữ liệu chứa giá trị thuộc tính thực tế. Dựa trên loại thuộc tính, một hoặc
nhiều trường trong trường này được dùng để lưu trữ giá trị thực tế. Ví dụ: phần tử đầu tiên
trong value.int32Values được dùng cho các thuộc tính thuộc loại Int32. Để biết thông tin chi tiết, hãy xem phần
Cấu hình
thuộc tính. |
status |
Trạng thái của thuộc tính để đọc. Đối với thuộc tính đọc/ghi, thuộc tính này cũng có thể áp dụng cho
việc ghi nhưng không được đảm bảo, ví dụ: thuộc tính có thể có sẵn để đọc nhưng không có sẵn để
ghi. Trong trường hợp đó, trạng thái là AVAILABLE và trường giá trị chứa thông tin hợp lệ.
Để biết các trạng thái có thể có, hãy xem
VehiclePropertyStatus. |
getValues và setValues không đồng bộ
Các thao tác getValues và setValues được thực hiện một cách không đồng bộ,
nghĩa là hàm có thể trả về trước khi thao tác nhận hoặc đặt thực tế hoàn tất.
Kết quả thao tác (ví dụ: giá trị thuộc tính cho getValues và trạng thái thành công hoặc
lỗi cho setValues) được gửi qua các lệnh gọi lại được truyền dưới dạng đối số.
Quá trình triển khai không được chặn kết quả trong luồng trình liên kết xử lý yêu cầu. Thay vào đó, bạn nên lưu trữ yêu cầu trong hàng đợi yêu cầu và sử dụng một luồng trình xử lý riêng để xử lý các yêu cầu một cách không đồng bộ. Hãy xem phần Triển khai tham chiếu để biết thông tin chi tiết.
Hình 1. Quy trình không đồng bộ.
Parcelable lớn
Tất cả các cấu trúc có tên XXXs, chẳng hạn như VehiclePropConfigs,
SetValueRequests và VehiclePropValues đều được gọi là
LargeParcelable (hoặc StableLargeParcelable). Mỗi cấu trúc đại diện cho một danh sách
các giá trị được dùng để truyền dữ liệu lớn có thể vượt quá các giới hạn của trình liên kết (4KB trong quá trình triển khai thư viện
LargeParcelable) trên các ranh giới của trình liên kết. Mỗi cấu trúc có định nghĩa cấu trúc tương tự
chứa các trường sau.
| Hướng dẫn | Mô tả |
|---|---|
payloads |
Danh sách các giá trị khi kích thước giá trị phù hợp với giới hạn bộ nhớ của trình liên kết hoặc danh sách trống. |
sharedMemoryFd |
Chỉ số mô tả tệp có thể rỗng trỏ đến tệp bộ nhớ dùng chung lưu trữ các tải trọng được chuyển đổi tuần tự nếu danh sách các giá trị quá lớn. |
Ví dụ: VehiclePropConfigs được xác định như sau:
parcelable VehiclePropConfigs { // The list of vehicle property configs if they fit the binder memory // limitation. VehiclePropConfig[] payloads; // Shared memory file to store configs if they exceed binder memory // limitation. Created by VHAL, readable only at client. Client could keep // the fd opened or keep the FD mapped to access configs. @nullable ParcelFileDescriptor sharedMemoryFd; }
VehiclePropConfigs chứa các tải trọng không trống hoặc
không rỗngsharedMemoryFd.
- Nếu
payloadskhông trống, thì nó sẽ lưu trữ danh sách dữ liệu thực tế, đó là cấu hình thuộc tính. - Nếu
sharedMemoryFdkhông rỗng, thì nó sẽ chứa một tệp bộ nhớ dùng chung, lưu trữ cấu trúc được tuần tự hoá củaVehiclePropConfigs. Cấu trúc này sử dụng hàmwriteToParcelđể tuần tự hoá một Parcel.
Là ứng dụng Java cho VHAL, Dịch vụ ô tô xử lý quá trình chuyển đổi tuần tự và giải tuần tự hoá cho
LargeParcelable. Đối với quá trình triển khai VHAL và ứng dụng gốc, LargeParcelable phải được tuần tự hoá và giải tuần tự hoá bằng
LargeParcelable
thư viện hoặc lớp trình bao bọc hữu ích cho thư viện trong
ParcelableUtils.h.
Ví dụ: ứng dụng gốc phân tích cú pháp các yêu cầu cho getValues nhận được từ trình liên kết
như sau:
// 'requests' are from the binder. GetValueRequests requests; expected<LargeParcelableBase::BorrowedOwnedObject, ScopedAStatus> deserializedResults = fromStableLargeParcelable(requests); if (deserializedResults.ok()) { const std::vector & getValueRequests = deserializedResults.value().getObject()->payloads; // Use the getValueRequests. } else { // handle error. }
Dưới đây là một ví dụ về quá trình triển khai VHAL gửi kết quả cho getValues thông qua trình liên kết là
được hiển thị bên dưới:
std::vectorresults = getResults(); GetValueResults parcelableResults; ScopedAStatus status = vectorToStableLargeParcelable(std::move(results), &parcelableResults); if (status.isOk()) { // Send parcelableResults through callback. } else { // Handle error. }