先实现HIDL,打通从HAL到framework层
可以把自己的HIDL模块建立在hardware/interfaces/、frameworks/hardware/interfaces/、 system/hardware/interfaces/、 system/libhidl/transport/ 或者是vendor//proprietary/hardware/interfaces/等目录下。
建立HIDL目录:
$ mkdir -p hardware/interfaces/hidl_test/submodule_1/1.0/
那么这个HIDL的package name 应该是 android.hardware.hidl_test.submodule_1@1.0
建立HIDL方式的核心hal文件:
$ vi hardware/interfaces/hidl_test/submodule_1/1.0/IHidlTest.hal
package android.hardware.hidl_test.submodule_1@1.0;
interface IHidlTest {
justTest(string name) generates (string result, EnumHidlTest value);
justTest1(EnumHidlTest name);
};
$ vi hardware/interfaces/hidl_test/submodule_1/1.0/types.hal
package android.hardware.hidl_test.submodule_1@1.0;
@export(name=”EnumHidlTest”, value_prefix=””)
enum EnumHidlTest : uint8_t {
V_TEST1 = 0,
V_TEST2 = 1,
};
利用hidl-gen工具生成Android.bp、源代码等文件:
先编译一次全部的源码,然后hidl-gen就可以用了(生成在 out/host/linux-x86/bin/hidl-gen):
$ source build/envsetup.sh
$ lunch full_ac8257_demo-userdebug
$ hidl-gen -h
生成顶级目录下的Android.bp:
$ hardware/interfaces/update-makefiles.sh
其实调用的就是hidl-gen这个命令来执行的(-Landroidbp表示Generates Soong bp files for -Lc++-headers, -Lc++-sources, -Ljava, -Ljava-constants, and -Lc++-adapter) :
$ hidl-gen -O “” -Landroidbp -r android.hardware:hardware/interfaces -r android.hidl:system/libhidl/transport android.hardware.hidl_test.submodule_1@1.0;
查看下(因为上面hal里面有@export修饰符,所以这里gen_java_constants为true):
$ cat hardware/interfaces/hidl_test/submodule_1/1.0/Android.bp
// This file is autogenerated by hidl-gen -Landroidbp.
hidl_interface {
name: “android.hardware.hidl_test.submodule_1@1.0”,
root: “android.hardware”,
vndk: {
enabled: true,
},
srcs: [
“types.hal”,
“IHidlTest.hal”,
],
interfaces: [
“android.hidl.base@1.0”,
],
types: [
“EnumHidlTest”,
],
gen_java: true,
gen_java_constants: true,
}
在default子目录生成C++实现文件:
$ hidl-gen -O “” -Lc++-impl -o $ANDROID_BUILD_TOP/hardware/interfaces/hidl_test/submodule_1/1.0/default/ -r android.hardware:hardware/interfaces -r android.hidl:system/libhidl/transport android.hardware.hidl_test.submodule_1@1.0;
在default子目录生成Android.bp文件,以便后面对impl源文件编译:
$ hidl-gen -O “” -Landroidbp-impl -o $ANDROID_BUILD_TOP/hardware/interfaces/hidl_test/submodule_1/1.0/default/ -r android.hardware:hardware/interfaces -r android.hidl:system/libhidl/transport android.hardware.hidl_test.submodule_1@1.0;
$ ll hardware/interfaces/hidl_test/submodule_1/1.0/default/
-rw-r–r– 1 shuzhiang development 993 3月 25 10:35 Android.bp
-rw-r–r– 1 shuzhiang development 826 3月 25 10:34 HidlTest.cpp
-rw-r–r– 1 shuzhiang development 1376 3月 25 10:34 HidlTest.h
添加接口哈希值到current.txt:
$ hidl-gen -L hash -r android.hardware:hardware/interfaces -r android.hidl:system/libhidl/transport android.hardware.hidl_test.submodule_1@1.0::types
4b8c76bc9f7dbe48c357ad5b838dbf497bd0af9c3c0ee5a557b947794abe1cd7 android.hardware.hidl_test.submodule_1@1.0::types
把上面的输出结果添加到current.txt,加到最后即可:
$ vi hardware/interfaces/current.txt
…
4b8c76bc9f7dbe48c357ad5b838dbf497bd0af9c3c0ee5a557b947794abe1cd7 android.hardware.hidl_test.submodule_1@1.0::types
然后可以修改HidlTest.cpp来实现接口的函数:
切记:如果hal文件变更了,重新生成该代码时,会被覆盖掉,所以每次hal变更前把default目录mv一下,换个名字,等生成完了,再把老的代码手工移到新生成的文件里面。
$ vi hardware/interfaces/hidl_test/submodule_1/1.0/default/HidlTest.cpp
#define LOG_TAG “HidlTestImpl”
#include
#include “HidlTest.h”
namespace android {
namespace hardware {
namespace hidl_test {
namespace submodule_1 {
namespace V1_0 {
namespace implementation {
// Methods from ::android::hardware::hidl_test::submodule_1::V1_0::IHidlTest follow.
Return HidlTest::justTest(const hidl_string& name, justTest_cb _hidl_cb) {
// TODO implement
ALOGD(“justTest, name = %s”, name.c_str());
_hidl_cb(name, EnumHidlTest::V_TEST2);
ALOGD(“justTest end.”);
return Void();
}
Return HidlTest::justTest1(::android::hardware::hidl_test::