Android HAL Service开发总结:
1.需要针对自己的hwservice编写init.rc启动脚本 vendor.device.xxx_hwfunservice-1.1.rc
service vendor.device.xxx_hwfunservice-1.1 /vendor/bin/hw/[email protected]
class hal
user system
group system
setenv FUNC_CONFIGURATION /vendor/etc/hwfun/xxssyy.json
2.在自己service代码仓库的Android.bp中,添加自己hwservice的编译目标
cc_binary {
name: "[email protected]",
init_rc: ["vendor.device.xxx_hwfunservice-1.1.rc"],
relative_install_path: "hw", // 安装的相对路径(绝对路径是/vendor/bin/), /vendor/bin/hw/
vendor: true,
override:[
"[email protected]",
"[email protected]", // 如果希望vendor的hwservice取代android自己原生的hwservice,则需要配置该项目
],
srcs: [
//用于编译该hwservice的源代码
"src/xxx.cpp",
"src/yyy.cpp",
],
include_dirs: [
"include",
"vendor/inc",
],
static_libs: [
"libexternal",
],
}
3.为了让HWServiceManager知晓有我们创建的这么一个hwservice(vendor.device.xxx_hwfunservice-1.1),需要将我们HWService的信息注册到供应商清单文件中(manifests.xml)
清单文件一般放在Android项目根目录的device/{VENDOR}/{DEVICE}/目录下的manifests.xml文件中,添加的格式如下:
</hal>
<hal format="hidl">
<name>vendor.device.hardware.hwfun</name>
<transport>hwbinder</transport>
<version>1.1</version>
<interface>
<name>IHWFun</name>
<instance>default</instance>
</interface>
<fqname>@1.0::IHWFun/default</fqname>
</hal>
如果清单文件中没有我们HWService的信息,那么我们的HWSerice代码中向HWServcieManager注册我们的IHWFun这个HIDL接口会失败
注:HWService的信息可以放在evice/{VENDOR}/{DEVICE}/目录下的manifests.xml文件中,也可以在放在工程目录中单独的某个xml文件中,例如:vendor.device.xxx_hwfunservice-1.1.xml,里面的内容为
<manifest version="1.0" type="device">
</hal>
<hal format="hidl">
<name>vendor.device.hardware.hwfun</name>
<transport>hwbinder</transport>
<version>1.1</version>
<interface>
<name>IHWFun</name>
<instance>default</instance>
</interface>
<fqname>@1.0::IHWFun/default</fqname>
</hal>
</manifest>
然后在Android.bp中增加编译条目
vintf_fragments: ["vendor.device.xxx_hwfunservice-1.1.xml"],
4.Android9之后的版本,增加了FCM(Framework Compability Matrix),如果Android系统(例如Framework)用到了我们HWService的HIDL接口
那么我们的HWSerice信息也需要添加到 system FCM矩阵中(还有product FCM,如果product中的app用到了我们的HWService,那么Product的FCM文件中需要添加我们的HWService)
在编译期间,会检查供应商清单文件(manifests.xml)中的HIDL服务是否在FCM中,如果不存在,编译的时候会报错:
files are incompatible: The following instances are in the device manifest but not specified in framework compatibility matrix:
2024-05-22T10:46:07.164Z\] checkvintf E 05-22 10:46:00 3171190 3171190 check_vintf.cpp:620\] [email protected]::IHWFun/default 如果我们的HWService是给Android的Framework使用,那么需要添加到framework_manifest.xml文件中 ,添加方式和供应商清单文件一样。 5.由于我们的HWService是自启动,并且也添加了init.rc,那么需要对应设置SELinux策略,一般是在vendor/目录下的某个file_contexts文件中添加 Android Selinux策略处理:[构建 SELinux 政策 \| Android Open Source Project](https://source.android.google.cn/docs/security/features/selinux/build?hl=zh-cn "构建 SELinux 政策 | Android Open Source Project") Android FCM:[兼容性矩阵 \| Android Open Source Project](https://source.android.google.cn/docs/core/architecture/vintf/comp-matrices?hl=zh-cn "兼容性矩阵 | Android Open Source Project")