1、创建hal文件
hardware/interfaces/hidltest/1.0/ITest.hal
package android.hardware.hidltest@1.0;
interface ITest {
hello(string key) generates (int32_t result,string value);
};
2、生成对应的cpp文件
使用如下hidl命令:
hidl-gen -o hardware/interfaces/hidltest/1.0/default -Lc++-impl -randroid.hardware:hardware/interfaces android.hardware.hidltest@1.0
执行后生成如下Test.cpp,Test.h文件了
test@test:~/aosp/hardware/interfaces/hidltest$ tree
.
`-- 1.0
|-- ITest.hal
`-- default
|-- Test.cpp
`-- Test.h
2 directories, 3 files
3、生成编译hal实现代码 的Android.bp
命令:
hidl-gen -o hardware/interfaces/hidltest/1.0/default -Landroidbp-impl -randroid.hardware:hardware/interfaces android.hardware.hidltest@1.0
生成对于Android.bp
.
`-- 1.0
|-- ITest.hal
`-- default
|-- Android.bp
|-- Test.cpp
`-- Test.h
// FIXME: your file license if you have one
cc_library_shared {
name: "android.hardware.hidltest@1.0-impl",
relative_install_path: "hw",
// FIXME: this should be 'vendor: true' for modules that will eventually be
// on AOSP.
proprietary: true,
srcs: [
"Test.cpp",
],
shared_libs: [
"libhidlbase",
"libutils",
"android.hardware.hidltest@1.0",
],
}
4、生成一个自动生成 hal 接口的 Android.bp
.
只需要在hardware/interfaces执行如下命令既可以
test@test:~/aosp/hardware/interfaces$ ./update-makefiles.sh
`-- 1.0
|-- Android.bp ---自动生成的,目的是编译时候会自动把ITest.hal生成cpp
|-- ITest.hal
`-- default
|-- Android.bp ----编译cpp文件的bp
|-- Test.cpp
`-- Test.h
2 directories, 5 files
5、添加service.cpp,自启动rc,修改Android.bp
一般hal服务都需要开机自启动,需要有rc
service hidltest /vendor/bin/hw/android.hardware.hidltest@1.0-service
class hal
user system
group system
上面default默认生成的bp是so,这里要把他变成可执行的服务,需要增加一个service.cpp作为main方法载体
hardware/interfaces/hidltest/1.0/default/service.cpp
#define LOG_TAG "android.hardware.hidltest@1.0-service"
#include <hidl/HidlSupport.h>
#include <hidl/HidlTransportSupport.h>
#include "Test.h"
using ::android::OK;
using ::android::sp;
using ::android::hardware::configureRpcThreadpool;
using ::android::hardware::joinRpcThreadpool;
using ::android::hardware::hidltest::V1_0::ITest;
using ::android::hardware::hidltest::V1_0::implementation::Test;//注意这些导入的都是靠hal文件编译自动生成的
int main(int /* argc */, char* /* argv */ []) {
sp<ITest> hidltest = new Test;
configureRpcThreadpool(1, true /* will join */);
if (hidltest->registerAsService() != OK) {//注册为hwbinder的服务
ALOGE("Could not register service.");
return 1;
}
joinRpcThreadpool();
ALOGE("Service exited!");
return 1;
}
同时修改对于的bp文件如下:
hardware/interfaces/hidltest/1.0/default/Android.bp
cc_binary {
name: "android.hardware.hidltest@1.0-service",
relative_install_path: "hw",
proprietary: true,
init_rc: ["android.hardware.hidltest@1.0-service.rc"],
srcs: [
"Test.cpp",
"service.cpp"
],
shared_libs: [
"libhidlbase",
"libhidltransport",
"libutils",
"liblog",
"android.hardware.hidltest@1.0",
],
}
6、需要搞个test,来测试一下服务是否ok,这个时候需要
在1.0 目录创建test文件夹
分别创建如下文件:
`-- test
|-- Android.bp
`-- HidlTest.cpp
Android.bp内容如下:
cc_binary {
name: "HidlTestClient",
//vendor: true,
srcs: ["HidlTest.cpp"],
shared_libs: [
"liblog",
"libhardware",
"libhidlbase",
"libhidltransport",
"libutils",
"android.hardware.hidltest@1.0",
],
}
HidlTest.cpp内容如下:
#include <android/hardware/hidltest/1.0/ITest.h>
#include <hidl/Status.h>
#include <utils/misc.h>
#include <hidl/HidlSupport.h>
#include <stdio.h>
#include <string>
using namespace std;
using ::android::hardware::hidl_string;
using ::android::sp;
using ::android::hardware::hidltest::V1_0::ITest;
int main(){
android::sp<ITest> service = ITest::getService();
if (service == nullptr){
printf("Failed to get service\n");
return -1;
}
service->hello("hello", [&](int32_t result,string value){
printf("result %d %s\n",result, value.c_str());
});
return 0;
}
7.再次执行hardware/interfaces/update-makefiles.sh
只需要在hardware/interfaces执行如下命令既可以
test@test:~/aosp/hardware/interfaces$ ./update-makefiles.sh
主要目的是把test目录的Android.bp可以加入编译
test@test:/media/test/49a0eb6b-f410-4eed-9e0a-952e3c75d2b2/home/test/android-8.1.0_r1$ cat hardware/interfaces/hidltest/Android.bp
// This is an autogenerated file, do not edit.
subdirs = [
"1.0",
"1.0/default",
"1.0/test",
]
"1.0/test"就是新加入的,不加入编译会报错始终找不到目标
8、配置注册到manifest.xml中
需要在自己设备目录找到自己的manifest.xml然后加入自己的hidl
device/generic/goldfish/manifest.xml
<hal format="hidl">
<name>android.hardware.hidltest</name>
<transport>hwbinder</transport>
<version>1.0</version>
<interface>
<name>ITest</name>
<instance>default</instance>
</interface>
9、selinux相关适配
这个相对比较复杂一点
10、测试验证
检查是否hidltest服务自启动进程运行着
generic_x86_64:/ # ps -A | grep hidltest
system 1381 1 12276 4152 binder_thread_read 7eab08d0c2b7 S android.hardware.hidltest@1.0-service
检测到确实有运hidltest行
检测一下是否有system可以与其正常通讯
generic_x86_64:/ # /system/bin/HidlTestClient
result 1 test ok
可以看到有正常返回正确的值
本文章对应视频手把手教你学framework:
https://mp.weixin.qq.com/s/LbVLnu1udqExHVKxd74ILg
私聊作者+v(androidframework007)
点击这里 https://mp.weixin.qq.com/s/Qv8zjgQ0CkalKmvi8tMGaw
视频:https://www.bilibili.com/video/BV1Jg4y1C7fw/