第九章 硬件抽象层:HAL
9.1为什么要在安卓中加入HAL?
首先Google 为 Android 增加 HAL 的主要目的除了尽量避免应用程序直接访问 Linux 驱动外,还有一仓重要原因,那就是保护 “私人财产”。-对于
那些既想发布茬子·Android,的 Linux 驱动程序,又不想将核心业务逻辑公开的企业或个人, ~简直就是福音。
HAL 并不是Linux 内核的一部分,而是位于Android的系统运行库层,尽管这些 Linux.驱动都是免费给用户’使用的,但是由于这些Linux 驱动的实现涉及一些,技术专利或商业秘密,如果公开源代码会有很大麻烦。但作为Linux.驱动,又不得不公开源代码。这是由于 Linux 内核采用了 GPL 协议,而 GPL协议要求所有使用基于 GPL 协议的源代码的程序必须开源(由于 Linux 驱动属于 Linux 内核的一部分,因此 Linux 驱动必须开源)。
总而言之,Google 为 Android 增加 HAL 的主要目的:
1.统一硬件的调用接口。由于HAL 有标准的调用接口,所以可以利用 HAL屏蔽Linux 驱动复杂,不统一的接口。
2.解决了GP(版权问题。由于 Linux 内核基于GPL协议,而 Android 基于 Apache Licence 2 ..0、协议.因此 Google 玩了个“穿越飞将原本位于 Linux驱动中的敏感代码向上移了一个层次二这样这些敏感代码就摆脱了 GPL 协议的束缚,。那些不想开源的 Linux驱动作者也就没必要开源了。
3.针对一些特殊的要求。对于有些硬件,可能需要访问→些用户空间的资源,或在内核空间不方便完成的工作以及特殊需求。在这种情况下,可以利用位于用户空间的HAL 代码来辅助 Linux驱动完成一些工作。
9.3为LED驱动增加 HAL
9.3.1 编写一款支持 HAL 的 Linux 驱动程序的步骤编写一款支持 HAL 的 Linux 驱i.9J.程序要比编写普通的 Linux 驱动程序复杂一些,但这些付出是值得的。 因为加入 HAL 会使组成 Linux 驱动的一整套 Library 的各部分更独立,更容易维护。下面看一下具体的实现步骤。在后面的内容会逐渐对每一步进行讨论。
第 1 步 编写 Linux 驱动
“编写 Linux 驱动”,从表明上看是废话,但如果要为 Linux 驱动添加 HAL,而且想尽量保护敏感数据。 Linux 驱动的代码就要尽量简洁,尽可能将业务逻辑放到 HALLibrary 中。
第 2 步:编写 HAL Library
HAL Library 就是普通的 Linux Library 仆.so )文件。但这类库文件有一个接口。通过HAL_MODULE_INFO_ SYM 变量实现。 Service Library 就是通过在这个接口中定义的 ID 定位 HAL Library 的。
第 3 步:编写 Service Library
尽管这步并不是必需的,但新的 HAL 架构要求我们这样做。 Service Library 也是 Linux Library。这一步比较灵活。 Service Library 可以是一般的 Linux Library,也可以是别I Library。在本章的 LED 驱动例子中将 Service Libratγ 和刑I Library 合到了一起。也就是说, Service Library 就是 JNI Library.实际上这一步除了用 CIC件实现的*.so 库文件外,还应该包含一个用 Java 编写的服务管理类( ServiceManager)。 ServiceManager 会调用 Service Library。而 APK 程序会调用 ServiceManager 类米访问 Service Library。
http://www.cnblogs.com/lhczln/