Android R(11)创建自定义HIDL接口--ICustomHardware(二)

1.定义包名

package flagstaff.hardware.custom_hardware@1.0;

  HIDL的定义风格总体和cpp是相似的,此处的package也就对应cpp的命名空间,如果是使用cpp来实现后端,那么接口对应的命名空间如下

using flagstaff::hardware::custom_hardware::V1_0::ICustomHardware;

  在HIDL接口中,包名的定义规则如下

<package_name>@<number.number>

2.定义接口名

package flagstaff.hardware.custom_hardware@1.0;
interface ICustomHardware {
    ...
};

  ICustomHardware 对应cpp的话则类 ICustomHardware。
interface可以和cpp的class/struct等关键字挂钩理解。

3.定义方法

package flagstaff.hardware.custom_hardware@1.0;
interface ICustomHardware {
    enableHardware(bool data) generates (bool ret);
};

  此处在接口ICustomHardware内定义了方法enableHardware,其入参为boolean类型,返回值也是boolean。

4.文件存放

  HIDL的文件命名必须与其内部的接口名称对应,故对于此处定义了ICustomHardware则需保存为ICustomHardware.hal。在HIDL中,一个接口则对应一个文件。下面则是ICustomHardware.hal的存放目录

test/flagstaffTest/hardware/interfaces/custom_hardware/1.0/ICustomHardware.hal

5.Android.bp

5.1 使用hidl-gen自动生成

  hidl-gen根据是AOSP自带的根据,专门用于根据用户自定义的HIDL接口自动生成各种以来文件的。下面则是用于生成Android.bp的命令

hidl-gen -L androidbp  -r flagstaff.hardware:test/flagstaffTest/hardware/interfaces flagstaff.hardware.custom_hardware@1.0

5.2 hidl-gen

  hidl-gen功能还是比较强大的,最好提前熟悉。后续自动生成cpp的头文件、接口实现框架代码都会用到,下面是其基本格式。

flagstaff@flagstaff-pc:~/aosp_r.lns$ hidl-gen
Usage: hidl-gen -o <output path> -L <language> [-O <owner>] [-p <root path>] (-r <interface root>)+ [-R] [-v] [-d <depfile>] FQNAME...

5.3 Android.bp的解析

  成功后则会在路径test/flagstaffTest/hardware/interfaces/custom_hardware/1.0/生成Android.bp文件,其内容如下

flagstaff@flagstaff-pc:~/aosp_r.lns/test/flagstaffTest/hardware/interfaces/custom_hardware/1.0$ cat Android.bp
// This file is autogenerated by hidl-gen -Landroidbp.

hidl_interface {
    name: "flagstaff.hardware.custom_hardware@1.0",
    root: "flagstaff.hardware",
    system_ext_specific: true,
    srcs: [
        "ICustomHardware.hal",
    ],
    interfaces: [
        "android.hidl.base@1.0",
    ],
    gen_java: true,
}

下面直接给出各个字段的官方说明,其说明文档则位于

~/aosp_r.lns/out/soong/docs/hidl.html

name:
  The name of the module. Must be unique across all modules.
srcs
  list of strings, List of .hal files which compose this interface.
root
  Package root for this package, must be a prefix of name
system_ext_specific
  bool, whether this module extends system. When set to true, it is installed into /system_ext (or /system/system_ext if system_ext partition does not exist).
interfaces
  list of strings, List of hal interface packages that this library depends on.
gen_java
  bool, Whether to generate the Java library stubs. Default: true

6.接口编译

6.1 system/vendor的接口依赖

  有了Android.bp和源文件ICustomHardware.hal,那么就可以编译了,命令如下

flagstaff@flagstaff-pc:~/aosp_r.lns$ mmm -j8 test/flagstaffTest/hardware/interfaces/custom_hardware/1.0/:flagstaff.hardware.custom_hardware@1.0

  编译成功后,会在system/vendor下生成对应的动态库,其实还是Binder那一套C/S模型。

flagstaff@flagstaff-pc:~/aosp_r.lns/out/target/product/generic_x86_64$ find  ./system/ ./vendor -name "*flagstaff*"
./system/system_ext/lib/flagstaff.hardware.custom_hardware@1.0.so
./system/system_ext/lib64/flagstaff.hardware.custom_hardware@1.0.so
./vendor/lib64/flagstaff.hardware.custom_hardware@1.0.so

  system及vendor目录下的动态库独立被位于system/vendor下的程序使用,最终交汇处则是binder驱动,如此在应用层system/vendor之间则是解耦合的,这也是Android O之后system.img和vendor.img可以独立升级的基础。

6.2 HIDL接口的后端代码

  HIDL(hardware interface description language)不过是接口定义语言的一种和AIDL(Android interface description language)本质上是一样的,它们被设计出来的目的只是用于接口定义,和具体语言之间是解耦合的。但对于程序开发人员最终还是需要通过java/c/c++/rust等开发语言来实现具体的功能的。在接口编译通过后在out目录下可以找到对应的中间代码,其路径如下

//接口头文件
flagstaff@flagstaff-pc:~/aosp_r.lns/out/soong/.intermediates/test/flagstaffTest/hardware/interfaces/custom_hardware/1.0/flagstaff.hardware.custom_hardware@1.0_genc++_headers/gen/flagstaff/hardware/custom_hardware/1.0$ ls
BnHwCustomHardware.h  BpHwCustomHardware.h  BsCustomHardware.h  ICustomHardware.h  ICustomHardware.h.d  IHwCustomHardware.h
//Bp/Bn的实现代码
flagstaff@flagstaff-pc:~/aosp_r.lns/out/soong/.intermediates/test/flagstaffTest/hardware/interfaces/custom_hardware/1.0/flagstaff.hardware.custom_hardware@1.0_genc++/gen/flagstaff/hardware/custom_hardware/1.0$ ls
CustomHardwareAll.cpp  CustomHardwareAll.cpp.d

  官网给的图已经够清晰了直接引用下就不自己画了,接口名自行替换想象下。
在这里插入图片描述
在这里插入图片描述
  另外如果有问题,欢迎留言或者email(836190520@qq.com)我,技术升级在于交流~~

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值