Android HIDL和hwservicemanager

news2024/11/18 15:40:07

HIDL软件包


HIDL 接口软件包位于 hardware/interfaces 或 vendor/ 目录下(个别情况除外)。顶层 hardware/interfaces 会直接映射到 android.hardware 软件包命名空间;版本是软件包(而不是接口)命名空间下的子目录。

hidl-gen 编译器会将 .hal 文件编译成一组 .h 和 .cpp 文件。这些自动生成的文件可用来构建客户端/服务器实现链接到的共享库。用于构建此共享库的 Android.bp 文件由 hardware/interfaces/update-makefiles.sh 脚本自动生成。

每次将新软件包添加到 hardware/interfaces 或在现有软件包中添加/移除 .hal 文件时,都必须重新运行该脚本,以确保生成的共享库是最新的。

例如,IFoo.hal 示例文件应该位于 hardware/interfaces/samples/1.0 下。IFoo.hal 示例文件会在 samples 软件包中创建一个 IFoo 接口:

package android.hardware.samples@1.0;
interface IFoo {
    struct Foo {
       int64_t someValue;
       handle  myHandle;
    };

    someMethod() generates (vec<uint32_t>);
    anotherMethod(Foo foo) generates (int32_t ret);
};

生成的文件

HIDL 软件包中自动生成的文件会关联到与该软件包同名的单个共享库(例如 android.hardware.samples@1.0)。该共享库还会导出单个头文件 IFoo.h,它可以包含在客户端和服务器中。在 Binder 化模式下,使用 hidl-gen 编译器以 IFoo.hal 接口文件作为输入会自动生成以下文件:

在这里插入图片描述

上图由编译器生成的文件

  • IFoo.h 描述 C++ 类中的纯 IFoo 接口;它包含 IFoo.hal 文件中的 IFoo 接口中定义的方法和类型。该类的命名空间包含软件包名称和版本号,例如 ::android::hardware::samples::IFoo::V1_0。客户端和服务器都包含此头文件:客户端用它来调用方法,服务器用它来实现这些方法。
  • IHwFoo.h 一个头文件,包含用于对接口中使用的数据类型进行序列化的函数的声明。开发者不得直接包含此头文件(它不包含任何类)。
  • BpHwFoo.h 一个类,从 IFoo 继承而来,并描述接口的 HwBinder 代理(客户端)实现。开发者不得直接引用此类。
  • BnHwFoo.h 一个类,保持对 IFoo 实现的引用,并描述接口的 HwBinder 存根(服务器端)实现。开发者不得直接引用此类。
  • FooAll.cpp 一个类,包含 HwBinder 代理和 HwBinder 存根的实现。

关联到共享库

使用软件包中的任何接口的客户端或服务器必须在Android.mk或者Android.bp中包含该软件包的共享库:

  • Android.mk 中:

    LOCAL_SHARED_LIBRARIES += android.hardware.samples@1.0
    
  • Android.bp 中:

    shared_libs: [
        /* ... */
        "android.hardware.samples@1.0",
    ],
    

可能需要包含的其他库:

  • libhidlbase

    包含标准 HIDL 数据类型。从 Android 10 开始,此库还包含先前在 libhidltransport 和 libhwbinder 中的所有符号。

  • libhidltransport

    通过不同的 RPC/IPC 机制处理 HIDL 调用的传输。Android 10 弃用了此库。

  • libhwbinder

    Binder 专用符号。Android 10 弃用了此库。

  • libfmq

    快速消息队列 IPC。

hwservicemanager

注册接口实现时,hwservicemanager进程会按名称和版本号跟踪设备上正在运行的已注册 HIDL 接口,务器可以按名称注册 HIDL 接口实现,而客户端则可以按名称和版本号请求服务实现。

每个自动生成的 HIDL 接口头文件都有一个registerAsService() 方法,可用于向 hwservicemanager 注册接口实现。唯一一个必需的参数是接口实现的名称,因为稍后客户端将使用此名称从 hwservicemanager检索接口:

sp<IComponentStore> store;
store = new utils::ComponentStore(std::make_shared<StoreImpl>());
if (store == nullptr) {
    LOG(ERROR) << "Cannot create Codec2's IComponentStore service.";
} else {
    constexpr char const* serviceName = "default";
    if (store->registerAsService(serviceName) != OK) {
        LOG(ERROR) << "Cannot register Codec2's IComponentStore service";
    } else {
        LOG(DEBUG) << "Codec2's IComponentStore service registered. "
    }
}

hardware/google/interfaces/light/1.0/default/service.cpp

  android::sp<hwLight> light = new LightExt{
      android::hardware::light::V2_0::implementation::HIDL_FETCH_ILight(
          nullptr)};
  auto ret = light->registerAsService();
  if (ret != android::OK) {
    ALOGE("open light servie failed, ret=%d", ret);
    return 1;
  }

LSHAL

LSHAL 是一种设备端工具,可以列出向 hwservicemanager 注册的所有 HAL 以及设备上所有可用的直通实现(例如 android.hardware.foo@1.0-impl.so)。它还可以根据该列表生成设备清单文件:

$ lshal --init-vintf

service list过滤hardware关键字:

enus:/sdcard # service list | grep hardware
15      android.hardware.light.ILights/default: [android.hardware.light.ILights]
16      android.hardware.power.IPower/default: [android.hardware.power.IPower]
17      android.hardware.vibrator.IVibrator/default: [android.hardware.vibrator.IVibrator]
27      auth: [android.hardware.biometrics.IAuthService]
34      biometric: [android.hardware.biometrics.IBiometricService]
42      color_display: [android.hardware.display.IColorDisplayManager]
46      consumer_ir: [android.hardware.IConsumerIrService]
59      display: [android.hardware.display.IDisplayManager]
71      fingerprint: [android.hardware.fingerprint.IFingerprintService]
76      hardware_properties: [android.os.IHardwarePropertiesManager]
81      input: [android.hardware.input.IInputManager]
92      lights: [android.hardware.lights.ILightsManager]
100     media.camera: [android.hardware.ICameraService]
101     media.camera.proxy: [android.hardware.ICameraServiceProxy]
112     hui.cld.service: [hui.hardware.ICldManager]
168     sensor_privacy: [android.hardware.ISensorPrivacyManager]
170     serial: [android.hardware.ISerialManager]
205     usb: [android.hardware.usb.IUsbManager]

service list过滤media关键字:

1|shell:/sdcard # service list | grep media
26      audio: [android.media.IAudioService]
98      media.audio_flinger: [android.media.IAudioFlinger]
99      media.audio_policy: [android.media.IAudioPolicyService]
100     media.camera: [android.hardware.ICameraService]
101     media.camera.proxy: [android.hardware.ICameraServiceProxy]
102     media.extractor: [android.IMediaExtractorService]
103     media.metrics: [android.media.IMediaMetricsService]
104     media.player: [android.media.IMediaPlayerService]
105     media.resource_manager: [android.media.IResourceManagerService]
106     media_projection: [android.media.projection.IMediaProjectionManager]
107     media_resource_monitor: [android.media.IMediaResourceMonitor]
108     media_router: [android.media.IMediaRouterService]
109     media_session: [android.media.session.ISessionManager]
111     midi: [android.media.midi.IMidiManager]
178     soundtrigger_middleware: [android.media.soundtrigger_middleware.ISoundTriggerMiddlewareService]
207     vendor.audio.vrservice: [android.media.IVRAudioService]

lshal查看c2相关:

shell:/sdcard # lshal | grep c2
DM,FC    Y android.hardware.media.c2@1.0::IComponentStore/default                             N/A        N/A
DM,FM,FC Y android.hardware.media.c2@1.0::IComponentStore/softw                               N/A        N/A
FM       Y android.hardware.media.c2@1.1::IComponentStore/software                            N/A        N/A

疑问:lshal | grep light 为什么没有light?

可能和defaultPassthroughServiceImplementation有关,需要深入研究下,暂缓。

1|shell:/sdcard # service list | grep light
15      android.hardware.light.ILights/default: [android.hardware.light.ILights]
92      lights: [android.hardware.lights.ILightsManager]

light的rc文件和service的代码:

hardware/interfaces/light/2.0/default/service.cpp

int main() {
#ifdef ARCH_ARM_32
    android::hardware::ProcessState::initWithMmapSize((size_t)(32768));
#endif
    return defaultPassthroughServiceImplementation<ILight>();
}

hardware/interfaces/light/2.0/default/android.hardware.light@2.0-service-lazy.rc

service vendor.light-hal-2-0 /vendor/bin/hw/android.hardware.light@2.0-service
    interface android.hardware.light@2.0::ILight default
    class hal
    user system
    group system
    # shutting off lights while powering-off
    shutdown critical

defaultPassthroughServiceImplementation 将对提供的 -impl 库执行 dlopen() 操作,并将其作为 Binder 化服务提供。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/111154.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ALPHA项目的测试电机、性能信息和动态推力近似值数据库(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 按照电机试验的完整性&#xff0c;可以将电机试验分为型式试验、单项目或部分项目试验等&#xff1b;其中型式试验包括产品的性…

【深入浅出Spring原理及实战】「开发实战系列」SpringSecurity与JWT实现权限管控以及登录认证指南

SpringSecurity介绍 SpringSecurity是一个用于Java 企业级应用程序的安全框架&#xff0c;主要包含用户认证和用户授权两个方面&#xff0c;相比较Shiro而言&#xff0c;Security功能更加的强大&#xff0c;它可以很容易地扩展以满足更多安全控制方面的需求&#xff0c;但也相…

刷爆力扣之重复叠加字符串匹配

刷爆力扣之重复叠加字符串匹配 HELLO&#xff0c;各位看官大大好&#xff0c;我是阿呆 &#x1f648;&#x1f648;&#x1f648; 今天阿呆继续记录下力扣刷题过程&#xff0c;收录在专栏算法中 &#x1f61c;&#x1f61c;&#x1f61c; 该专栏按照不同类别标签进行刷题&…

leetcode10---动态规划

题目地址leetcode10 本题的解题思路 题目中的匹配是一个逐步匹配的过程&#xff0c;我们每次从字符串p中取一个字符出来&#xff0c;有两种可能&#xff0c;一种是取出来字母字符或者‘.’&#xff0c;另外一种是取出来[字符‘*’]组合&#xff0c;他可以在s中匹配任意自然数个…

Vulnhub靶机:LAMPSECURITY_ CTF5

目录介绍信息收集主机发现主机信息探测网站探测敏感信息泄露挂马提权敏感信息收集提权成功介绍 系列&#xff1a;LAMPSecurity&#xff08;此系列共5台&#xff09; 发布日期&#xff1a;2009年5月10日 难度&#xff1a;初 运行环境&#xff1a;VMware Workstation 目标&#…

Canvas学习记录

Canvas学习基本用法1.首先得有canvas元素2.获取渲染上下文3.检查浏览器支持性4.例子绘制图形1.矩形2. 绘制路径3. 移动笔触4. 绘制直线5. 圆弧二次贝塞尔曲线与三次贝塞尔曲线Path2D 对象创建Path2D对象Path2D.addPath()使用样式和颜色色彩Colors透明度 Transparency线型 Line …

oracle DML与DDL

一、数据库语言介绍 DML&#xff08;数据库操作语言&#xff09;&#xff1a;其中包括 insert/delete/update/select等操作。 DDL&#xff08;数据库定义语言&#xff09;&#xff1a;其中包括create/alter/drop等操作。 区别&#xff1a;1、DDL是针对数据库对象(例如&#…

【安全学习】apache通告中的漏洞描述

分析 漏洞描述 我们可以看看在apache通告中对漏洞的简单的描述 很明显&#xff0c;从这个漏洞描述中&#xff0c;我们能够明白这个CVE的造成主要是因为dubbo中内置的hessian项目&#xff0c;主要是因为在中的及以前版本中存在有这个漏洞hessian-lite3.2.12 来看看是因为哪里…

3. 请求

1. 请求映射路径 RequestMapping注解 名称&#xff1a;RequestMapping类型&#xff1a;方法注解 类注解位置&#xff1a;SpringMVC控制器方法定义上方作用&#xff1a;设置当前控制器方法请求访问路径&#xff0c;如果设置在类上统一设置当前控制器方法请求访问路径前缀范例 …

Matter理论介绍-通用-1-03:桥接器-数据结构

【源码、文档、软件、硬件、技术交流、技术支持&#xff0c;入口见文末】 【所有相关IDE、SDK和例程源码均可从群文件免费获取&#xff0c;免安装&#xff0c;解压即用】 持续更新中&#xff0c;欢迎关注&#xff01; 一、简介 Bridge&#xff08;桥接器&#xff09;存在的意…

springboot集成webstock实战:服务端数据推送数据到客户端实现实时刷新

背景 之前介绍过springboot集成webstock方式,具体参考: springboot集成websocket实战:站内消息实时推送 这里补充另外一个使用webstock的场景,方便其他同学理解和使用,废话不多说了,直接开始!简单介绍一下业务场景: 现在有一个投票活动,活动详情中会显示投票活动的参与人数…

【代码随想录】二刷-贪心算法

贪心算法 《代码随想录》 什么是贪心&#xff1f; 贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优。 贪心没有规定的套路。 刷题或面试的时候&#xff0c;手动模拟一下感觉可以局部最优退出整体最优&#xff0c;而且想不到反例&#xff0c;那么就试一试贪心。…

Python游戏开发之Dungeon Crawler 游戏源码大全

源码一 功能: WASD 移动 SPACE 攻击 SHIFT 使用楼梯 介绍 每个级别都包含一把钥匙和一个上锁的舱口。收集钥匙以解锁通往下一层的通道(SHIFT解锁)。 史莱姆造成的伤害最小,但每一层都会产生更多。他们可以降低健康或 XP。更多 XP = 每次攻击造成更多伤害。硬币目前没有…

OpenCV 读取、显示和保存图像

目录 一、OpenCV 读取图像 OpenCV 读取函数 参数&#xff1a; 二、OpenCV 显示图像 imshow函数 imshow函数功能 imshow函数原型 三、OpenCV 保存图像 四、结果和代码 一、OpenCV 读取图像 OpenCV 允许我们对图像执行多种操作&#xff0c;但要做到这一点&#xff0c;需…

云原生之使用Docker部署Python应用

云原生之使用Docker部署Python应用一、检查系统版本1.检查系统 版本2.检查系统内核二、检查docker状态三、编辑python文件1.创建目录2.编辑test.py文件四、构建镜像1.编辑dockerfile文件2.使用dockerfile构建镜像五、运行镜像容器1.运行python_app容器2.查看容器状态六、访问Py…

java大学校园饭卡管理系统饭卡查询系统饭卡挂失网站源码

springboot开发的大学生饭卡系统&#xff0c;学生可以登录该系统充值饭卡&#xff0c;挂失饭卡&#xff0c;取消挂失&#xff0c;查看自己的所有饭卡&#xff0c;以及发卡的充值记录。超级管理员拥有最大的权限&#xff0c;饭卡管理员可以添加饭卡信息&#xff0c;充值&#xf…

如何将敏捷开发与V模型深度融合?这家企业给出答案

随着汽车智能化的快速发展&#xff0c;消费者对智能汽车的需求正在发生变化&#xff0c;车企开始思考如何能快速满足消费者的这些需求。这也对汽车供应商提出更大挑战&#xff0c;Tier 1不仅应该具备提供相应高质量产品的量产能力&#xff0c;更要快速满足主机厂和用户对汽车智…

【MySQL基础教程】图形化界面工具介绍、安装与使用

前言 本文为 【MySQL基础教程】图形化界面工具介绍、安装与使用 相关介绍&#xff0c;下边将对图形化界面工具介绍&#xff0c;DataGrip的安装与DataGrip的使用进行详尽介绍~ &#x1f4cc;博主主页&#xff1a;小新要变强 的主页 &#x1f449;Java全栈学习路线可参考&#x…

八、Express框架 安装

对于Express框架的就不进行过多介绍&#xff0c;Express官方对该框架的定位是&#xff1a;"基于Node.js平台&#xff0c;快速、开放、极简的 Web 开发框架"&#xff0c;本篇开始记录关于 Node.js 轻量级Web开发框架 &#xff1a;Express框架&#xff0c;下面先进行Ex…

高可用架构和系统设计经验

导语 | 本文从研发规范层面、应用服务层面、存储层面、产品层面、运维部署层面、异常应急层面这六大层面去剖析一个高可用架构和系统需要有哪些关键的设计和考虑。 一、高可用系统架构设计思想 1-1、可用性和高可用概念 可用性是一个可以量化的指标&#xff0c;计算的公式在维…