当前位置:   article > 正文

HIDL最全编译流程_hidl-gen

hidl-gen

想了解HIDL介绍的可以参考《HIDL概述》,本篇文章主要介绍HIDL的详细编译流程及简单的客户端应用(C++跟Android客户端的应用)。

一、准备工作

整一套源码,Android O或者Android P的
保证全套代码已经全编译,原生代码全编译命令
source build/envset.sh
lunch
make
   3、hidl-gen工具已经安装,安装命令

make hidl-gen 
二、hidl-gen工具介绍

系统定义的所有的.hal接口,都是通过hidl-gen工具转换成对应的代码。hidl-gen源码路径:system/tools/hidl,是在ubuntu上可执行的二进制文件。

  1. 使用方法:hidl-gen -o output-path -L language (-r interface-root) fqname
  2. 例子:
  3. hidl-gen -o hardware/interfaces/gunder/1.0/default/
  4. -Lc++-impl -randroid.hardware:hardware/interfaces
  5. -randroid.hidl:system/libhidl/transport android.hardware.gunder@1.0


可以使用hidl-gen 查看帮助,如图1:

  

三、项目实例

1、在hardware/interfaces/目录下新建gunder/1.0目录,并在1.0目录中创建接口IGunder.hal。目录结构如下:

gunder@ubuntu-MX8:~ /IMX8_b0beta2/hardware/interfaces/gunder$ tree

└── 1.0

    └── IGunder.hal

IGunder.hal文件里面只有一个接口IGunder和一个方法helloWorld(string name),具体实现如下:

  1. package android.hardware.gunder@1.0;
  2.  
  3. interface IGunder{
  4.     helloWorld(string name) generates (string result);
  5. };
  6.  

  2、执行下面三条命令会自动生成对应的c++文件;

  1. PACKAGE=android.hardware.gunder@1.0
  2. LOC=hardware/interfaces/gunder/1.0/default/
  3. hidl-gen -o $LOC -Lc++-impl -randroid.hardware:hardware/interfaces
  4. -randroid.hidl:system/libhidl/transport $PACKAGE
  1. 参数说明:
  2. -L: 语言类型,包括c++, c++-headers, c++-sources, export-header, c++-impl,
  3. java, java-constants, vts, makefile, androidbp, androidbp-impl, hash等。
  4. hidl-gen可根据传入的语言类型产生不同的文件。
  5. fqname: 完全限定名称的输入文件。比如本例中android.hardware.gunder@1.0
  6. 要求在源码目录下必须有hardware/interfaces/ gunder /1.0/目录。
  7. 对于单个文件来说,格式如下:package@version::fileName,
  8. 比如android.hardware. gunder @1.0::types.Feature。
  9. 对于目录来说。格式如下package@version,
  10. 比如android.hardware. gunder @1.0
  11. -r: 格式package:path,可选,
  12. 对fqname对应的文件来说,用来指定包名和文件所在的目录到Android系统源码根目录的路径。
  13. 如果没有制定,前缀默认是:android.hardware,目录是Android源码的根目录。
  14. -o:存放hidl-gen产生的中间文件的路径。

 

执行命令后的目录结构如下:

  1. gunder@ubuntu-MX8:~ /IMX8_b0beta2$ PACKAGE=android.hardware.gunder@1.0
  2. gunder@ubuntu-MX8:~ /IMX8_b0beta2$ LOC=hardware/interfaces/gunder/1.0/default/
  3. gunder@ubuntu-MX8:~ /IMX8_b0beta2$ hidl-gen -o $LOC -Lc++-impl -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport $PACKAGE
  4. gunder@ubuntu-MX8:~ /IMX8_b0beta2/hardware/interfaces/gunder$ tree

└── 1.0

    ├── default

    │   ├── Gunder.cpp

    │   └── Gunder.h

    └── IGunder.hal

default 是新生成的目录,Gunder.cpp和Gunder.h是新生成的两个文件,打开Gunder.h文件,去掉// extern "C" IGunder* HIDL_FETCH_IGunder(const char* name);前面的注释,使用直通式HAL(Passthrough 模式)来通信。Gunder.h文件修改后如图2:

         

Gunder.cpp文件也要进行对应的修改,修改后如如图3:  

3、执行下面命令

  1. hidl-gen -o $LOC -Landroidbp-impl
  2. -randroid.hardware:hardware/interfaces
  3. -randroid.hidl:system/libhidl/transport $PACKAGE

会在hardware/interfaces/gunder/1.0/default目录生成Android.bp文件。

gunder@ubuntu-MX8:~ /IMX8_b0beta2/hardware/interfaces/gunder$ tree

└── 1.0

    ├── default

    │   ├── Android.bp

    │   ├── Gunder.cpp

    │   └── Gunder.h

└── IGunder.hal

4、然后使用脚本update-makefiles.sh来更新Makefile,自动在hardware/interfaces/gunder/1.0目录生成Android,mk和 Android.bp,hardware/interfaces/gunder目录生成Android.bp。命令如下

./hardware/interfaces/update-makefiles.sh

执行完命令后目录结构如下:

  1. gunder@ubuntu-MX8:~/IMX8_b0beta2$ ./hardware/interfaces/update-makefiles.sh
  2. gunder@ubuntu-MX8:~/IMX8_b0beta2/hardware/interfaces/gunder$ tree.

├── 1.0

│   ├── Android.bp

│   ├── Android.mk

│   ├── default

│   │   ├── Android.bp

│   │   ├── Gunder.cpp

│   │   └── Gunder.h

│   └── IGunder.hal

└── Android.bp

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

├── 1.0

│   ├── Android.bp

│   ├── Android.mk

│   ├── default

│   │   ├── Android.bp

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

│   │   ├── Gunder.cpp

│   │   ├── Gunder.h

│   │   └── service.cpp

│   └── IGunder.hal

└── Android.bp

android.hardware.gunder@1.0-service.rc的实现如图:

service.cpp的实现如图:

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

到此跟HAL相关的代码就实现完了。

6、编译生成服务端跟客户端要用各种库文件。首先执行下面两条命令

  1. ./hardware/interfaces/update-makefiles.sh
  2. mmm hardware/interfaces/gunder/1.0/

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

  1. out/target/product/mek_8q/system/lib64/android.hardware.gunder@1.0.so
  2. out/target/product/mek_8q/vendor/lib64/hw/android.hardware.gunder@1.0-impl.so
  3. out/target/product/mek_8q/vendor/etc/init/android.hardware.gunder@1.0-service.rc

7、在manifest文件里添加vendor接口的定义编译device/fsl/mek_8q/manifest.xml文件(不同厂家路径可能不一样),添加以下内容,不然在client端是没法拿到service的。如下:

8、使用C++实现客户端调用

在hardware/interfaces/gunder/1.0目录下新建test目录,并且在test目录下新建Android.bp跟GunderTest.cpp文件,这两个文件的内容如下:GunderTest.cpp:

Android.bp:

执行以下命令:

  1. /hardware/interfaces/update-makefiles.sh
  2. mmm hardware/interfaces/gunder/1.0/

执行第一条命令是为了更新hardware/interfaces/gunder/目录下的Android.bp文件,如下:

执行第二条命令会生成可执行文件:

out/target/product/mek_8q/vendor/bin/hw/gunder_client

9、使用JAVA实现客户端调用

 为了方便eclipse或者Android Studio调用接口函数,需要编译出classes.jar包。但是jack编译出来的文件是classes.jack。如图:

为了编译出classes.jar,需要打开hardware/interfaces/gunder/1.0目录的Android.mk,在include $(CLEAR_VARS)下面添加LOCAL_JACK_ENABLED := disabled。这样编译的时候就不走jack编译了。如下:

执行下面命令

mmm hardware/interfaces/gunder/1.0/

执行完后生成了classes.jar。如图:

新建Android项目HIDLdemo,将classes.jar导入项目,MainActivity代码实现如下:

添加Android.mk文件,然后将项目放到packages/apps/进行编译。Android.mk文件内容如下:

执行命令

mmm packages/apps/HIDLdemo


会生成out/target/product/mek_8q/system/app/HIDLdemo/HIDLdemo.apk

 10、测试客户端程序

  执行下列命令:

  1. adb push
  2. X:\IMX8_b0beta2\out\target\product\mek_8q\vendor\lib64
  3. \hw\android.hardware.gunder@1.0-impl.so  /vendor/lib64/hw
  4. adb push
  5. X:\IMX8_b0beta2\out\target\product\mek_8q\system\lib64
  6. \android.hardware.gunder@1.0.so /system/lib64
  7. adb push X:\IMX8_b0beta2\out\target\product\mek_8q\vendor\bin\hw
  8. \gunder_client /vendor/bin/hw
  9. adb push
  10. X:\IMX8_b0beta2\out\target\product\mek_8q\vendor\bin\hw
  11. \android.hardware.gunder@1.0-service /vendor/bin/hw
  12. adb push X:\IMX8_b0beta2\device\fsl\evk_8mq\manifest.xml /vendor
  13. adb install -r
  14. X:\IMX8_b0beta2\out\target\product\ mek_8q \system\app\HIDLdemo\HIDLdemo.apk

上面的命令是将需要的文件push到系统,方便调试。

C++客户端调试:

先启动./android.hardware.gunder@1.0-service服务,然后启动gunder_client程序,执行结果如下:

Android客户端执行:

  1. 先启动./android.hardware.gunder@1.0-service服务,然后通过命令拉起MainActivity界面
  2. adb shell am start -n com.example.ytkj.hidldemo/.MainActivity,执行结果如下:

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
  

闽ICP备14008679号