### **概述**
Android硬件抽象层从开发到使用有一个清晰的层次。这个层次恰好对应了Android系统的架构层次,它向下涉及到Linux内核,向上涉及到应用程序框架层的服务,以及应用程序层对它的使用。Android硬件抽象层模块的开发本身也遵循一定的规范。有了这个规范之后,系统就可以对它进行自动加载,方便上层的使用。
主要将通过一个具体的实例来分析Android硬件抽象层的开发、测试和使用,它在帮助我们理解Android系统架构的同时,也能教会我们如何在Android源代码环境中开发C/C++代码。
**Android硬件抽象层概述
Android硬件驱动程序开发
Android硬件驱动程序验证
Android硬件抽象层模块开发
Android硬件访问服务开发
Android应用程序开发**
### **Android硬件抽象层概述**
* 设备驱动分为内核空间和用户空间两部分
* 保护厂商利益(出发点)
* 内核空间主要负责硬件访问逻辑(GPL)
* 用户空间主要负责参数和访问流程控制(Apache License)
* 用户空间部分设备驱动即为HAL Module
HAL Module通过设备文件访问内核空间部分设备驱动
* 系统服务通过HAL Module对硬件进行管理
系统服务通过JNI访问HAL Module
* 应用程序通过系统服务对硬件进行访问
应用程序通过Binder IPC访问系统服务
![](https://box.kancloud.cn/993b4084be40134e34456e2907347f30_722x454.jpg)
### **Android硬件驱动程序开发**
**与传统的Linux硬件驱动程序开发是一样的**
* 实现驱动程序
* 包括源代码文件、编译脚本文件、编译配置文件
* 提供proc、devfs和sysfs三种文件系统访问接口
* 修改根Kconfig文件
* 修改根Makefile文件
* 编译驱动程序
### **Android硬件驱动程序验证**
* 验证proc文件系统访问接口
通过cat和echo命令验证
* 验证sysfs文件系统访问接口
通过cat和echo命令验证
* 验证devfs文件系统访问接口
编写C程序通过open、read和write系统调用验证
### **Android硬件抽象层模块开发**
* 模块文件命名规范
![](https://box.kancloud.cn/fd6d65ff83bf01c48ccb60e9994bb0a0_621x295.png)
* 定义模块ID
* 定义设备ID
* 定义模块结构体
* 第一个成员变量必须是标准的hw_module_t结构体
* 相当于是定义一个hw_module_t子类
* 定义设备结构体
* 第一个成员变量必须是标准的hw_device_t结构体
* 相当于是定义一个hw_device_t子类
* 定义符号HAL_MODULE_INFO_SYM,类型为自定义的模块结构体
* 实现设备打开接口(必须)
* 实现设备关闭接口(必须)
* 实现设备访问接口(可选)
**模块加载过程:hw_get_module**
* 依次在/system/lib/hw和/vendor/lib/hw目录中检查是否存在相应的“<MODULE_ID>.variant.so”文件。其中,variant分别等于属性“ro.hardware”、“ro.product.board”、“ro.board.platform”和“ro.arch”的值。只要其中一个存在,即停止查找。
* 如果上述文件均不存在,则继续在/system/lib/hw目录中检查 “<MODULE_ID>.variant.so”文件是否存在。
* 调用dlopen打开上述找到的so文件。
* 调用dlsys获得上述打开的so文件里面的符号HAL_MODULE_INFO_SYM。
* 将符号HAL_MODULE_INFO_SYM强制转换为一个hw_moudle_t结构体。
**修改设备文件访问权限**
* 设备文件在默认情况下只有root用户可以访问
* 设备文件一般是在非root用户进程中访问的
* 修改ueventd.rc文件赋予设备文件非root用户访问权限
**修改ueventd.rc文件的方法**
* 解压ramdisk.img文件,得到ramdisk.img.gz归档文件
* 解除ramdisk.img.gz文件归档,得到ramdisk目录
* 修改ramdisk目录下的ueventd.rc文件
* 重新打包ramdisk.img镜像文件
### **Android硬件访问服务开发**
**定义硬件访问接口IXXX**
* 使用AIDL语言定义
* 编译后会生成一个IXXX.Stub类
**实现硬件访问服务XXX**
* 从IXXX.Stub类继承
* 实现硬件访问接口IXXX
* 通过JNI访问硬件抽象层模块
**实现硬件访问服务XXX的JNI接口**
* 调用函数hw_get_module加载硬件抽象层模块
* 打开硬件设备
**启动硬件访问服务**
* 在System Server进程中创建一个XXX实例
* 调用ServiceManager.addService接口将XXX实例注册到Service Manager中
### **Android应用程序开发**
* 调用ServiceManager.getService接口获得硬件访问服务XXX的代理接口
* 通过代理接口访问硬件访问服务
- 前言
- Android组件设计思想
- Android源代码开发和调试环境搭建
- Android源代码下载和编译
- Android源代码情景分析法
- Android源代码调试分析法
- 手把手教你为手机编译ROM
- 在Ubuntu上下载、编译和安装Android最新源代码
- 在Ubuntu上下载、编译和安装Android最新内核源代码(Linux Kernel)
- 如何单独编译Android源代码中的模块
- 在Ubuntu上为Android系统编写Linux内核驱动程序
- 在Ubuntu上为Android系统内置C可执行程序测试Linux内核驱动程序
- 在Ubuntu上为Android增加硬件抽象层(HAL)模块访问Linux内核驱动程序
- 在Ubuntu为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口
- 在Ubuntu上为Android系统的Application Frameworks层增加硬件访问服务
- 在Ubuntu上为Android系统内置Java应用程序测试Application Frameworks层的硬件服务
- Android源代码仓库及其管理工具Repo分析
- Android编译系统简要介绍和学习计划
- Android编译系统环境初始化过程分析
- Android源代码编译命令m/mm/mmm/make分析
- Android系统镜像文件的打包过程分析
- 从CM刷机过程和原理分析Android系统结构
- Android系统架构概述
- Android系统整体架构
- android专用驱动
- Android硬件抽象层HAL
- Android应用程序组件
- Android应用程序框架
- Android用户界面架构
- Android虚拟机之Dalvik虚拟机
- Android硬件抽象层
- Android硬件抽象层(HAL)概要介绍和学习计划
- Android专用驱动
- Android Logger驱动系统
- Android日志系统驱动程序Logger源代码分析
- Android应用程序框架层和系统运行库层日志系统源代码分析
- Android日志系统Logcat源代码简要分析
- Android Binder驱动系统
- Android进程间通信(IPC)机制Binder简要介绍和学习计划
- 浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路
- 浅谈Android系统进程间通信(IPC)机制Binder中的Server和Client获得Service Manager接口之路
- Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析
- Android系统进程间通信(IPC)机制Binder中的Client获得Server远程接口过程源代码分析
- Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析
- Android Ashmem驱动系统
- Android系统匿名共享内存Ashmem(Anonymous Shared Memory)简要介绍和学习计划
- Android系统匿名共享内存Ashmem(Anonymous Shared Memory)驱动程序源代码分析
- Android系统匿名共享内存Ashmem(Anonymous Shared Memory)在进程间共享的原理分析
- Android系统匿名共享内存(Anonymous Shared Memory)C++调用接口分析
- Android应用程序进程管理
- Android应用程序进程启动过程的源代码分析
- Android系统进程Zygote启动过程的源代码分析
- Android系统默认Home应用程序(Launcher)的启动过程源代码分析
- Android应用程序消息机制
- Android应用程序消息处理机制(Looper、Handler)分析
- Android应用程序线程消息循环模型分析
- Android应用程序输入事件分发和处理机制
- Android应用程序键盘(Keyboard)消息处理机制分析
- Android应用程序UI架构
- Android系统的开机画面显示过程分析
- Android帧缓冲区(Frame Buffer)硬件抽象层(HAL)模块Gralloc的实现原理分析
- SurfaceFlinger
- Android系统Surface机制的SurfaceFlinger服务
- SurfaceFlinger服务简要介绍和学习计划
- 启动过程分析
- 对帧缓冲区(Frame Buffer)的管理分析
- 线程模型分析
- 渲染应用程序UI的过程分析
- Android应用程序与SurfaceFlinger服务的关系
- 概述和学习计划
- 连接过程分析
- 共享UI元数据(SharedClient)的创建过程分析
- 创建Surface的过程分析
- 渲染Surface的过程分析
- Android应用程序窗口(Activity)
- 实现框架简要介绍和学习计划
- 运行上下文环境(Context)的创建过程分析
- 窗口对象(Window)的创建过程分析
- 视图对象(View)的创建过程分析
- 与WindowManagerService服务的连接过程分析
- 绘图表面(Surface)的创建过程分析
- 测量(Measure)、布局(Layout)和绘制(Draw)过程分析
- WindowManagerService
- WindowManagerService的简要介绍和学习计划
- 计算Activity窗口大小的过程分析
- 对窗口的组织方式分析
- 对输入法窗口(Input Method Window)的管理分析
- 对壁纸窗口(Wallpaper Window)的管理分析
- 计算窗口Z轴位置的过程分析
- 显示Activity组件的启动窗口(Starting Window)的过程分析
- 切换Activity窗口(App Transition)的过程分析
- 显示窗口动画的原理分析
- Android控件TextView的实现原理分析
- Android视图SurfaceView的实现原理分析
- Android应用程序UI硬件加速渲染
- 简要介绍和学习计划
- 环境初始化过程分析
- 预加载资源地图集服务(Asset Atlas Service)分析
- Display List构建过程分析
- Display List渲染过程分析
- 动画执行过程分析
- Android应用程序资源管理框架
- Android资源管理框架(Asset Manager)
- Asset Manager 简要介绍和学习计划
- 编译和打包过程分析
- Asset Manager的创建过程分析
- 查找过程分析
- Dalvik虚拟机和ART虚拟机
- Dalvik虚拟机
- Dalvik虚拟机简要介绍和学习计划
- Dalvik虚拟机的启动过程分析
- Dalvik虚拟机的运行过程分析
- Dalvik虚拟机JNI方法的注册过程分析
- Dalvik虚拟机进程和线程的创建过程分析
- Dalvik虚拟机垃圾收集机制简要介绍和学习计划
- Dalvik虚拟机Java堆创建过程分析
- Dalvik虚拟机为新创建对象分配内存的过程分析
- Dalvik虚拟机垃圾收集(GC)过程分析
- ART虚拟机
- Android ART运行时无缝替换Dalvik虚拟机的过程分析
- Android运行时ART简要介绍和学习计划
- Android运行时ART加载OAT文件的过程分析
- Android运行时ART加载类和方法的过程分析
- Android运行时ART执行类方法的过程分析
- ART运行时垃圾收集机制简要介绍和学习计划
- ART运行时Java堆创建过程分析
- ART运行时为新创建对象分配内存的过程分析
- ART运行时垃圾收集(GC)过程分析
- ART运行时Compacting GC简要介绍和学习计划
- ART运行时Compacting GC堆创建过程分析
- ART运行时Compacting GC为新创建对象分配内存的过程分析
- ART运行时Semi-Space(SS)和Generational Semi-Space(GSS)GC执行过程分析
- ART运行时Mark-Compact( MC)GC执行过程分析
- ART运行时Foreground GC和Background GC切换过程分析
- Android安全机制
- SEAndroid安全机制简要介绍和学习计划
- SEAndroid安全机制框架分析
- SEAndroid安全机制中的文件安全上下文关联分析
- SEAndroid安全机制中的进程安全上下文关联分析
- SEAndroid安全机制对Android属性访问的保护分析
- SEAndroid安全机制对Binder IPC的保护分析
- 从NDK在非Root手机上的调试原理探讨Android的安全机制
- APK防反编译
- Android视频硬解稳定性问题探讨和处理
- Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析
- Android应用程序安装过程源代码分析
- Android应用程序启动过程源代码分析
- 四大组件源代码分析
- Activity
- Android应用程序的Activity启动过程简要介绍和学习计划
- Android应用程序内部启动Activity过程(startActivity)的源代码分析
- 解开Android应用程序组件Activity的"singleTask"之谜
- Android应用程序在新的进程中启动新的Activity的方法和过程分析
- Service
- Android应用程序绑定服务(bindService)的过程源代码分析
- ContentProvider
- Android应用程序组件Content Provider简要介绍和学习计划
- Android应用程序组件Content Provider应用实例
- Android应用程序组件Content Provider的启动过程源代码分析
- Android应用程序组件Content Provider在应用程序之间共享数据的原理分析
- Android应用程序组件Content Provider的共享数据更新通知机制分析
- BroadcastReceiver
- Android系统中的广播(Broadcast)机制简要介绍和学习计划
- Android应用程序注册广播接收器(registerReceiver)的过程分析
- Android应用程序发送广播(sendBroadcast)的过程分析