Android应用开发之Android HAL层模块的加载过程
凌雪 2018-11-29 来源 :网络 阅读 748 评论 0

摘要:本文将带你了解Android应用开发之Android HAL层模块的加载过程,希望本文对大家学Android有所帮助。

本文将带你了解Android应用开发之Android HAL层模块的加载过程,希望本文对大家学Android有所帮助。


一、概述
    HAL层是Android系统架构里介于Linux内核和系统运行库层之间的一个层,个人认为这个层存在的目的主要是为了避免GPL协议所带来的开源问题。Android系统会统一加载硬件抽象层模块,负责加载硬件抽象层模块的函数是hw_get_module函数。
二、hw_get_module
    1、hw_get_module原型
在Android硬件抽象层中,负责加载硬件抽象层模块的函数是hw_get_module,当调用者需要加载这些模块时,只要指定它们的ID值就可以了。它的原型如下:
    /**2  * Get the module info associated with a module by id.3  *   @return: 0 == success, <0 == error and *pHmi == NULL4  */5 int   hw_get_module(const char *id, const struct hw_module_t   **module){    return hw_get_module_by_class(id,NULL,module);}
    它有id和module两个参数。
    id:输入参数,表示要加载的硬件抽象层模块ID; module:输出参数,如果加载成功,则它指向一个自定义的硬件抽象层模块结构体。 返回值:是一个整数,如果等于0,则表示加载成功;如果小于0,则表示加载失败。
    2、hw_get_module函数的实现
该函数在Android源码位置如下:
    hardware/libhardware/hardware.c
    具体实现如下(可跳过不看):
 /** Base path of the hal modules   */02 #define HAL_LIBRARY_PATH1 "/system/lib/hw"03 #define HAL_LIBR   ARY_PATH2 "/vendor/lib/hw"0405 static const char *variant_keys[] =   {06     "ro.hardware",  /* This goes first   so that it can pick up a   different07                          file on the emulator. */08       "ro.product.board",09       "ro.board.platform",10       "ro.arch"11 };1213 static const int HAL_VARIANT_KEYS_COUNT   =14     (sizeof(variant_keys)/sizeof(variant_keys[0]));1516   int hw_get_module(const ch ar *id, const struct hw_module_t **module)17   {18     int status;19     int   i;20     const struct hw_module_t *hmi = NULL;21       char prop[PATH_MAX];22     char   path[PATH_MAX];2324       /*25      * Here we rely on the fact that calling   dlopen multiple times on26      * the same .so will   simply increment a refcount (and not load27      * a   new copy of the library).28      * We also assume   that dlopen() is thread-safe.29        */3031     /* Loop through the configuration variants   looking for a module */32     for (i=0 ;   i<hal_variant_keys_count+1 33="" i="" if=""   pre=""><p>前面提到,硬件抽象层模块文件实际上是一个动态链接库文件,即so文件。因此,第14行<strong>调用dlopen函数将它加载到内存中</strong>。加载完成这个动态链接库文件之后,第24行就调用dlsym函数来获得里面名称为HAL_MODULE_INFO_SYM_AS_STR的符号。这个HAL_MODULE_INFO_SYM_AS_STR符号指向的是一个自定义的硬件抽象层模块结构体,也就是<strong>获取了对应的硬件抽象层模块的所有信息</strong>。AL_MODULE_INFO_SYM_AS_STR是一个宏,它的值定义为“HMI”。根据硬件抽象层模块的编写规范,每一个硬件抽象层模块都必须包含一个名称为“HMI”的符号,而且这个符号的第一个成员变量的类型必须定义为hw_module_t,因此,第24行可以安全地将模块中的HMI符号转换为一个hw_module_t结构体指针。获得了这个hw_module_t结构体指针之后,第32行调用strcmp函数来<strong>验证加载得到的硬件抽象层模块ID是否与所要求加载的硬件抽象层模块ID一致</strong>。如果不一致,就说明出错了,函数返回一个错误值-EINVAL。最后,第38行<strong>将成功加载后得到的模块句柄值handle保存在hw_module_t结构体指针hmi的成员变量dso中,然后将它返回给调用者</strong>。</p><p>至此,HAL层的一个模块加载完毕。</p><h1 id="四小结">四、小结</h1><p>硬件抽象层加载一个模块无非就是:</p>调用者传目标模块的ID参数到加载函数 。 获取目标模块的存储路径。 检查该路径下是否有该模块的.so文件。 加载模块至内存。 将句柄返回给调用者。</hal_variant_keys_count+1>    

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!

本文由 @凌雪 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程