幸苦添加的HIDL service是为了服务各个client请求的。在实际场景中,HIDL service一般对应某个硬件模块,其中的接口则对应硬件所具备的功能。各个client则是对该模块有具体需求的。例如 HIDL-Light中则会提供控制具体led的接口,那么client则可以通过HIDL-Light所提供的接口来控制led,来实现各种联动功能。
1.Android.bp 说明
HIDL的服务是支持cpp/ndk/java方式调用的,这里选用cpp的方式进行调用。那么编译的模块则是cc_binary,大致内容如下
cc_binary {
name: "customHardwareClient1",
vendor: true,
relative_install_path: "hw",
shared_libs: [
...
"flagstaff.hardware.custom_hardware@1.0",
],
}
从上面的Android.bp可得,测试模块为customHardwareClient1,位于/vendor/bin/hw路径。因为其需要调用custom_hardware接口的服务,则添加相应的动态库(flagstaff.hardware.custom_hardware@1.0),该动态库中涵盖了binder rpc的实现,以及ICustomHardware,.ha接口所转化出来的cpp头文件和代理类相关的接口实现。
2.customHardwareClient1实现
using flagstaff::hardware::custom_hardware::V1_0::ICustomHardware;
int main(int /* argc */, char** /* argv */) {
android::sp<ICustomHardware> instance = ICustomHardware::getService();
android::sp<ICustomHardware> custom = ICustomHardware::getService("custom");
::android::hardware::Return<bool> ret = instance->enableHardware(true);
if(!ret.isOk()){
LOG(ERROR)<<"default Rmote call in failed.";
return -1;
}
ret = custom->enableHardware(false);
if(!ret.isOk()){
LOG(ERROR)<<"custom Rmote call in failed.";
return -1;
}
return 0;
}
每一个HIDL接口被解析的时候都会被自动加上接口getService的,client则可以通过该接口来获取远程HIDL service对应的句柄。例如此处则是分别获取了远端HIDL service的default/custom实例。又因为在Android中的CPP对象都继承自RefBase,所以使用指针进行管理也比较方便。
可以看到每次调用完远程接口后,首先调用isOK进行判断本次RPC是否正常,不想如此麻烦也可以使用接口 withDefault来替代,例如
bool ret = instance->enableHardware(true).withDefault(false)
3.编译
编译完成后位于的路径如下
flagstaff@flagstaff-pc:~/aosp_r.lns/out/target/product/generic_x86_64$ ls vendor/bin/hw/customHardwareClient1
vendor/bin/hw/customHardwareClient1
4.运行
generic_x86_64:/ # logcat -s customHardwareClient1 flagstaff.hardware.custom_hardware&
[1] 1917
01-22 20:29:58.666 274 274 I flagstaff.hardware.custom_hardware: The instance of CustomHardware is registered to hwmanager in success.
generic_x86_64:/ # /vendor/bin/hw/customHardwareClient1
01-22 20:34:20.666 274 294 E flagstaff.hardware.custom_hardware: [service]default[data]1
01-22 20:34:20.666 1919 1919 E customHardwareClient1: default ret is false.
01-22 20:34:20.666 274 294 E flagstaff.hardware.custom_hardware: [service]default[data]0
01-22 20:34:20.667 1919 1919 E customHardwareClient1: custom ret is false.
上面的LOG_TAG,customHardwareClient1\flagstaff.hardware.custom_hardware分别对应customHardwareClient1(pid:1919) 及CustomHardware service(pid:274)。
generic_x86_64:/ # ps -ef -p 274
UID PID PPID C STIME TTY TIME CMD
system 274 1 0 29:57 ? 00:00:00 flagstaff.hardware.custom_hardware@1.0-service
从log看default及custom实例的远程调用也是正常的,一次开一次关也已经反馈到了service了。
另外如果有问题,欢迎留言或者email(836190520@qq.com)我,技术升级在于交流~~