hidl服务

       本文通过创建一个hidl服务,学习hidl-gen命令怎样使用,例子从网上摘抄的,不过有一些自己的理解。

首先再${ANDROID_BUILD_TOP}目录下source 和 lunch

  1. 创建服务通讯代码需要的android.bp

mkdir –p hardware/interfaces/gunder/1.0/default

mkdir –p hardware/interfaces/gunder/1.0/test

创建 hardware/interfaces/gunder/1.0/IGunder.hal

package android.hardware.gunder@1.0;

      

interface IGunder{

helloWorld(string name) generates (string result);

};

cd hardware/interfaces/gunder/1.0/

tree

├── default

├── hidl-gen.sh

├── IGunder.hal

└── test

为了生成负责通讯的C++代码,首先必须生成编译这些负责通讯的C++代码的android.bp文件。打开hidl-gen.sh,前边的变量不动,后边的命令只留:

hidl-gen -Landroidbp -r android.hardware:$HIDL_ROOT_DIR $LIBHIDL_COMPONENT $PACKAGENAME

./hidl-gen.sh

tree

├── Android.bp

├── default

├── hidl-gen.sh

├── IGunder.hal

└── test

Android.bp 用于在mmm hardware/interfaces/gunder/1.0 时生成负责通信的C++文件。

mmm  hardware/interfaces/gunder/1.0 隐藏了很多的信息,其中就有:

hidl-gen -o $LOC -Lc++-sources -r android.hardware:$HIDL_ROOT_DIR \

       $LIBHIDL_COMPONENT $PACKAGENAME

hidl-gen -o $LOC -Lc++-headers -r android.hardware:$HIDL_ROOT_DIR \

       $LIBHIDL_COMPONENT $PACKAGENAME

生成的文件:

out/soong/.intermediates/hardware/interfaces/gunder/1.0/

上面两个hidl-gen 命令生成了android.hardware.gunder@1.0_genc++ 和 android.hardware.gunder@1.0_genc++_headers 两个目录

最终会生成 android.hardware.gunder@1.0.so 所以该库就是该服务的通信代码动态库。

  1. 创建服务的相关业务代码

打开

hidl-gen -o $LOC -Lc++-impl -r android.hardware:$HIDL_ROOT_DIR $LIBHIDL_COMPONENT $PACKAGENAME

注掉其他命令

执行 ./hidl-gen.sh

tree

├── Android.bp

├── default

│   ├── Gunder.cpp

│   └── Gunder.h

├── hidl-gen.sh

├── IGunder.hal

└── test

Gunder.cpp Gunder.h 可以实现该服务的相关业务代码,比如完善接口helloWorld()。打开HIDL_FETCH_IGunder()接口,该接口很重要,它是通讯层代码调到业务层代码的接口。

打开hidl-gen -o $LOC -Landroidbp-impl -r android.hardware:$HIDL_ROOT_DIR $LIBHIDL_COMPONENT $PACKAGENAME 其他命令注释掉。

执行./hidl-gen.sh

tree

├── Android.bp

├── default

│   ├── Android.bp

│   ├── Gunder.cpp

│   └── Gunder.h

├── hidl-gen.sh

├── IGunder.hal

└── test

这个android.bp 结合 Gunder.cpp Gunder.h,在编译时会生成

android.hardware.gunder@1.0-impl.so ,所以这个动态库就是该服务的业务代码动态库。

  1. 添加该服务

在hardware/interfaces/gunder/1.0/default目录下新建service.cpp跟android.hardware.gunder@1.0-service.rc,其中android.hardware.gunder@1.0-service.rc是程序的入口函数。新的目录结构如下

├── Android.bp

├── default

│   ├── Android.bp

│   ├── android.hardware.gunder@1.0-service.rc

│   ├── Gunder.cpp

│   ├── Gunder.h

│   └── service.cpp

├── hidl-gen.sh

├── IGunder.hal

└── test

打开hardware/interfaces/gunder/1.0/default目录下的Android.bp,添加编译service.cpp成为可执行文件的代码。

cc_binary {

    // FIXME: this should only be -impl for a passthrough hal.

    // In most cases, to convert this to a binderized implementation, you should:

    // - change '-impl' to '-service' here and make it a cc_binary instead of a

    //   cc_library_shared.

    // - add a *.rc file for this module.

    // - delete HIDL_FETCH_I* functions.

    // - call configureRpcThreadpool and registerAsService on the instance.

    // You may also want to append '-impl/-service' with a specific identifier like

    // '-vendor' or '-<hardware identifier>' etc to distinguish it.

    name: "android.hardware.gunder@1.0-service",

    relative_install_path: "hw",

    // FIXME: this should be 'vendor: true' for modules that will eventually be

    // on AOSP.

    proprietary: true,

    init_rc: ["android.hardware.gunder@1.0-service.rc"],

    srcs: [

        "service.cpp",

    ],

    shared_libs: [

        "liblog",

        "libcutils",

        "libdl",

        "libbase",

        "libutils",

        "libhardware",

        "libhidlbase",

        "libhidltransport",

        "android.hardware.gunder@1.0",

    ],

}

  1. 编译生成服务端跟客户端要用各种库文件

cd ${ANDROID_BUILD_TOP}

mmm hardware/interfaces/gunder/1.0/

执行后会生成下面的文件:

android.hardware.gunder@1.0.so

android.hardware.gunder@1.0-impl.so

android.hardware.gunder@1.0-service.rc

  1. 添加供应商清单和兼容性矩阵

tree

├── Android.bp

├── default

│   ├── Android.bp

│   ├── android.hardware.gunder@1.0-service.rc

│   ├── Gunder.cpp

│   ├── Gunder.h

│   └── service.cpp

├── Gunder.mk

├── hidl-gen.sh

├── IGunder.hal

├── manifest.xml

├── test

└── vendor_framework_compatibility_matrix.xml

Gunder.mk可以放到device/Lenovo/jd20/jd20.mk

$(call inherit-product-if-exists, hardware/interfaces/gunder/1.0/Gunder.mk)

  1. 使用C++实现客户端调用

在test目录下新建Android.bp跟GunderTest.cpp文件

mmm hardware/interfaces/gunder/1.0/test 会生成gunder_client

 

  1. hidl-gen 参数盘点

#hidl-gen -o $LOC -Lc++-impl -r android.hardware:$HIDL_ROOT_DIR $LIBHIDL_COMPONENT $PACKAGENAME

#hidl-gen -o $LOC -Landroidbp-impl -r android.hardware:$HIDL_ROOT_DIR $LIBHIDL_COMPONENT $PACKAGENAME

用于生成业务代码,编译生成android.hardware.gunder@1.0-impl.so

 

#hidl-gen -Landroidbp -r android.hardware:$HIDL_ROOT_DIR $LIBHIDL_COMPONENT $PACKAGENAME

#hidl-gen -o $LOC -Lc++-headers -r android.hardware:$HIDL_ROOT_DIR $LIBHIDL_COMPONENT $PACKAGENAME

#hidl-gen -o $LOC -Lc++-sources -r android.hardware:$HIDL_ROOT_DIR $LIBHIDL_COMPONENT $PACKAGENAME

用于生成通讯代码,编译生成android.hardware.gunder@1.0.so

 

c++-headers c++-sources 其实是在mmm时自动执行的(你也可以在 hidl-gen.sh中放开执行一下,看看生成了啥),所以只需要执行androidbp,然后mmm

#hidl-gen -o $LOC -Lmakefile -r android.hardware:$HIDL_ROOT_DIR $LIBHIDL_COMPONENT $PACKAGENAME #该命令已经不支持了

 

#hidl-gen -o $LOC -Lc++ -r android.hardware:$HIDL_ROOT_DIR $LIBHIDL_COMPONENT $PACKAGENAME

c++ 其实是 c++-headers和c++-sources的合体。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Android应用程序中使用HIDL服务,需要先了解HIDL服务的接口和功能。通常,HIDL服务会提供一个HIDL接口,该接口定义了与硬件模块通信的方法和功能。 下面是使用HIDL服务的一般步骤: 1. 包含HIDL服务的依赖:在应用程序的build.gradle文件中,添加对包含HIDL服务的库的依赖项。例如,如果HIDL服务位于"com.example.hidl"包中,可以添加以下依赖项: ```groovy implementation 'com.example.hidl:hidl-service:1.0' ``` 2. 获取HIDL服务的引用:在应用程序的代码中,使用ServiceManager来获取HIDL服务的引用。ServiceManager是Android系统中的系统服务,它允许应用程序获取和管理系统的各种服务。 ```java import android.os.ServiceManager; // 获取HIDL服务的引用 IBaseHidlService hidlService = IBaseHidlService.getService(); ``` 3. 调用HIDL服务的方法:通过获取到的HIDL服务引用,可以调用其定义的方法来与硬件模块进行交互。 ```java // 调用HIDL服务提供的方法 hidlService.doSomething(); ``` 需要注意的是,具体的HIDL接口和方法名称会根据你所使用的HIDL服务而有所不同。你需要查阅相关文档或源代码以了解具体的接口和方法定义。 此外,还需要确保在AndroidManifest.xml文件中声明必要的权限和服务,以便应用程序可以访问HIDL服务。 总之,使用HIDL服务的关键是获取HIDL服务的引用,并调用其定义的方法来与硬件模块进行交互。具体的步骤和方法会根据你使用的HIDL服务而有所不同,需要参考相关文档或源代码进行实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值