Android Aidl for hal开发案例

前言

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后的中间产物
    ]

你可能感兴趣的:(android,c++)