android中hw_get_module函数分析

Android应用程序访问linux驱动第二步:实现并测试hardware层 不管是出于什么样地考虑,android系统终究是提供了hardware层来封装了对Linux的驱动的访问,同时为上层提供了一个统一的硬件接口和硬件形态。一.Hardware概述在Hardware层中的一个模块中,主要设计一下三个结构: struct hw_module_t struct hw_module_methods_t struct hw_device_t 这三个结构体的关系是这样的:我们在 阅读详情

这个函数的主要功能是根据模块ID寻找硬件模块动态链接库德地址,然后调用load去打开动态链接库并从中获取硬件模块结构体地址。具体的源码如下:

代码@/hardware/libhardware/hardware.c

int hw_get_module(const char *id, const struct hw_module_t **module)

120 {

121     int status;

122     int i;

123     const struct hw_module_t *hmi = NULL;

124     char prop[PATH_MAX];

125     char path[PATH_MAX];

    /* Loop through the configuration variants looking for a module */

135     for (i=0 ; i<HAL_VARIANT_KEYS_COUNT+1 ; i++) {

/*

*这个地方我们来看一下下面将要用到的一个数组variant_keys,因为HAL_VARIANT_KEYS_COUNT这个就是

*数组variant_keys的大小。

*

*44 static const char *variant_keys[] = {

* 45     "ro.hardware",  /* This goes first so that it can pick up a different

* 46                        file on the emulator. */

* 47     "ro.product.board",

* 48     "ro.board.platform",

*  49     "ro.arch"

* 50 };

*这里我们记住这个数组,下面我就将用到它。 

*/

136         if (i < HAL_VARIANT_KEYS_COUNT) {

137             if (property_get(variant_keys[i], prop, NULL) == 0) {

138                 continue;

139             }

/*

*这个地方prop得到的就似乎相应的权限,variant_keys[i]对应的如下:

*

*trout\msm7k\ARMV6就是这三个值,那个ro.hardware没有找到。这个地方我也是看注册的,没有弄懂

*知道的同学指教一些,谢谢。

*/

140             snprintf(path, sizeof(path), "%s/%s.%s.so",//把相应的路径及文件名保存到path中

141                     HAL_LIBRARY_PATH, id, prop);

/*

*看到没有,这个地方其实就是把HAL_LIBRARY_PATH/id.***.so保存到path中,其中***就是上面我们所分析的variant_keys各个元素所对应的值。

*/

142         } else {

/*

*这个地方就体现了为什么我们上面for循环用的是HAL_VARIANT_KEYS_COUNT+1而不是*HAL_VARIANT_KEYS_COUNT。因为我们在最后还有加载一个default的属性。

*/

143             snprintf(path, sizeof(path), "%s/%s.default.so",

144                     HAL_LIBRARY_PATH, id);

145         }

146         if (access(path, R_OK)) {

147             continue;

148         }

149         /* we found a library matching this id/variant */

150         break;

151     }

152

153     status = -ENOENT;

154     if (i < HAL_VARIANT_KEYS_COUNT+1) {

155         /* load the module, if this fails, we're doomed, and we should not try

156          * to load a different variant. */

157         status = load(id, path, module);//load相应库。并把它们的HMI保存到module中。//具体见西分析

158     }

159

  return status;

161 }

 

代码@/hardware/libhardware/hardware.c

这个代码其实很简单。load相应库。并把它们的HMI保存到module中

0 static int load(const char *id,

 61         const char *path,

 62         const struct hw_module_t **pHmi)

 63 {

 64     int status;

 65     void *handle;

 66     struct hw_module_t *hmi;

   handle = dlopen(path, RTLD_NOW);//打开相应的库

 74     if (handle == NULL) {

 75         char const *err_str = dlerror();

 76         LOGE("load: module=%s\n%s", path, err_str?err_str:"unknown");

 77         status = -EINVAL;

 78         goto done;

 79     }

 

 82     const char *sym = HAL_MODULE_INFO_SYM_AS_STR;

 83     hmi = (struct hw_module_t *)dlsym(handle, sym);//找到库中的HMI函数的地址(据snownight0102说,HMI不是一个函数,我还不是很清楚,等待解释)

 84     if (hmi == NULL) {

 85         LOGE("load: couldn't find symbol %s", sym);

 86         status = -EINVAL;

 87         goto done;

 88     }

 89

 90     /* Check that the id matches */

 91     if (strcmp(id, hmi->id) != 0) {//只是一个check

 92         LOGE("load: id=%s != hmi->id=%s", id, hmi->id);

 93         status = -EINVAL;

 94         goto done;

 95     }

 96

 97     hmi->dso = handle;

 98

 99     /* success */

100     status = 0;

    done:

103     if (status != 0) {

104         hmi = NULL;

105         if (handle != NULL) {

106             dlclose(handle);

107             handle = NULL;

108         }

109     } else {

110         LOGV("loaded HAL id=%s path=%s hmi=%p handle=%p",

111                 id, path, *pHmi, handle);

112     }

113

114     *pHmi = hmi;//把这个返回过去

115

116     return status;

117 }

Android Camera 流程学习记录(三)—— Camera hw_get_module() 相关逻辑 这一篇笔记,我们将从 hw_get_module() 函数入手,去探究 Libraries 层是如何调用 HAL 层的库中的函数的。 CameraService 是在开机时就会启动的,而当它第一次启动时,就会调用一个名为 onFirstRef() 的成员函数,我们所要探究的内容就是从这里开始的。 阅读详情

相关推荐

安卓HAL层 so库文件加载原理

本文分析代码基于安卓6.0 上层app通过jni调用hal层的hw_get_module函数获取硬件模块,这个函数是上层与hal打交道的入口 这里我们就具体来看看hw_get_module的实现 文件路径: vim hardware/libhardware/hardware.c 打开该文件会发现,这个文件非常小,只有200多行 首先找到hw_get_module() in

guodaye5200的博客 2936

HAL 详解之 hardware 详解

  文章出处:http://blog.youkuaiyun.com/shift_wwx/article/details/54969612 请转载的朋友标明出处~~   前言: 《Android 系统HAL 简介》一文和《Android,在争议中逃离 Linux 内核的 GPL 约束》中对HAL 做了简单的简介,这一文中对HAL 进行详细的分析。     android HAL 主要框架来源于:...

私房菜 7639

告别玄学调试:手把手教你用Logcat和源码分析Android 10音频HAL的初始化与设备打开

本文深入解析Android 10音频HAL的初始化与设备打开过程,提供从Logcat日志分析到HAL层源码追踪的完整调试技术链。通过实战案例和源码剖析,帮助开发者解决音频模块加载失败、函数指针空指针等常见问题,提升Android音频系统调试效率。

weixin_42570296的博客 304

【Android系统】hardware.c Android硬件抽象层的代码结构

hw_get_module() ---> hw_module_by_class(id, null, module) //这个里面主要是检查system和vendor的lib64/hw目录下是否有so文件 //如果有so文件就调用load //参数是模块ID,system/lib64/hw/name.subname.so, struct hw_module_t**pHmi --->load(cla.

John_chaos的博客 1342

【Unity】Spine动态换装进阶:SkeletonGraphic插槽级皮肤切换与内存优化

本文深入探讨了Unity中Spine动态换装的进阶技术,重点解析了SkeletonGraphic插槽级皮肤切换的实现原理与内存优化策略。通过代码示例展示了如何高效管理皮肤实例、避免内存泄漏,并提供了对象池、纹理合并等性能优化方案,帮助开发者提升2D角色换装系统的运行效率与稳定性。

food6的博客 196

拼多多/Temu反爬参数逆向踩坑记:从浏览器调试到补环境完整复盘

本文详细解析了拼多多/Temu反爬参数`anti_content`的逆向工程实战,从浏览器调试到补环境完整复盘。通过JavaScript逆向技术,拆解关键函数定位、反混淆算法还原及补环境技术应用,帮助开发者突破电商平台复杂反爬系统,提升数据采集效率。

weixin_33978722的博客 912

Android HAL层hardware module的设计

Android为了屏蔽硬件的复杂性,设计了一个HAL层,HardwareAbstarct Layer,即硬件抽象层。HAL层位于驱动和framework之间,为各个硬件厂家提供的形形色色的驱动模块规定了统一的接口。在Android里面,这些接口是用c语言描述的,而在c语言中,接口都是用函数指针来描述的。所以我们在这些接口模块中看到大量函数指针,下面的驱动去实现这些接口,并挂载到这些接口模块上。

Walk More Slowly 1784

实战演练:用wvp-GB28181-pro + ZLMediaKit搭建一个可用的国标视频监控测试环境(附设备模拟器对接)

本文详细介绍了如何使用wvp-GB28181-pro和ZLMediaKit在Ubuntu系统上搭建GB28181视频监控测试环境。从环境准备、组件解析到核心服务部署与设备模拟器对接,提供完整的实战指南,帮助开发者快速构建可验证的监控系统。

weixin_42692935的博客 579

Android--hw_get_module解析

作者:苗老师,华清远见嵌入式学院讲师。 我们知道,google为了保护硬件厂商的信息,在Android中添加了一层,也就是大名鼎鼎的HAL层。 在看HAL的编写方法的过程中,会发现整个模块貌似没有一个入口。一般说来模块都要有个入口,比如应用程序有main函数,可以为加载器进行加载执行,dll文件有dllmain,而对于我们自己写的动态链接库,我们可以对库中导出的任何符号进行调用。 问题来了,

farsightliuht的专栏 919

YOLOv11多模态融合实战:基于YOLOFuse的RGB与红外线(IR)协同检测技术解析

本文深入解析了YOLOv11多模态融合技术,重点介绍基于YOLOFuse框架的RGB与红外线(IR)协同检测方法。通过动态权重分配、跨模态特征对齐等创新设计,实现在低光照等复杂环境下的高精度目标检测,mAP提升高达37%。文章包含实战案例、训练技巧和部署方案,为计算机视觉开发者提供完整的多模态融合解决方案。

weixin_29038345的博客 290

Spyglass功耗分析:从RTL到优化的全流程实践

本文详细介绍了在RTL设计阶段使用Spyglass进行早期功耗分析的全流程实践。通过一个真实项目案例,阐述了早期功耗分析的必要性,并手把手指导了从文件准备、GUI操作到报告解读与优化的完整步骤。文章重点说明了如何利用Spyglass实现功耗分析的“左移”,在编码阶段识别和修复功耗热点,从而避免后期高昂的修改成本,是低功耗芯片设计的关键技能。

purple的博客 1115

Android中hw_get_module函数分析

该函数定义在hardware/libhardware/hardware.c文件中,定义如下:int hw_get_module(const char *id, const struct hw_module_t **module) { return hw_get_module_by_class(id, NULL, module); } hw_get_module()函数利用HAL层注册信息i...

编程菜鸟进阶之路 7817

使用 MATLAB/Simulink + Simscape Electrical 来构建一个CCHP微电网与新能源协同运行的模型

随着能源需求的增长和对环境保护要求的提高,冷热电联供(Combined Cooling, Heating and Power, CCHP)系统作为一种高效的分布式能源解决方案,越来越受到关注。CCHP系统通过利用一次能源同时产生电力、制冷和供热,实现了能源的梯级利用,提高了能源使用效率。结合太阳能、风能等可再生能源,可以进一步增强系统的灵活性和环保性。本文将详细介绍如何使用来构建一个CCHP微电网与新能源协同运行的模型,并通过仿真分析其性能表现。本文介绍了如何使用构建一个。

xiaoheshang_123的博客 141

Android架构分析之硬件抽象层(HAL)

作者:刘昊昱  博客:http://blog.youkuaiyun.com/liuhaoyutz Android版本:2.3.7_r1 Linux内核版本:android-goldfish-2.6.29   一、硬件抽象层核心数据结构 Android硬件抽象层有三个核心数据结构,分别是hw_module_t , hw_module_methods_t, hw_device_t。定义在hardwa

Linux/Android开发记录 1万+

巡检类机器人电池容量计算方法论(原理+算法+真实案例)

摘要:本文系统阐述了巡检机器人电池容量的计算方法,重点解析了;能量平衡;核心原理和三种主流算法。通过光伏电站履带式巡检机器人的真实案例,详细演示了从工况拆解、功耗采集到容量计算的完整流程。文章指出:室内轻载场景可采用静态平均功耗法,户外常规工况推荐动态负载积分法,而复杂环境需采用融合估算算法。特别强调需考虑温度修正(冬季容量衰减20%)、冗余系数(1.2-1.5)和放电深度(磷酸铁锂DoD取80%)等关键参数。

start_up_go的博客 241

ZY1-02D (ZY1E)多光谱数据预处理

资源一号02D卫星(5米光学卫星)于2019年9月12日成功发射,卫星搭载的两台相机,可有效获取115公里幅宽的9谱段多光谱数据以及60公里幅宽的166谱段高光谱数据,其中全色谱段分辨率可达2.5米、 多光谱为10米、高光谱优于30米,高光谱载荷可见近红外和短波红外光谱分辨率分别达到10纳米和20纳米。

热爱分享,热爱记录 4822

android hardware.c 源码分析

android的jni通过ID来找hal模块,使用了hw_get_module()函数,本文就通过这个函数的来分析一下hal层的模块是如何匹配的。 首先要了解三个结构体hw_module_t,hw_module_methods_t,hw_device_t。 结构体定义的源码位于:hardware/libhardware/include/hardware/hardware.h typedef str...

weixin_34221773的博客 193

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Android硬件抽象层(HAL)深入剖析(三)

前面分析了android HAL层是如何搜索硬件模块的动态共享库的,其实就是在"system/lib/hw/"或者"/vendor/lib/hw/"这两个路径下找到共享库modueid.variant.so后,通过调用load函数加载库。 下面我们进入load函数,看看具体是如何实现加载共享库的。 以下为load函数定义,同样在/hardware/libhardware/hardware.c中...

疾风剑豪 290

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Qcom_Sensor(二)--- 之 Android Native到HAL源码剖析

Qcom_Sensor(二 )--- 之 Android Native到HAL源码剖析一、SensorService启动二、hw_get_module2.1课外知识—ELF文件格式:三、QualComm Sensor HAL总结 Google为了保护硬件厂商的信息,在Android中添加了一层,它就是大名鼎鼎的HAL层。 在看HAL的编写方法的过程中,会发现整个模块貌似没有一个入口。一般说来模块...

|~~~热爱生活、努力学习的小伙汁~~~| 2060

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

android volume设置 代码分析

volume设置,跳过binder部分(binder独立理解)

shi_xin的专栏 4780

[Android 基础] -- Android 硬件抽象层(HAL)输入剖析(二)

hal

u014674293的博客 458

Android 5.0 Camera系统源码分析(1):CameraService启动流程

1. 前言 本文将分析Android系统源码,从frameworks层到hal层,暂不涉及app层和kernel层。由于某些函数比较复杂,在贴出代码时会适当对其进行简化。本文属于自己对源码的总结,仅仅是贯穿代码流程,不会深入分析各个细节。 分析android系统源码,需要对android系统的某些知识点有所了解 涉及的知识点有: (1)Android系统的智

建建的博客 689

Android硬件抽象层(HAL)深入剖析(二)

上一篇我们分析了android HAL层的主要的两个结构体hw_module_t(硬件模块)和hw_device_t(硬件设备)的成员,下面我们来具体看看上层app到底是怎么实现操作硬件的? 我们知道,一些硬件厂商不愿意将自己的一些核心代码开放出去,所以将这些代码放到HAL层,但是怎么保证它不开放呢?HAL层代码不是也让大家知道下载吗?其实硬件厂商的HAL核心代码是以共享库的形式出现的,每次在需...

疾风剑豪 283

Android R camera Hal启动(下)

文章目录前言代码流程分析总结 前言 接上一篇Android R camera Hal启动(上)接着写,把谷歌的代码都分析完成,高通/MTK的代码就不贴了。 代码流程分析 上一篇说到getProviderImpl函数。实例化了CameraProvider对象,先看CameraProvider的构造函数。 template<typename IMPL> struct CameraProvider : public ICameraProvider { CameraProvider() :

weixin_53065050的博客 893

android gps tty,Gps HAL层分析

1.Android 6.0源码中Gps HAL层代码分析我们知道gps在HAL层是库的方式存在的,它的库的名称是gps.default.so,我们可以根据这个命令来查找find –name Android.mk –exec grep –l “gps.default” {} \;,我们获取的文件的路径在如下位置:fspad-733-6.0/androidM/device/softwinner/com...

weixin_39672979的博客 773
上一篇: Android中HAL如何向上层提供接口总结-hw_device_t
下一篇: C 语言的若干问题(持续更新中)
计算机与认知
博客等级 码龄14年 31粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值