Android HIDL和hwservicemanager

news/2024/11/25 22:29:47/

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_32android::hardware::ProcessState::initWithMmapSize((size_t)(32768));
#endifreturn 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-serviceinterface android.hardware.light@2.0::ILight defaultclass haluser systemgroup system# shutting off lights while powering-offshutdown critical

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


http://www.ppmy.cn/news/6060.html

相关文章

布隆过滤器

1.概念 布隆过滤器是由布隆&#xff08;Burton Howard Bloom&#xff09;在1970年提出的 一种紧凑型的、比较巧妙的概率型数据结构&#xff0c;特点是高效地插入和查询&#xff0c;可以用来告诉你 “某样东西一定不存在或者可能存在”&#xff0c;它是用多个哈希函数&#xff…

Qt QCustomPlot 添加多个坐标系区域

Qt QCustomPlot 添加多个坐标系区域 文章目录Qt QCustomPlot 添加多个坐标系区域摘要1 新建多个坐标系QCPAxisQCPAxisRectQCPLayoutGrid2 多个坐标轴如何更新数据添加数据3 遇到的问题最后关键字&#xff1a; Debian、 Linux、 QCustomPlot、 Qt、 QCPAxisRect内容背景&#xf…

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

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

云原生之Dockerfile简介和基础实践

dockerfile简介和基础实践一、Dockerfile简介1.1、Dockerfile解决的问题1.2、docker build 构建流程1.3、关键字介绍二、Dockerfile 实践2.1、基本语法实践 --- golang问题检查2.2、基本语法实践 --- gcc总结后言一、Dockerfile简介 Dockerfile是一个创建镜像所有命令的文本文…

华为OD机试真题 Java 实现【分奖金】【2022.11 Q4 新题】

目录 题目 思路 考点 Code 题目 题目描述: 公司老板做了一笔大生意,想要给每位员工分配一些奖金,想通过游戏的方式来决定每个人分多少钱。按照员工的工号顺序,每个人随机抽取一个数字。按照工号的顺序往后排列,遇到第一个数字比自己数字大的,那么,前面的员工就可以获…

前端基础(十七)_HTML5新特性

HTML5新特性 1、在网页上绘制图形的canvas元素 原生JavaScriptcanvas实现五子棋游戏_值得一看 鼠标移动淡入淡出Canvas小球效果_TS版本 JS配合canvas实现贪吃蛇小游戏 canvas基础及太极图案例 2、多媒体相关video和audio元素 html5 video 音频标签: audio 标签 在IE8及更早版本…

SpringBoot:模块探究之spring-boot-devtools

Spring Boot 使我们能够快速设置和运行服务。为了进一步增强开发体验&#xff0c;Spring 发布了 spring-boot-devtools 工具——作为 Spring Boot-1.3 的一部分 spring-boot-devtools 是 Spring Boot 提供的一组开发工具&#xff0c;可以提高开发者的工作效率&#xff0c;开发者…

Simulink代码生成: Switch模块及其代码

本文描述Switch模块的建模并研究生成的代码。 文章目录1 Simulink中的Switch模块2 Switch模块建模及代码生成3 Switch模块其他用法3.1 多重Switch3.2 通过标定量Switch4 总结1 Simulink中的Switch模块 在Simulink中Switch模块时非常常见的&#xff0c;通常用于根据一定地条件选…