Android HAL Service开发总结

Android HAL Service开发总结:

1.需要针对自己的hwservice编写init.rc启动脚本 vendor.device.xxx_hwfunservice-1.1.rc

复制代码
service vendor.device.xxx_hwfunservice-1.1 /vendor/bin/hw/vendor.device.xxx_hwfun@1.1-service
        class hal
    user system
    group system
    setenv FUNC_CONFIGURATION /vendor/etc/hwfun/xxssyy.json

2.在自己service代码仓库的Android.bp中,添加自己hwservice的编译目标

复制代码
cc_binary {
    name: "vendor.device.hardware.hwfun@1.1-service",
    init_rc: ["vendor.device.xxx_hwfunservice-1.1.rc"],
    relative_install_path: "hw",   // 安装的相对路径(绝对路径是/vendor/bin/), /vendor/bin/hw/
    vendor: true,
    override:[
        "android.device.xxx_hwfunc@1.1-service",
        "android.device.xxx_hwfunc@1.0-service",   // 如果希望vendor的hwservice取代android自己原生的hwservice,则需要配置该项目
    ],
    srcs: [
        //用于编译该hwservice的源代码    
        "src/xxx.cpp",
        "src/yyy.cpp",
    ],
    include_dirs: [
        "include",
        "vendor/inc",
    ],
    static_libs: [
        "libexternal",
    ],
    }

3.为了让HWServiceManager知晓有我们创建的这么一个hwservice(vendor.device.xxx_hwfunservice-1.1),需要将我们HWService的信息注册到供应商清单文件中(manifests.xml)

清单文件一般放在Android项目根目录的device/{VENDOR}/{DEVICE}/目录下的manifests.xml文件中,添加的格式如下:

复制代码
 </hal>
    <hal format="hidl">
    <name>vendor.device.hardware.hwfun</name>
    <transport>hwbinder</transport>
    <version>1.1</version>
    <interface>
        <name>IHWFun</name>
        <instance>default</instance>
    </interface>
    <fqname>@1.0::IHWFun/default</fqname>
  </hal>

如果清单文件中没有我们HWService的信息,那么我们的HWSerice代码中向HWServcieManager注册我们的IHWFun这个HIDL接口会失败

注:HWService的信息可以放在evice/{VENDOR}/{DEVICE}/目录下的manifests.xml文件中,也可以在放在工程目录中单独的某个xml文件中,例如:vendor.device.xxx_hwfunservice-1.1.xml,里面的内容为

复制代码
<manifest version="1.0" type="device">
 </hal>
    <hal format="hidl">
    <name>vendor.device.hardware.hwfun</name>
    <transport>hwbinder</transport>
    <version>1.1</version>
    <interface>
        <name>IHWFun</name>
        <instance>default</instance>
    </interface>
    <fqname>@1.0::IHWFun/default</fqname>
  </hal>
</manifest>

然后在Android.bp中增加编译条目

vintf_fragments: ["vendor.device.xxx_hwfunservice-1.1.xml"],

4.Android9之后的版本,增加了FCM(Framework Compability Matrix),如果Android系统(例如Framework)用到了我们HWService的HIDL接口

那么我们的HWSerice信息也需要添加到 system FCM矩阵中(还有product FCM,如果product中的app用到了我们的HWService,那么Product的FCM文件中需要添加我们的HWService)

在编译期间,会检查供应商清单文件(manifests.xml)中的HIDL服务是否在FCM中,如果不存在,编译的时候会报错:

files are incompatible: The following instances are in the device manifest but not specified in framework compatibility matrix:

2024-05-22T10:46:07.164Z\] checkvintf E 05-22 10:46:00 3171190 3171190 check_vintf.cpp:620\] vendor.device.hardware.hwfun@1.0::IHWFun/default 如果我们的HWService是给Android的Framework使用,那么需要添加到framework_manifest.xml文件中 ,添加方式和供应商清单文件一样。 5.由于我们的HWService是自启动,并且也添加了init.rc,那么需要对应设置SELinux策略,一般是在vendor/目录下的某个file_contexts文件中添加 Android Selinux策略处理:[构建 SELinux 政策 \| Android Open Source Project](https://source.android.google.cn/docs/security/features/selinux/build?hl=zh-cn "构建 SELinux 政策  |  Android Open Source Project") Android FCM:[兼容性矩阵 \| Android Open Source Project](https://source.android.google.cn/docs/core/architecture/vintf/comp-matrices?hl=zh-cn "兼容性矩阵  |  Android Open Source Project")

相关推荐
hewence15 分钟前
Kotlin CoroutineContext 详解
android·开发语言·kotlin
Albert Edison26 分钟前
【Python】文件
android·服务器·python
大模型玩家七七1 小时前
效果评估:如何判断一个祝福 AI 是否“走心”
android·java·开发语言·网络·人工智能·batch
Aurora4191 小时前
Android事件分发逻辑--针对事件分发相关函数的讲解
android
似霰2 小时前
Android 日志系统4——logd 写日志过程分析一
android
youyoulg2 小时前
利用Android Studio编译Android上可直接执行的二进制
android·ide·android studio
闽农2 小时前
Android ANR 调用栈溯源
android·anr
似霰2 小时前
Android 日志系统7——Android 平台日志丢失问题分析
android·log
·云扬·3 小时前
MySQL Undo Log 深度解析:事务回滚与 MVCC 的底层支柱
android·数据库·mysql