HAL: 将 HIDL 接口改造为 Stable AIDL

目录

1. 定义新的AIDL接口

1.1 编译hidl2aidl工具

1.2 执行转换

1.3 调整编译规则(bp文件)

2. 向vendor镜像添加AIDL接口

2.1 使用update-api freeze-api管理接口版本

2.2 配置 Framework Compatibility Matrix (FCM,兼容性矩阵)

2.3 配置使AIDL编译

2章报错速查

3. 实现service

3.1 编写service代码

3.2 创建service编译规则

3.3 将service添加进系统

3章报错速查

4. 确保service开机启动

4.0 开始配置SEpolicy

4.1 添加新feature目录

4.2 创建 hal_sensorscalibrate_default.te

4.3 创建 file_contexts

4.1 无法启动时的排查方法

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.02.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 两种文件。

.aidl文件

        检查所在路径,要与包名匹配。例如包名:vendorabcd.hardware.sensorscalibrate,文件路径应为: aidl/vendorabcd/hardware/sensorscalibrate/ISensorsCalibrate.aidl

Android.bp文件

        生成的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兼容关系。

vendor目录中

        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>

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值