自 2025 年 3 月 27 日起,我们建议您使用 android-latest-release
而非 aosp-main
构建 AOSP 并为其做出贡献。如需了解详情,请参阅 AOSP 的变更。
将 VHAL 与 Native Client 搭配使用
使用集合让一切井井有条
根据您的偏好保存内容并对其进行分类。
VHAL 支持 Java 客户端和 Native Client。汽车服务是唯一适用于 VHAL 的 Java 客户端。对于典型的汽车应用,请使用 Car API(例如 CarPropertyManager
)访问 VHAL 属性,而不是直接与 VHAL 通信。实际上,SELinux 会阻止此类访问。如需了解详情,请参阅软件包索引中的 Car API 文档。
对于 Native Client,从 Android 13 开始,请使用 libvhalclient
,而不是直接连接 VHAL。这是一个客户端库,为 AIDL 和 HIDL VHAL 实现提供了一个通用接口 IVhalClient.h
。下面的示例展示了如何创建 VHAL Native Client 并使用它来获取车辆识别码 (VIN) 号码:
using ::aidl::android::hardware::automotive::vehicle::VehicleProperty;
using ::android::frameworks::automotive::vhal::IVhalClient;
using ::android::hardware::automotive::vehicle::toInt;
auto vhalClient = IVhalClient::tryCreate();
if (vhalClient == nullptr) {
// handle error.
}
auto result = vhalClient->getValueSync(
*vhalClient->createHalPropValue(toInt(VehicleProperty::INFO_VIN)));
// Use result
本页面上的内容和代码示例受内容许可部分所述许可的限制。Java 和 OpenJDK 是 Oracle 和/或其关联公司的注册商标。
最后更新时间 (UTC):2025-03-26。
[null,null,["最后更新时间 (UTC):2025-03-26。"],[],[],null,["# Use VHAL with the native client\n\nVHAL supports Java and native clients. Car Service is the only\nJava client for VHAL. For car apps, use the Car APIs (for example,\n[`CarPropertyManager`](https://developer.android.com/reference/android/car/hardware/property/CarPropertyManager))\nto access VHAL properties instead of directly communicating with\nthe VHAL. In fact, SELinux blocks direct access. For details, see the Car API documentation at\n[Package Index](https://developer.android.com/reference/android/car/packages).\n\nFor native clients, starting with Android 13, use\n[`libvhalclient`](https://android.googlesource.com/platform/packages/services/Car/+/refs/heads/android16-release/cpp/vhal/client/) instead of directly\nconnecting with VHAL. This is a client library that exposes one common interface,\n`IVhalClient.h` for AIDL and HIDL VHAL implementations. The following example shows\nhow to create a VHAL native client and use it to get a Vehicle Identification Number (VIN) number: \n\n```c++\n#include \u003cIVhalClient.h\u003e\n#include \u003cVehicleHalTypes.h\u003e\n#include \u003cVehicleUtils.h\u003e\n\nusing ::aidl::android::hardware::automotive::vehicle::VehicleProperty;\nusing ::android::frameworks::automotive::vhal::IVhalClient;\nusing ::android::hardware::automotive::vehicle::toInt;\n\nint main(int argc, char** argv) {\n auto vhalClient = IVhalClient::tryCreate();\n if (vhalClient == nullptr) {\n // handle error.\n return -1;\n }\n auto result = vhalClient-\u003egetValueSync(\n *vhalClient-\u003ecreateHalPropValue(toInt(VehicleProperty::INFO_VIN)));\n // Use result\n\n return 0;\n}\n```\n\nYou must configure SELinux policy to allow your native client to access VHAL. For example: \n\n```text\n# Define my domain\ntype my_native_daemon, domain;\n\n# Define the exec file type.\ntype my_native_daemon_exec, exec_type, file_type, system_file_type;\n\n# Initialize domain.\ninit_daemon_domain(my_native_daemon)\n\n# Allow using hwbinder for HIDL VHAL, not required if AIDL is used.\nhwbinder_use(my_native_daemon)\n# Allow using binder for AIDL VHAL\nbinder_use(my_native_daemon)\n# Allow my_native_daemon to be a VHAL client.\nhal_client_domain(my_native_daemon, hal_vehicle)\n```\n\n\u003cbr /\u003e"]]