品牌 资讯 搭配 材料 时尚 热点 行业 首饰 玉石 行情

Android Q 打通应用层到 HAL 层--( HAL 模块实现)|微动态

2023-03-06 23:40:57 来源:程序员客栈

从这篇文章开始准备研究应用层到HAL层的一整套流程,目标是写一个APP调用HAL的一个函数,在AOSP源码环境下进行开发,大概流程是:APP---->Framework service---->native----->HAL

什么是HAL

HAL全称Hardware Abstract Layer,硬件抽象层,它向下屏蔽了硬件的实现细节,向上提供了抽象接口,HAL是底层硬件和上层框架直接的接口,框架层通过HAL可以操作硬件设备,HAL的实现在用户空间


【资料图】

为什么需要HAL

我们知道Android是基于Linux进行开发的,传统的Linux对硬件的操作基本上都是在内核中,而Android把对硬件的操作分为了两部分,HAL和内核驱动,HAL实现在用户空间,驱动在内核空间,这是因为Linux内核中的代码是需要开源的。

如果把对硬件的操作放在内核这会损害硬件厂商的利益,因为这是别人厂商的商业机密,而现在有了HAL层位于用户空间,硬件厂商就可以将自己的核心算法之类的放在HAL层,保护了自己的利益,这样Android系统才能得到更多厂商的支持

HAL实现的一般规则

每种硬件都对应了一个HAL模块,要向实现自己的HAL,必须满足HAL的相关规则,规则定义在源码hardward目录下,头文件hardward.h,C文件hardward.c hardward.h中定义了三个重要的结构体:

structhw_module_t;structhw_module_methods_t;structhw_device_t;

其实HAL的实现使用了C中结构体继承的技巧,当然这种继承并不是真正意义的继承,而是一种结构体强制转换,我们可以理解为继承

结构体hw_module_t代表HAL模块,自己定义的HAL模块必须包含一个自定义struct,且必须”继承” hw_module_t(即第一个变量必须为 hw_module_t),且模块的tag必须指定为HARDWARE_MODULE_TAG,代表这是HAL模块的结构体

结构体hw_module_methods_t代表模块的操作方法列表,它内部只有一个函数指针open,用来打开该模块下的设备

结构体hw_device_t代表该模块下的设备,自己定义的HAL模块必须包含一个结构体,且必须“继承” hw_device_t(即第一个变量必须为hw_device_t)

每个自定义HAL模块还有一个模块名和N个设备名(标识模块下的设备个数,一个模块可以有多个设备),

最后这个模块定义好之后还必须导出符号HAL_MODULE_INFO_SYM,指向这个模块,HAL_MODULE_INFO_SYM定义在hardware.h中值为“HMI”

接下来就手动实现一个HAL模块,这个HAL提供一个加法函数 首先在hardware/libhardware/include/hardware目录下创建hello.h文件

#include#include#include//HAL模块名#defineHELLO_HARDWARE_MODULE_ID"hello"//HAL版本号#defineHELLO_MODULE_API_VERSION_1_0HARDWARE_MODULE_API_VERSION(0,1)//设备名#defineHARDWARE_HELLO"hello"//自定义HAL模块结构体typedefstructhello_module{structhw_module_tcommon;}hello_module_t;//自定义HAL设备结构体typedefstructhello_device{structhw_device_tcommon;//加法函数int(*additionTest)(conststructhello_device*dev,inta,intb,int*total);}hello_device_t;//给外部调用提供打开设备的函数staticinlineint_hello_open(conststructhw_module_t*module,hello_device_t**device){returnmodule->methods->open(module,HARDWARE_HELLO,(structhw_device_t**)device);}

我们可以看到在hello.h中自定义了两个结构体,分别继承hw_module_t和hw_device_t且在第一个变量,满足前面说的规则,另外定义在device结构体中的函数的第一个参数也必须是device结构体

接着在hardware/libhardware/modules/目录下创建一个hello的文件夹,里面包含一个hello.c和Android.bp,我们来看hello.c文件

#defineLOG_TAG"HelloHal"#include#include#include#include#include#include//加法函数实现staticintadditionTest(conststructhello_device*dev,inta,intb,int*total){if(!dev){return-1;}*total=a+b;return0;}//关闭设备函数staticinthello_close(hw_device_t*dev){if(dev){free(dev);return0;}else{return-1;}}//打开设备函数staticinthello_open(consthw_module_t*module,constchar__unused*id,hw_device_t**device){if(device==NULL){ALOGE("NULLdeviceonopen");return-1;}hello_device_t*dev=malloc(sizeof(hello_device_t));memset(dev,0,sizeof(hello_device_t));dev->common.tag=HARDWARE_DEVICE_TAG;dev->common.version=HELLO_MODULE_API_VERSION_1_0;dev->common.module=(structhw_module_t*)module;dev->common.close=hello_close;dev->additionTest=additionTest;*device=&(dev->common);return0;}staticstructhw_module_methods_thello_module_methods={.open=hello_open,};//导出符号HAL_MODULE_INFO_SYM,指向自定义模块hello_module_tHAL_MODULE_INFO_SYM={.common={.tag=HARDWARE_MODULE_TAG,.module_api_version=HELLO_MODULE_API_VERSION_1_0,.hal_api_version=HARDWARE_HAL_API_VERSION,.id=HELLO_HARDWARE_MODULE_ID,.name="DemoHelloHAL",.author="dongjiao.tang@tcl.com",.methods=&hello_module_methods,},};

前面我们说过,要想自定义的HAL模块被外部使用需要导出符号HAL_MODULE_INFO_SYM,导出的这个模块结构体最重要的其实就是tag,id和methods,tag必须定义为HARDWARE_MODULE_TAG,id就是在hello.h中定义的模块名。

methods指向hello_module_methods地址,hello_module_methods指向结构体hw_module_methods_t,它里面的open函数指针作用是打开模块下的设备,它指向hello_open函数

hello_open

staticinthello_open(consthw_module_t*module,constchar__unused*id,hw_device_t**device){if(device==NULL){ALOGE("NULLdeviceonopen");return-1;}hello_device_t*dev=malloc(sizeof(hello_device_t));memset(dev,0,sizeof(hello_device_t));dev->common.tag=HARDWARE_DEVICE_TAG;dev->common.version=HELLO_MODULE_API_VERSION_1_0;dev->common.module=(structhw_module_t*)module;dev->common.close=hello_close;dev->additionTest=additionTest;*device=&(dev->common);return0;}

其实hello_open函数也很简单,就是创建一个hello_device_t结构体,这是我们自定义HAL模块下的设备结构体,然后给这个结构体赋值,我们定义的加法函数additionTest赋值给设备结构体的函数指针,外部就可以使用。

因为这个HAL模块导出了符号HAL_MODULE_INFO_SYM,所以我们能通过模块id找到这个HAL模块,有了模块之后就可以调用它的hello_open函数打开设备,hello_open接收三个参数,module代表这个HAL模块,id代表要打开的是这个模块下哪一个设备,最后一个参数是一个二级指针,其实是我们自定义设备结构体指针的地址,传个地址过来就可以给这个设备结构体赋值。

这样最简单的一个HAL模块就定义好了,它仅仅提供了一个加法函数,对于Android.bp如下:最终编译成一个共享lib库

cc_library_shared{name:"hello.default",relative_install_path:"hw",proprietary:true,srcs:["hello.c"],header_libs:["libhardware_headers"],shared_libs:["liblog"],}

我们在根目录执行如下命令来编译一下:

mmmhardware/libhardware/modules/hello/

编译成功后生成了一个hello.default.so共享lib库

hello.default.so

我们将这个so库push进手机/system/lib64路径下,接着需要写一个简单测试程序来测一下

我们在HAL模块目录下再创建一个test目录,test目录下创建一个HelloTest.cpp测试文件和一个Android.bp文件,目录结构如下:

在这里插入图片描述
HelloTest.cpp源码如下:

#include#include#include#defineTAG"HelloHal"intmain(){hello_device_t*hello_device=NULL;consthello_module_t*module=NULL;intret=hw_get_module(HELLO_HARDWARE_MODULE_ID,(conststructhw_module_t**)&module);if(!ret){ret=_hello_open((conststructhw_module_t*)module,&hello_device);}if(ret<0){ALOGD("gethello-halfailed.......");return-1;}inttotal=0;hello_device->additionTest(hello_device,3,5,&total);ALOGD("successstarthello-hal....total=%d",total);return0;}

通过hardware.c提供的hw_get_module函数,传递模块名获取对应的HAL模块,接着调用我们自定义的_hello_open函数通过获取到的模块打开设备,获取到设备之后,我们调用定义在设备结构体中的加法函数

Android.bp定义如下:

cc_binary{name:"hello_hal",srcs:["HelloTest.cpp"],shared_libs:["liblog","libhardware",],}

这个test会被编译成二进制可执行文件:hello_hal

在这里插入图片描述

我们将这个可执行文件push进手机system/bin目录,然后执行

在这里插入图片描述

可以看到log已经成功打印:

在这里插入图片描述
到此我们最简单的HAL就已经实现了,这个HAL并不设计底层驱动,实际开发中自己可以在设备结构体中定义函数访问底层硬件。

后续文章会接着写从native层通过HIDL访问HAL,以及framework层通过JNI访问native层,以及通过应用层APK通过AIDL访问framework层,打通应用层到HAL层的整个开发框架。

原文链接: https://blog.csdn.net/qq_34211365/article/details/105492973

标签: 插入图片 可执行文件 一个模块

(责任编辑:)

相关文章

Android Q 打通应用层到 HAL 层--( HAL 模块实现)|微动态

​从这篇文章开始准备研究应用层到HAL层的一整套流程,目标是写一个APP调用HAL的一个函数,在AOSP源码环境下进行开发,大概流程是:APP--Framewor

2023-03-06 23:40:57

DNF25c有哪些职业

​男鬼:剑魂、鬼泣、天帝;女鬼剑士:暗帝;男神抢手:蛋药;女神抢手:蛋药、漫游;男法师:雪法师、风法;女法师:魔道、召唤;守护者:黑曜

2023-03-06 23:19:04

高温漆

​1、高温漆是一种能长期或短期内在高温表面工作的保护,具有普通油漆不具备的优良耐热性。2、最为常用的高温漆种类要数有机硅元

2023-03-06 20:29:05

新资讯:焦三牛考察甘肃泛植制药有限公司

​焦三牛考察甘肃泛植制药有限公司

2023-03-06 20:25:54

技术人员的激励方案,最常见的三大误区。-焦点热门

​技术人员的激励方案,最常见的三大误区。第一、对技术人员无需做太多的激励设计。技术人员一般固定工资比较高,要强调收入的稳定性,所以不要

2023-03-06 17:52:03

中村由利佳_中村由利

​今天小编宋丹来为大家解答以上的问题。中村由利佳,中村由利相信很多小伙伴还不知道,现在让我们一起来看看吧!1、姓名:中村由

2023-03-06 16:00:11

往期回顾:灰熊主帅莫兰特没有回归时间表 詹金斯莫兰特不仅肩负着球队的重任对这座城市也是如此-环球关注

​一、灰熊主帅莫兰特没有回归时间表詹金斯表示灰熊很重视这件事,莫兰特没有回归的时间表,但不愿透露双方谈话的细节。同时,詹金斯透露最重要

2023-03-06 13:51:59

山东省高考艺考都考哪些

​山东省艺考科目如下:1、根据艺术类专业属性不同,山东省2018年普通高等学校艺术类专业招生划分为美术类、音乐类、书法类、舞蹈类、摄影类、播

2023-03-06 14:09:09

因水而兴,两河交汇孕育“明珠水城”

​聊城,生于黄河、兴于运河,是现今黄河与大运河交汇的唯一城市。如今,聊城正将“运河文化”作为激活城市发展的新引擎,探索“江

2023-03-06 11:50:15

观点:亲爱的姑娘我爱你男声_亲爱的姑娘我爱你原唱

​1、歌曲:亲爱的姑娘我爱你歌手:索朗扎西长长的头发,黑黑的眼睛好象在什么地方见过你,山上的格桑花开的好美丽,我要摘一朵

2023-03-06 10:55:48

美国冬季风暴相关死亡人数上升至13人

​据美媒当地时间3月5日报道,美国冬季风暴相关死亡人数已上升至13人。此外受风暴造成的影响,从肯塔基州到密歇根州有将近50万人仍受到断电影响

2023-03-06 09:57:14

热资讯!巴西的官方语言是西班牙语吗_巴西的官方语言是什么

​1、巴西官方语言是:巴西葡萄牙语,通用西班牙语。2、巴西把葡萄牙语作为巴西语言的原因,是因为最早的时候它就是葡萄牙的殖民

2023-03-06 07:38:27

动态焦点:苹果手机白苹果是什么意思

​1、所谓白苹果,就是当用户开机后。设备可能卡在这个白苹果的Logo界面,一动也不动,这就是俗称的白苹果现象;2、造成这种现象的因素有很多,

2023-03-06 07:18:24

日平均气温如何计算_日平均气温怎么算

​1、通常有2种计算方法:日最高和最低气温平均或4个定时气温平均(就是当地的2时、8时、14时、20时分别测量出的气温相加

2023-03-06 01:57:59

现在去天津要隔离吗 天津疫情最新出入天津政策

​最近国内多地出现疫情,天津也出现了新增病例,马上就要到元旦了,不少人想要去天津出差或旅游,那么现在去天津要隔离吗?现在去天津需要什么

2023-03-05 23:39:55

今日播报!《卧龙苍天陨落》可以跨平台联机吗介绍

​卧龙苍天陨落是一款非常特别的游戏,游戏中的所有元素都是在其他游戏中见不到的,所以想要在这款游戏中畅快的玩下去,那么就必须要知道《卧龙

2023-03-05 21:07:15

怎么定位别人的手机位置

​定位别人的手机位置的方法是:1、首先如果是双方都带着手机,可以使用微信、QQ等其他软件发送定位或者进行实时定位就可以获取对方的位置了。2

2023-03-05 20:29:56

今日卡塔尔对中国足球_国足战卡塔尔-天天观速讯

​1、第一个目标冯潇霆在前面插球引导进攻。2、进攻受阻后,蒿俊闵控制登陆点,发起左翼攻势。3、在任航的传球被阻挡后,张希哲

2023-03-05 17:48:31

DNF生命之水_dnf 生命之泉怎么得 有什么用 全球时讯

​1、是本次国服更新之后非常重要的一件物品,玩家要想获得迷你宠物,就必须要有生命之泉,下面我们一起来看详细的获得方法介绍。

2023-03-05 17:27:22

【环球新要闻】贴门神的寓意和象征是什么_贴门神的讲究

​你们好,最近小活发现有诸多的小伙伴们对于贴门神的寓意和象征是什么,贴门神的讲究这个问题都颇为感兴趣的,今天小活为大家梳理

2023-03-05 14:55:03

流莺李商隐原文

​1、《流莺》【作者】李商隐【朝代】唐流莺漂荡复参差,渡陌临流不自持。巧啭岂能无本意,良辰未必有佳期。风朝露夜阴晴里,万户千门开闭时。曾

2023-03-05 14:07:48

环球资讯:头部ct多少钱一次_头部核磁共振多少钱一次

​1、病情分析:磁共振检查对脑部病变有非常高的应用价值。2、头部磁共振的价格需要根据检查的目的、磁共振仪器的清晰度以及当地

2023-03-05 10:58:37

热点在线丨“圣王”的想象与实践

​1、《“圣王”的想象与实践》是上海人民出版社出版的图书,作者是张星久文章到此就分享结束,希望对大家有所帮助。

2023-03-05 10:49:32

早知道|NBA调查莫兰特涉枪事件

​早知道|NBA调查莫兰特涉枪事件,巴斯,迈克,怀特,nba,佛罗伦萨,切尔西队,涉枪事件,美国篮球,贾·莫兰特,孟菲斯灰熊队

2023-03-05 08:55:49

【世界播资讯】0生万物

​1、《0生万物》是一部由云关秋所著书籍,北京时代华文书局出版发行。文章到此就分享结束,希望对大家有所帮助。

2023-03-04 23:17:22

代表委员这一天丨两会来了

​2023年全国两会如期而至。今年是全面贯彻落实党的二十大精神的开局之年,在这个充满希望的春天,新一届全国人大代表和全国政协委员齐聚一堂,

2023-03-04 22:36:16

全国人大代表吴国平:建议民宿尽快落地评级标准

​全国人大代表吴国平建议推动乡村民宿品牌化、集约化发展,“游客去住民宿不能像开盲盒一样”。吴国平说,乡村民宿良莠不齐,存在同质化竞争...

2023-03-04 15:35:07

“生命·实践”教育学论丛 第2辑:立场 环球关注

​1、《“生命·实践”教育学论丛(第2辑):立场》是2008年3月广西师范大学出版社出版的图书。2、作者是叶澜。文章到

2023-03-04 13:13:37

网店代理内衣_网店代理 环球最新

​1、网店代理是指某些提供网上批发服务的网站或者能提供批发货源的销售商,与想做网店代销的人达成协议,为其提供商品图片等数据

2023-03-04 11:39:40

支票与期票的区别是什么_支票和期票有哪些区别 全球速递

​意义不同。支票就是平时的银行支票,可以用来提现金或转账。期票就是由单位向银行申请,由银行开具的“银行存兑汇票”,是有期限

2023-03-04 11:04:04