HIDL demo实现详细步骤
1. 环境配置
首先将 AOSP 的源码编译一下,编译步骤详见传送门
编译完成之后,查看:源码根目录 /out/host/linux-x86/bin 中是否有 hidl-gen 工具。
如果有就可以直接配置环境变量
如果没有使用 (在根目录):make hidl-gen 生成 hidl-gen 工具
配置环境变量:
1 | jackou@ubuntu:~$ vim .bashrc |
在末尾添加
export PATH=$PATH:/home/jackou/work_directory/out/host/linux-x86/bin/
2. 新建 HIDL 模块
2.1 新建 hal 接口文件
在 hardware/interfaces 目录新建存放接口的目录
1 | mkdir -p hidltest/1.0 |
创建 hal 文件,名为 IHidlTest.hal
1 | package android.hardware.hidltest@1.0; |
2.2 生成.h 和.cpp 文件
在根目录下利用 hidl-gen 生成对应的服务端代码:
1 | PACKAGE=android.hardware.hidltest@1.0 |

1 | //自动生成的HidlTest.h头文件 |
1 | //自动生成的c++实现 |
2.3 更新 bp 文件
使用一下脚本更新 bp 文件,不知道为什么,我使用的 Android P 代码,lunch 10 产品,使用一下脚本始终不能像博友生成 Android.mk 文件,只生成了 Andorid.bp 文件。不过没关系,不影响编译,bp 文件也是可以编译的。
1 | ./hardware/interfaces/update-makefiles.sh |
1 | // Android.bp文件 |
标签说明:
- name 需要与 package name 相同,编译的时候会根据需要生成对应的 so 或 jar
- root 即为与 hidl 对应的 root name
- interfaces 为编译过程中依赖的接口名称,如 c 中的 shared library
- types 为模块中所需要的自定义类型
- 如果有需要的 java 代码可以将 gen_java 设为 true,如果没有(例如 passthrough 模式)需要将这里设为 false。不过一般通过 update_makefiles.sh 就可以自动生成。详细看 Android HIDL 中 hidl-gen 使用
配置完成之后,编译会在 **~/work_directory/out/soong/.intermediates/hardware/interfaces/hidltest/1.0** 生成如下文件:
android.hardware.hidltest@1.0 就是模块对应的库文件;
android.hardware.hidltest@1.0_genc++ 为生成对应的 C++ 临时文件,在使用的时候都是链接到这里;
android.hardware.hidltest@1.0_genc++_headers 为生成的 C++ 所需的头文件;
android.hardware.hidltest-V1.0-java 为 java 代码所使用的 java 库文件;
android.hardware.hidltest-V1.0-java_gen_java 为 java 代码所使用的 java 文件
2.4 采取直通模式
将 HidlTest.h 中的以下注释解开,代码如 2.2 小节
1 | // extern "C" IHidlTest* HIDL_FETCH_IHidlTest(const char* name); |
将 HidlTest.cpp 中的以下代码注解解开,代码如 2.2 小节
1 | IHidlTest* HIDL_FETCH_IHidlTest(const char* /* name */) { |
2.5 实现功能
在 HidlTest.cpp 中实现接口的功能,代码见代码如 2.2 小节
1 | Return<void> HidlTest::helloWorld(const hidl_string& name, helloWorld_cb _hidl_cb) { |
ok,现在大功告成; 准备开始编译。
2.6 编译模块
在根目录使用以下命令编译模块
1 | mmm hardware/interfaces/hidltest/1.0/default/ |
具有实现的 so 库有了,我们开始构建 binder 通信服务。
2.7 编写 android.hardware.hidltest@1.0-service.rc 文件
在 default 目录创建 android.hardware.hidltest@1.0-service.rc 文件,作为启动文件
1 | service hidltest_hal_service /vendor/bin/hw/android.hardware.hidltest@1.0-service |
配置服务的名字为 hidltest_hal_service。
2.8 编写 service 文件
1 | // default目录下建立service.cpp |
2.9 在 Android.bp 中添加对服务器的编译:
1 | vim hardware/interfaces/hidltest/1.0/default/Android.bp |
在 Android.bp 中添加:
1 | cc_binary { |
2.10 编写 manifest.xml 文件
为了使客户端能够调用服务端的代码需要在 manifest.xml 中添加服务:在 device/qcom/msm8996/manifest.xml 文件最后添加:
1 | <hal format="hidl"> |
或者在车机 /vendor/etc/vintf/manifest.xml 中
2.11 再次编译模块
1 | mmm hardware/interfaces/hidltest/1.0/default/ |
最后生成的文件
out/target/product/generic_x86_64/vendor/lib64/hw/android.hardware.hidltest@1.0-impl.so
out/target/product/generic_x86_64/vendor/bin/hw/android.hardware.hidltest@1.0-service
out/target/product/generic_x86_64/system/lib64/vndk-28/android.hardware.hidltest@1.0.so
2.12 编写 C++ 客户端
在 hardware/interfaces/hidltest/1.0 / 建立 test 目录,用于存储 c++ 客户端代码。
创建 HidlTestClient.cpp 文件,并且编写客户端代码
1 |
|
2.13 编写客户端编译脚本
在 hardware/interfaces/hidltest/1.0/test 目录下,创建 Android.bp
1 | cc_binary { |
2.14 编译模块
1 | mmm hardware/interfaces/hidltest/1.0/ |
- out/target/product/generic_x86_64/system/framework/oat/x86_64 / 目录下生成 android.hardware.hidltest-V1.0-java.odex 可执行文件
2.15 编写 Android app 端代码
2.15.1 取的 jar 包
从 2.3 中~/work_directory/out/soong/.intermediates/hardware/interfaces/hidltest/1.0/android.hardware.hidltest-V1.0-java/android_common/combined 目录拿到 Android 端使用的 jar 包。
2.15.2 建立 AS 工程
由于 HIDL 调用需要 java 8,所以在 build.gradle 中加入以下配置
1 | android { |
2.15.3 编写代码
1 | public class MainActivity extends AppCompatActivity { |
编译上面 demo 工程,生成 apk 文件,准备在目标板子上运行。
至此,所有准备工作已经做完了。
2.16 将目标文件烧写到车机
需要准备的文件
base path: ~/work_directory/out/target/product/generic_x86_64
abstract path:
- /vendor/lib64/hw/android.hardware.hidltest@1.0-impl.so
- /system/lib64/android.hardware.hidltest@1.0.so
- /vendor/bin/hw/hidltest_client
- /vendor/bin/hw/android.hardware.hidltest@1.0-service
车机中的 manifest.xml 修改之后 push 到原来的目录
2.16.1 push 路径说明
android.hardware.hidltest@1.0-impl.so –> /vendor/lib64/hw
android.hardware.hidltest@1.0.so –> /system/lib64
hidltest_client –> /vendor/bin/hw
android.hardware.hidltest@1.0-service –> /vendor/bin/hw
manifest.xml –> /vendor/etc/vintf
2.16.2 安装 apk
adb install -r / 本地路径 /app-debug.apk
2.17 启动服务,测试功能
1. 启动 Hidl 模块服务
./vendor/bin/hw/android.hardware.hidltest@1.0-service2. 启动客户端
./vendor/bin/hw/hidltest_client3. 运行 apk 看界面现象
Notice:HAL 回调实现下一小节叙述,或者见参考文献 3