前言
Android 11 引入了在 Android 中将 AIDL 用于 HAL 的功能。这使得在没有 HIDL 的情况下实现部分 Android 成为可能。尽可能将 HAL 转换为专门使用 AIDL。
适用于HAL的AIDL
一、实现步骤
1、相关配置文件编写
在进行代逻辑码编写之前,需要进行一些相关的配置文件的编写
主要实现以下文件:
- Aidl文件
- aidl_interface 的Android.bp文件
- 将模块添加到兼容性矩阵中
接口aidl文件
首先我们需要的就是定义好aidl接口文件,最好先考虑清楚需要实现哪些接口以及接口的入参、返回值等。
本案例下我们的代码目录为/vendor/XXX/interfaces/get3dofdata
在该目录下创建aidl文件夹。
在aidl文件夹下创建/vendor/XXX/hal/get3dofdata文件夹,并在该文件夹下创建aidl接口文件
// FIXME: license file if you have one
package vendor.XXX.hal.get3dofdata;
import vendor.XXX.hal.get3dofdata.IThreeDofCbHal;
import vendor.XXX.hal.get3dofdata.FmqNativeHandle;
@VintfStability
interface IGet3dofDataHal {
int register3dofFusion(IThreeDofCbHal callback);
int unregister3dofFusion(IThreeDofCbHal callback);
FmqNativeHandle getHandle();
void setThreadScheduler(int tid, int policy, int pri);
}
aidl文件中必须要有@VintfStability
aidl_interface 的Android.bp文件
在aidl文件夹下创建Android.bp文件,用于编译该aidl接口文件
aidl_interface {
name: "vendor.XXX.hal.get3dofdata",
vendor_available: true,
srcs: ["vendor/XXX/hal/get3dofdata/*.aidl"],
stability: "vintf",
backend: {
cpp: {
enabled: true,
},
java: {
enabled: false,
},
ndk: {
enabled: true,
},
},
versions: ["1"],//这一行是编译时自动生成的,编写时不需要添加
}
aidl文件编写完成之后,运行如下命令
//复制现在的版本到aidl_api/current
m vendor.XXX.hal.get3dofdata-update-api
该命令会在代码/vendor/XXX/interfaces/get3dofdata/aidl目录中生成/aidl_api/vendor.XXX.hal.get3dofdata/current目录,内包含了aidl文件。
再运行如下命令
//从current生成一个新的版本(号)
m vendor.XXX.hal.get3dofdata-freeze-api
会生成/aidl_api/vendor.XXX.hal.get3dofdata/1目录,内包含了aidl文件。同时会在aidl的Android.bp文件中自动添加versions: [“1”],的字段。
如果在开发时要修改aidl文件,则修改后删除current、1的目录,删除bp中versions: [“1”],的字段。再执行update-api 和freeze-api 的命令。
之后在/vendor/XXX/interfaces/get3dofdata下执行mm进行编译,因为我们定义了接口文件,所以一些代码逻辑系统会帮我们实现,这一步就是根据aidl接口文件来编译产生中间文件。
如果之前已经实现了main.cpp以及头文件,源文件的话,则先注释掉对应的Android.bp再进行mm编译,否则会编译不过。
将模块添加到兼容性矩阵中
一般情况下添加到以下文件中
#(选下标最新的那个)
hardware/interfaces/compatibility_matrices/compatibility_matrix.5.xml
#这个不一定有,如果没有就不加)
hardware/interfaces/compatibility_matrices/compatibility_matrix.current.xml
如果有自定义的该文件vendor_framework_compatibility_matrix.xml,则加到这个文件里。
<hal format="aidl" optional="true">
<name>vendor.XXX.hal.get3dofdata</name>
<interface>
<name>IGet3dofData</name>
<instance>default</instance>
</interface>
</hal>
2、接口编码实现
之后开始编码实现aidl的相关接口,主要实现以下文件:
- Android.bp
- main.cpp //服务启动入口
- vendor.XXX.hal.get3dofdata-service.rc //服务启动rc文件
- vendor.XXX.hal.get3dofdata-service.xml
- Get3dofDataHal.cpp //aidl接口实现
Android.bp
首先在aidl文件夹下创建default目录,该目录下主要包含接口实现的头文件以及源文件,在其中添加Android.bp文件
cc_binary {
name: "vendor.XXX.hal.get3dofdata-service",
vendor: true,
relative_install_path: "hw",
init_rc: ["vendor.XXX.hal.get3dofdata-service.rc"],
vintf_fragments: ["vendor.XXX.hal.get3dofdata-service.xml"],
srcs: [
"Get3dofData.cpp",
"main.cpp",
],
cflags: [
"-Wall",
"-Werror",
],
header_libs: [
"libget3dofdata_listener_headers",
],
shared_libs: [
"libbase",
"liblog",
"libhardware",
"libbinder_ndk",
"libbinder",
"libutils",
"libget3dofdata",
"vendor.XXX.hal.get3dofdata-ndk_platform",//这个是编译aidl_interface后的中间产物
]