从 Android 10 开始,HIDL 已废弃,Android 将在所有位置改用 AIDL。
一、准备工作
- 整套源码,Android S的
- 保证全套代码已经全编译,原生代码全编译命令
- source build/envset.sh
- lunch
- make
3、hidl-gen工具已经安装,安装命令
- make hidl-gen
二、项目实例
1、在hardware/interfaces/目录下新建 test/1.0目录,并在1.0目录中创建接口ITest.hal。目录结构如下
ITest.hal文件里面只有一个接口ITest和一个方法helloWorld(string name),具体实现如下:
package android.hardware.test@1.0; interface ITest{ helloWorld(string name) generates (string result); };
2、在源码根路径执行下面三条命令会自动生成对应的c++文件;
PACKAGE=android.hardware.test@1.0
LOC=hardware/interfaces/test/1.0/default/
hidl-gen -o $LOC -Lc++-impl -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport $PACKAGE
对应的 目录结构如下
default 是新生成的目录,Test.cpp和Test.h是新生成的两个文件,打开Test.h文件,去掉// extern "C" IGunder* HIDL_FETCH_ITest(const char* name);前面的注释,使用直通式HAL(Passthrough 模式)来通信
Test.cpp文件也要进行对应的修改,修改后如图所示
3、执行下面命令
hidl-gen -o $LOC -Landroidbp-impl -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport $PACKAGE
会在hardware/interfaces/test/1.0/default目录生成Android.bp文件。
4、然后使用脚本update-makefiles.sh来更新Makefile,自动在hardware/interfaces/test/1.0目录生成 Android.bp。命令如下
./hardware/interfaces/update-makefiles.sh
5.在hardware/interfaces/test/1.0/default目录下新建service.cpp跟android.hardware.test@1.0-service.rc,其中android.hardware.test@1.0-service.rc是程序的入口函数
service test_hal_service /vendor/bin/hw/android.hardware.test@1.0-service class hal user system group system
6.新建service.cpp 这里使用绑定式 直通式为注释部分
#define LOG_TAG "android.hardware.test@1.0-service" #include <android-base/logging.h> #include <hidl/HidlTransportSupport.h> #include <android/hardware/test/1.0/ITest.h> #include <hidl/LegacySupport.h> #include "Test.h" using android::hardware::configureRpcThreadpool; using android::hardware::joinRpcThreadpool; using android::hardware::test::V1_0::implementation::Test; //using android::hardware::defaultPassthroughServiceImplementation; //passthrough mode int main() { configureRpcThreadpool(4, true); Test test; auto status = test.registerAsService(); CHECK_EQ(status, android::OK) << "Failed to register test HAL implementation"; joinRpcThreadpool(); return 0; // joinRpcThreadpool shouldn't exit // return defaultPassthroughServiceImplementation<ITest>(); //passthrough mode }
7.修改default下的Android.bp,添加 service的编译规则
cc_binary { name: "android.hardware.test@1.0-service", relative_install_path: "hw", defaults: ["hidl_defaults"], proprietary: true, init_rc: ["android.hardware.test@1.0-service.rc"], srcs: [ "Test.cpp", "service.cpp", ], shared_libs: [ "libbase", "liblog", "libdl", "libutils", "libhardware", "libhidlbase", "libhidltransport", "android.hardware.test@1.0", ], }
调用 update-makefiles.sh更新一下然后单编测试一下
mmm ./hardware/interfaces/test/1.0
Android