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系统构架主要包括 ...
随机推荐
- MySQL -Naivacat工具与pymysql模块
Navicat 在生产环境中操作MySQL数据库还是推荐使用命令行工具mysql,但在我们自己开发测试时,可以使用可视化工具Navicat,以图形界面的形式操作MySQL数据库. 官网下载:https ...
- [BZOJ 1033][ZJOI2008]杀蚂蚁antbuster
1033: [ZJOI2008]杀蚂蚁antbuster Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1200 Solved: 507[Submi ...
- Python2.7 - IMOOC - 4
第三章 Python变量和数据类型 3-7.Unicode字符串 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理. 最早的计算机在设计时采用8个比特(bit)作为一个字节(b ...
- Java自学之路(新手一定要看)
Java自学之路(新手一定要看) 转自尚学堂 JAVA自学之路 一:学会选择 为了就业,不少同学参加各种各样的培训. 决心做软件的,大多数人选的是java,或是.net,也有一些选择了手机.嵌入式.游 ...
- scala基础入门
1.scala当中申明值和变量 scala当中的变量申明可以使用两种方式,第一种使用val来申明变量.第二种使用var来申明变量. 申明变量语法 val/var 变量名 [:变量类型] = 变量值 其 ...
- BZOJ2004:[HNOI2010]Bus 公交线路(状压DP,矩阵乘法)
Description 小Z所在的城市有N个公交车站,排列在一条长(N-1)km的直线上,从左到右依次编号为1到N,相邻公交车站间的距离均为1km. 作为公交车线路的规划者,小Z调查了市民的需求,决定 ...
- hctf2018wp复现
1.bottle 登陆网站后存在提交url的地方 测试发生存在如下paload,知识点:1.crlf 2.写一个网站开发的端口小于80,浏览器就不会跳转能执行js(payload只能在火狐浏览器执行) ...
- ZooKeeper学习之路 (七)ZooKeeper设计特点及典型应用场景
ZooKeeper 特点/设计目的 ZooKeeper 作为一个集群提供数据一致的协调服务,自然,最好的方式就是在整个集群中的 各服务节点进行数据的复制和同步. 数据复制的好处 1.容错:一个节点出错 ...
- Zookeeper学习之路 (一)初识
本文引用自 http://www.cnblogs.com/sunddenly/p/4033574.html 引言 Hadoop 集群当中 N 多的配置信息如何做到全局一致并且单点修改迅速响应到整个集群 ...
- 【vue】父向子组件传参、子组件向父传参
1.父向子组件传参 App.vue为父,引入componetA组件之后,则可以在App.vue中使用标签(注意驼峰写法要改成componet-a写法,因为html对大小写不敏感,componenta与 ...