Android HAL层,即硬件抽象层,是Google响应厂家“希望不公开源码”的要求推出的新概念
1,源代码和目标位置
源代码: /hardware/libhardware目录,该目录的目录结构如下:
/hardware/libhardware/hardware.c编译成libhardware.so,目标位置为/system/lib目录
/hardware/libhardware/include/hardware目录下包含如下头文件:
hardware.h 通用硬件模块头文件
copybit.h copybit模块头文件
gralloc.h gralloc模块头文件
lights.h 背光模块头文件
overlay.h overlay模块头文件
qemud.h qemud模块头文件
sensors.h 传感器模块头文件
/hardware/libhardware/modules目录下定义了很多硬件模块
这些硬件模块都编译成xxx.xxx.so,目标位置为/system/lib/hw目录

2,HAL层的实现方式
JNI->通用硬件模块->硬件模块->内核驱动接口
具体一点:JNI->libhardware.so->xxx.xxx.so->kernel
具体来说:android frameworks中JNI调用/hardware/libhardware/hardware.c中定义的hw_get_module函数来获取硬件模块,
然后调用硬件模块中的方法,硬件模块中的方法直接调用内核接口完成相关功能

3,通用硬件模块(libhardware.so)
(1)头文件为:/hardware/libhardware/include/hardware/hardware.h
头文件中主要定义了通用硬件模块结构体hw_module_t,声明了JNI调用的接口函数hw_get_module
hw_module_t定义如下:
typedef struct hw_module_t {
/* tag must be initialized to HARDWARE_MODULE_TAG /
uint32_t tag;

/** major version number for the module */
uint16_t version_major;/** minor version number of the module */
uint16_t version_minor;/** Identifier of module */
const char *id;/** Name of this module */
const char *name;/** Author/owner/implementor of the module */
const char *author;/** Modules methods */
struct hw_module_methods_t* methods; //硬件模块的方法/** module's dso */
void* dso;/** padding to 128 bytes, reserved for future use */
uint32_t reserved[32-7];

} hw_module_t;
硬件模块方法结构体hw_module_methods_t定义如下:
typedef struct hw_module_methods_t {
/* Open a specific device /
int (open)(const struct hw_module_t module, const char* id,
struct hw_device_t** device);

} hw_module_methods_t;
只定义了一个open方法,其中调用的设备结构体参数hw_device_t定义如下:
typedef struct hw_device_t {
/* tag must be initialized to HARDWARE_DEVICE_TAG /
uint32_t tag;

/** version number for hw_device_t */
uint32_t version;/** reference to the module this device belongs to */
struct hw_module_t* module;/** padding reserved for future use */
uint32_t reserved[12];/** Close this device */
int (*close)(struct hw_device_t* device);

} hw_device_t;
hw_get_module函数声明如下:
int hw_get_module(const char *id, const struct hw_module_t **module);
参数id为模块标识,定义在/hardware/libhardware/include/hardware目录下的硬件模块头文件中,
参数module是硬件模块地址,定义了/hardware/libhardware/include/hardware/hardware.h中

(2)hardware.c中主要是定义了hw_get_module函数如下:

#define HAL_LIBRARY_PATH "/system/lib/hw"

static const char *variant_keys[] = {
“ro.hardware”,
“ro.product.board”,
“ro.board.platform”,
“ro.arch”
};
static const int HAL_VARIANT_KEYS_COUNT =
(sizeof(variant_keys)/sizeof(variant_keys[0]));

int hw_get_module(const char *id, const struct hw_module_t **module)
{
int status;
int i;
const struct hw_module_t *hmi = NULL;
char prop[PATH_MAX];
char path[PATH_MAX];
for (i=0 ; i

#define HAL_MODULE_INFO_SYM         HMI
#define HAL_MODULE_INFO_SYM_AS_STR  "HMI"

4,硬件模块
硬件模块的开发主要是完成/hardware/libhardware/include/hardware目录下对应的头文件中的内容,主要是硬件模块头文件和hardware.h中
的结构体中定义了一些函数指针,调用内核提供的接口将具体的函数实现,然后编译成指定名称的动态链接库放到/system/lib/hw目录下即可。
用一句话来概括:硬件模块的开发就是定义一个hardware.h中定义的hw_module_t结构体,结构体名称为宏HAL_MODULE_INFO_SYM,然后实现结构体
的相关内容即可。

5,内核驱动
主要是要向用户层开放接口,让硬件模块和内核可以交互。

android系统开发(六)-HAL层开发基础相关推荐

  1. Android 系统(191)---ODM 开发用户常见需求文档(九)

    Android 系统(191)---ODM 开发用户常见需求文档(九) 阅读数:1122 一:去除摄像头的假对焦框 (vendor/) (mediatek/proprietary/packages/a ...

  2. android系统应用的平台化开发

    android系统应用的平台化开发,一种开发思路,旨在方便平台开发. 在android操作系统中,源码编译生成app,加入带系统签名的app,这些应用都带有系统权限,统一放在了system/app或者 ...

  3. Android系统 linux内核按键驱动开发

    Android系统 linux内核按键驱动开发 前言 刚入门的小白,在csdn的帮助下完成了第一个按键驱动,特写此文记录学习并分享给有需要的人. 1.修改设备树.dts 我是用的开发板是rp-rk32 ...

  4. 在Ubuntu上为Android系统的Application Frameworks层增加硬件访问服务(老罗学习笔记5)...

    在数字科技日新月异的今天,软件和硬件的完美结合,造就了智能移动设备的流行.今天大家对iOS和Android系统的趋之若鹜,一定程度上是由于这两个系统上有着丰富多彩的各种应用软件.因此,软件和硬件的关系 ...

  5. android调频收音机代码,android 收音机 FM 驱动 hal层 框架层以及应用层代码

    [实例简介] android 收音机 FM 驱动 hal层 框架层以及应用层代码 方法一 不需要framework部分 1.fm放到 \hardware\rk2x 2.FmRadio 放到 packa ...

  6. Android11 HAL层开发

    最近在搞Android11,拉起hal服务的时候报错了,一直崩. 首先,Android11不能使用直通式HAL的写法了,会报以下的错误: LegacySupport: Could not get pa ...

  7. android 打印机服务,Android系统打印服务插件printservice开发

    一 简介 从Android4.4开始,系统加入了打印相关的API,可以通过系统打印服务实现打印.对于需要使用打印功能的APP可参考官方教程接入打印服务. 这不是本文的内容,本文介绍打印机厂商如何使自己 ...

  8. Android Audio 服务层与HAL层之间的接口分析 Service<->interface<->HAL

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.AudioFlinger 二.服务层接口分析 2.1由DevicesFactoryHalInterface可以找到Dev ...

  9. Android系统反编译FrameWork层虚拟定位方法

    首次发帖,如有不规范的地方还望多多包涵 起因是因为需要做模拟定位的功能,最终是过金融类app的定位 ,root.框架分分钟被砍死 迫于无奈,直接从操作系统入手,反正hook也不过是hook那几个系统里 ...

最新文章

  1. 关于学习Python的一点学习总结(5->切片赋值->sort排序->列表操作)
  2. python脚本自动消除安卓版_Android:检测内存泄漏的自动化测试Python脚本
  3. python pytorch自定义_PyTorch使用自定义模块创建数据模型
  4. java通过jxl处理execl空行_jxl操作Excel导入数据库之空行的处理
  5. docker+selenium grid解决node执行经常卡死
  6. 人工智能学习书单推荐
  7. CentOS7安装Mono和MonoDevelop
  8. SqlServer中检查数据表是否存在
  9. ps常用命令简单概括
  10. Intouch | 报警延时设定
  11. AI智能语音系统源码搭建
  12. SaaS服务应用集成和生态该何去何从
  13. 朗逸保险丝安培数及保险丝配置说明
  14. STM32 解析 JSON 之 cJSON
  15. MATLAB及app designer中函数:定义与调用
  16. (Tiled官方文档翻译)第二节:四种图层的介绍
  17. 圆与圆的位置关系题目含答案_直线和圆的位置关系练习题附答案
  18. Tomcat执行shutdown时报错:java.net.ConnectException: Connection refused (Connection refused)解决办法
  19. 如何快速提取文件名称?
  20. 基于Socket编程的聊天工具【Java实现】

热门文章

  1. BSD配置SSH服务
  2. ViewBag 找不到编译动态表达式所需的一种或多种类型,是否缺少引用?
  3. Linux文件查找命令find,xargs详述
  4. 3C趋势价值对云计算发展的驱动作用
  5. Java多线程同步Synchronized使用分析
  6. 手机吞吃蛇游戏的设计与开发
  7. implements Serializable
  8. Ubuntu 14.04下安装Redis报错:“You need tcl 8.5 or newer in order to run the Redis test”问题解决
  9. 农用地包括哪些地类_土地地类一览表
  10. oracle模拟重叠事务,ORACLE的事务读一致性与语句读一致性