目录
2.1 使用update-api freeze-api管理接口版本
2.2 配置 Framework Compatibility Matrix (FCM,兼容性矩阵)
4.2 创建 hal_sensorscalibrate_default.te
5. java层调用service(含sepolicy配置)
欢迎指正交流,谢谢!
1. 定义新的AIDL接口
目标:将旧接口全部转换为新接口
验证目标:肉眼检查所有的接口文件已转换,即可
我们使用AOSP自带的转换工具:hidl2aidl,将旧版hidl接口转换为aidl接口。
1.1 编译hidl2aidl工具
编译可以在任意位置执行,这里以vendor根目录为例
source /opt/conf/openjdk18.conf
source build/envsetup.sh
lunch 项目名-userdebug
m hidl2aidl
1.2 执行转换
运行hidl2aidl工具。它会读取我们指定的hidl接口,并生成转换后的aidl。
在命令里,我们需要指定hidl包的所在位置,不然工具会找不到对应的hidl包。
hidl2aidl -o 输出路径 -r hidl包名:hidl包根目录(即/1.0的上层目录) hidl包名@要转换的hidl版本
其中的输出路径,我们创建一个aidl文件夹,此文件夹与hidl接口(1.0、2.0等文件夹)同级。冒号两侧不能有空格。
例如:
hidl2aidl -o vendorabcd/hardware/interfaces/sensorscalibrate/aidl/ -r vendorabcd.hardware.sensorscalibrate:vendorabcd/hardware/interfaces/sensorscalibrate vendorabcd.hardware.sensorscalibrate@1.0
1.3 调整编译规则(bp文件)
首先检查转换生成的文件。转换会生成 .aidl 和 Android.bp 两种文件。
检查所在路径,要与包名匹配。例如包名:vendorabcd.hardware.sensorscalibrate,文件路径应为: aidl/vendorabcd/hardware/sensorscalibrate/ISensorsCalibrate.aidl
生成的bp文件需要修改,示例如下:(红色部分为需要修改的部分)
aidl_interface {
name: "vendorabcd.hardware.sensorscalibrate",
vendor_available: true, //这里设置为true,因为是vendor目录下的模块
owner: "vendorabcd", //作为vendor模块,需要设定owner才可以通过编译
srcs: ["vendorabcd/hardware/sensorscalibrate/*.aidl"],
stability: "vintf", //标示此接口为Stable AIDL,必需
backend: {
cpp: {
enabled: false, //产生一个cpp backend,.cpp文件(unstable版)
//如果想要使用旧版unstable AIDL,设置为true
},
java: {
sdk_version: "module_current", //产生一个java backend,
//默认enabled,用来在framework层使用此接口
},
ndk: {
enabled: true, //产生一个ndk backend,.cpp文件(stable版)
//要使用aidl通信,需要ndk后端
//不允许使用vndk,因为它不是stable的
},
},
}
2. 向vendor镜像添加AIDL接口
目标:通过编译,编译生成vendor镜像,其中包含aidl接口
验证目标:out_hal/soong/.intermediates/system/tools/aidl/build/aidl_metadata_json/此目录下生成了对应的.aidl文件,并成功全编译
2.1 使用update-api freeze-api管理接口版本
AOSP要求我们使用此工具,用来管理接口版本。这个工具做的事情是:把我们写的接口复制一份,然后标上版本号,作为一个冻结的(stable的)版本。之后正式编译时,就自动使用它复制出来的版本。
进入aidl目录(即我们为hidl2aidl指定的output目录),执行以下命令:
source <项目位置>/build/envsetup.sh
lunch 项目名-userdebug
m vendorabcd.hardware.sensorscalibrate-update-api //复制现在的版本到aidl_api/current
m vendorabcd.hardware.sensorscalibrate-freeze-api //从current生成一个新的版本(号)
以上命令会生成一个叫aidl_api的目录,并在里面做各种修改。我们不要手动修改这个目录的内容。
以上命令还会在Android.bp中生成一个新的字段:versions: [“1”], 代表版本号。这一字段由api工具管理&修改,我们不要手动修改这个字段。
2.2 配置 Framework Compatibility Matrix (FCM,兼容性矩阵)
FCM指定了msi与vendor间的兼容关系。因此,对我们新定义的接口,需要在msi和vendor两个目录中,都配置FCM兼容关系。
FCM文件位置:
vendor/device/vendorabcd/<机型project名>(/……)/framework_compatibility_matrix.xml
在FCM文件中,我们可能会找到如下的旧版hidl配置:
<hal format="hidl" optional="true">
<name>vendorabcd.hardware.sensorscalibrate</name>
<version>1.0</version>
<interface>
<name>ISensorsCalibrate</name>