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