Android Aidl for hal开发案例

2024-04-27 1216阅读

前言

Android 11 引入了在 Android 中将 AIDL 用于 HAL 的功能。这使得在没有 HIDL 的情况下实现部分 Android 成为可能。尽可能将 HAL 转换为专门使用 AIDL。
适用于HAL的AIDL

Android Aidl for hal开发案例
(图片来源网络,侵删)

一、实现步骤

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,则加到这个文件里。

    
        vendor.XXX.hal.get3dofdata
        
            IGet3dofData
            default
         
    

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后的中间产物
    ]
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]