Android接口与架构(驱动开发)翻译官方文档
Android接口与架构
Android在设备的规格与驱动方面给了你很大的自由来实现。HAL层提供了一个标准的方式来打通Android系统层与硬件层。Android系统是开源的,所以你能够在接口和性能方面贡献自己的力量。
为了保证设备维持一个高水平的质量,并且提供一个持续稳定的用户体验,每个设备必须通过兼容性测试(CTS).CTS确保设备符合质量标准,用来保证app可靠的运行,并且有一个好的用户体验。如需了解更多,请看Compatiblity
在将android移植到硬件之前,请花些时间从一个比较高的层次了解下android系统的架构。因为你的驱动和HAL层通过android进行通信,所以了解android如何工作有助于你定位android源代码各个层次的代码。

图1 android系统结构
Application framework
Application framework 被开发者接触的最多。作为一个硬件开发者,你应该意识到,应用层的API能够映射到HAL层的接口,也能够在开发驱动的过程中提供很多有用的信息。
Binder IPC
Binder 进程内通信机制允许应用程序框架透过进程的边界,并且调用android system services 的代码。这样能够保证上层的框架代码与底层的android system services之间的通信。在 应用framwork层,这种通信对开发者是透明的,这样看起来这两个层之间通信是理所当然。
System services
应用framework层暴露的一些实际功能是通过与system services通信来达到访问底层硬件的目的。services是模块化的,主要的几个组件比如Window Manager,Search Service,Notifycation Manager.Android 包含了两个组的service,系统(比如Window Manager,Search Service)和媒体(比如播放与录制)
Hardware abstraction layer (HAL)
硬件抽象层(HAL)为硬件厂商定义了一个标准的接口,让厂商自己实现。同时android也能向开发者隐藏掉底层驱动的实现细节。HAL层让开发者不影响上层系统的情况下,开发功能。HAL的实现被打包进so文件中,并且在适当的时机被系统加载。

图2硬件抽象层的组件
你必须为硬件提供商提供的指定的硬件实现相符合的HAL(和驱动)。HAL的实现通常是编译到共享库的模块中(.so文件).Android没有在HAL实现层与硬件层指定一个标准的通信方式,这样你可以根据自己的情况实现最好的方案。当然,为了能让Android系统正确的与硬件通信,你必须遵守已有的约定,这个约定是在每个硬件特殊指定的HAL接口中定义的。
标准的HAL结构
每一个指定的HAL接口有指定的属性,这些属性定义在hardware/libhardware/include/hardware/hardware.h这个文件中,这样能够保证HAL用户可控的结构。这个接口让Android系统一致的加载正确版本的HAL模块。在这里包含了两种通常的组件,一个module,一个device.
module 代表了你的HAL层的实现,存储在共享的ligrary中(.so文件)。里面包含了metadata包含了比如版本,名字,作者,这有助于帮助Android发现并且正确的加载。hardware/libhardware/include/hardware/hardware.h这个头文件定义了一个hw_module_t结构,这个结构代表一个module,里面包含了刚刚提到的版本,名字和作者。
另外 hw_module_t这个结构包含了一个指向一个另外hw_module_methods_t结构的指针,而hw_module_methods_t这个结构包含了了一个指针指向一个开放的方法。这个开放的方法是用来初始化HAL与硬件的通信。每一个硬件指定的HAL通常都会包含hw_module_t这个结构,用来为硬件添加额外的信息。例如在camera HAL中,camera_module_t中包含了hw_module_t,同时包含了两个相机指定函数的指针。
typedef struct camera_module {
hw_module_t common;
int (*get_number_of_cameras)(void);
int (*get_camera_info)(int camera_id, struct camera_info *info);
} camera_module_t;
当你实现了HAL,并且创建了一个module 结构,你必须把他命名为HAL_MODULE_INFO_SYM,例如,这里有了Nexus 9 audio HAL的实现
struct audio_module HAL_MODULE_INFO_SYM = {
.common = {
.tag = HARDWARE_MODULE_TAG,
.module_api_version = AUDIO_MODULE_API_VERSION_0_1,
.hal_api_version = HARDWARE_HAL_API_VERSION,
.id = AUDIO_HARDWARE_MODULE_ID,
.name = "NVIDIA Tegra Audio HAL",
.author = "The Android Open Source Project",
.methods = &hal_module_methods,
},
};
另外一个组件device,把实际的硬件中抽象出来。例如,一个audio module能够包含一个私有的audio device,一个 USB audio device 或者一个蓝牙A2DP audio device。一个device是由hw_device_t结构代表的。就跟module一样,每种类型的device定义了一个更加详细版本的hw_device_t,里面包含了功能函数的指针用来实现特定的硬件功能。例如,audio_hw_device_t结构包含了媒体设备操作的函数的指针:
struct audio_hw_device {
struct hw_device_t common;
/**
* used by audio flinger to enumerate what devices are supported by
* each audio_hw_device implementation.
*
* Return value is a bitmask of 1 or more values of audio_devices_t
*/
uint32_t (*get_supported_devices)(const struct audio_hw_device *dev);
...
};
typedef struct audio_hw_device audio_hw_device_t;
另外除了这些标准的属性,每一个硬件指定的HAL接口都能定义自己的特性和需求。请看HAL reference documentation,这是个独立的文档,来介绍每个HAL在实现特定接口时候更多的信息。
HAL modules
HAL的实现被编译到modules(.so)文件中,Android系统会在适当的时机动态链接他们。你可以通过为每个HAL实现创建Android.mk文件,然后指向你的源文件。通常,你的共享的libraries必须有一个格式命名,这样他们才能被正确找到并加载。命名策略在不同的module中有些许的不同,但是他们都遵循下面的模式<module_type>.<device_name>.
要得到更多的关于创建HAL,请看他们各自的文档。
linux kernel
开发一个设备驱动跟开发一个标准的Linux设备驱动很像。Android使用的linux版本是添加了一些额外的功能,比如弱锁(一个内存管理系统,更加好的保护内存),Binder IPC driver,还有一些对于移动手机平台更加重要的特性。这些额外的添加主要是为了系统的功能,并且不会影响驱动的开发。
你可以使用任何版本的内核,只要他它支持我们需要的特性。不过,我们还是建议使用最近的Android 内核,有关最近的android内核相关,请看Building Kernels.
Android接口与架构(驱动开发)翻译官方文档的更多相关文章
- Android 线性布局(LinearLayout)相关官方文档 - 指南部分
Android 线性布局(LinearLayout)相关官方文档 - 指南部分 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用 ...
- Android 线性布局(LinearLayout)相关官方文档 - 布局參数部分
Android 线性布局(LinearLayout)相关官方文档 - 布局參数部分 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商 ...
- Android sync adapter初体验之为什么官方文档上的代码不能work
回答:因为其实可以work sync adapter就是google推出的一个同步框架,把各种同步操作放在一起智能管理比较省电之类的.对我而言最具体的好处反正就是,不用自己写代码了,用框架就可以了.目 ...
- App开发架构指南(谷歌官方文档译文)
这篇文章面向的是已经掌握app开发基本知识,想知道如何开发健壮app的读者. 注:本指南假设读者对 Android Framework 已经很熟悉.如果你还是app开发的新手,请查看 Getting ...
- 谷歌console开发人员官方文档(注意是谷歌)
https://developers.google.com/web/tools/chrome-devtools/debug/console/console-ui?hl=en#opening-the-c ...
- IOS 开发的官方文档链接
下面这些文章都是苹果官方的开发文档,非常有用: iOS Developer Library https://developer.apple.com/library/ios/navigation/ 总入 ...
- 别开心太早,Python 官方文档的翻译差远了
近几天,很多公众号发布了 Python 官方文档的消息.然而,一个特别奇怪的现象就发生了,让人啼笑皆非. Python 文档的中文翻译工作一直是“默默无闻”,几个月前,我还吐槽过这件事<再聊聊P ...
- Ionic2系列——Ionic 2 Guide 官方文档中文版
最近一直没更新博客,业余时间都在翻译Ionic2的文档.之前本来是想写一个入门,后来觉得干脆把官方文档翻译一下算了,因为官方文档就是最好的入门教程.后来越翻译越觉得这个事情确实比较费精力,不知道什么时 ...
- Android系统移植与驱动开发----第一章
第一章 Android系统移植与驱动开发 Android源代码定制完全属于自己的嵌入式系统,但是支持的设备不多,所以要移植,而在移植的过程中使用的不得不提的是驱动开发. Android系统构架主要包括 ...
随机推荐
- linux 三大利器 grep sed awk sed
sed主要内容和原理介绍 sed 流处理编辑器 sed一次处理一行内容,读入一行处理一行 sed不改变文件内容(除非重定向) sed 命令行格式 $ sed [options] 'command' f ...
- .NET Reflector注册问题
reflector工具不错, 终于8.x了,也可以注册了,但是不小心注册成standard版本了,但vs中无法使用,于是各种删注册表,后来找到何英涛的解决方案 下面介绍一个Reflector很坑的一个 ...
- Jmeter和LoadRunner的区别
1.Jmeter的架构跟LoadRunner原理一样,都是通过中间代理,监控&收集并发客户端发现的指令,把他们生成脚本,再发送到应用服务器,再监控服务器反馈的结果的一个过程. 2.分布式中间代 ...
- SharePoint2007深入浅出——使用jQuery UI
jQuery1.6.4.js + jQuery UI 1.8.16.js 只有这个版本在IE8下的兼容性视图+Quirks(文本模式),dialog可以正常显示.
- Python2.7 - IMOOC - 3
第三章 Python变量和数据类型 3-4.变量 变量名必须是大小写英文.数字和下划线(_)的组合,且不能用数字开头. 同一个变量可以反复赋值,而且可以是不同类型的变量,例如: a = 123 # a ...
- 16.1 eclipse设置
内容:删除注释自动生成:添加自己使用的模板syso:设置字体:设置黑色主题 // 删除注释自动生成,强迫症表示很受不了那个什么自动生成方法注释,所以我把它关了 我之前的截图,删除那个todo的注释行 ...
- momenta
编程:1.dp的题 2.白纸写代码,给一串数和一个目标值,使用四则运算和括号使得这串数最后计算结果为目标值,打印出所有的方案,要求是这些数每个最多被使用一次,可以不被用到. 3.考了一个查找数组里,未 ...
- AOP各种的实现
1 AOP各种的实现 AOP就是面向切面编程,我们可以从几个层面来实现AOP. 在编译器修改源代码,在运行期字节码加载前修改字节码或字节码加载后动态创建代理类的字节码,以下是各种实现机制的比较. 类别 ...
- 【Linuc-CentOS 】通过yum安装 指定版本的nodejs
原 [Linuc-CentOS ]通过yum安装 指定版本的nodejs 2018年06月21日 06:56:32 黑夜的风 阅读数:884 版权声明:本文为博主原创文章,未经博主允许不得转载. ...
- LWIP network interface 即 LWIP 的 硬件 数据 接口 移植 首先 详解 STM32 以太网数据 到达 的第一站: ETH DMA 中断函数
要 运行 LWIP 不光 要实现 OS 的 一些 接口 ,还要 有 硬件 数据 接口 移植 ,即 网线上 来的 数据 怎么个形式 传递给 LWIP ,去解析 做出相应的 应答 ,2017 ...