赞
踩
本文通过创建一个hidl服务,学习hidl-gen命令怎样使用,例子从网上摘抄的,不过有一些自己的理解。
首先再${ANDROID_BUILD_TOP}目录下source 和 lunch
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 所以该库就是该服务的通信代码动态库。
打开
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 ,所以这个动态库就是该服务的业务代码动态库。
在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",
],
}
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
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)
在test目录下新建Android.bp跟GunderTest.cpp文件
mmm hardware/interfaces/gunder/1.0/test 会生成gunder_client
#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的合体。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。