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接口与架构(驱动开发)翻译官方文档的更多相关文章

  1. Android 线性布局(LinearLayout)相关官方文档 - 指南部分

    Android 线性布局(LinearLayout)相关官方文档 - 指南部分 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用 ...

  2. Android 线性布局(LinearLayout)相关官方文档 - 布局參数部分

    Android 线性布局(LinearLayout)相关官方文档 - 布局參数部分 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商 ...

  3. Android sync adapter初体验之为什么官方文档上的代码不能work

    回答:因为其实可以work sync adapter就是google推出的一个同步框架,把各种同步操作放在一起智能管理比较省电之类的.对我而言最具体的好处反正就是,不用自己写代码了,用框架就可以了.目 ...

  4. App开发架构指南(谷歌官方文档译文)

    这篇文章面向的是已经掌握app开发基本知识,想知道如何开发健壮app的读者. 注:本指南假设读者对 Android Framework 已经很熟悉.如果你还是app开发的新手,请查看 Getting ...

  5. 谷歌console开发人员官方文档(注意是谷歌)

    https://developers.google.com/web/tools/chrome-devtools/debug/console/console-ui?hl=en#opening-the-c ...

  6. IOS 开发的官方文档链接

    下面这些文章都是苹果官方的开发文档,非常有用: iOS Developer Library https://developer.apple.com/library/ios/navigation/ 总入 ...

  7. 别开心太早,Python 官方文档的翻译差远了

    近几天,很多公众号发布了 Python 官方文档的消息.然而,一个特别奇怪的现象就发生了,让人啼笑皆非. Python 文档的中文翻译工作一直是“默默无闻”,几个月前,我还吐槽过这件事<再聊聊P ...

  8. Ionic2系列——Ionic 2 Guide 官方文档中文版

    最近一直没更新博客,业余时间都在翻译Ionic2的文档.之前本来是想写一个入门,后来觉得干脆把官方文档翻译一下算了,因为官方文档就是最好的入门教程.后来越翻译越觉得这个事情确实比较费精力,不知道什么时 ...

  9. Android系统移植与驱动开发----第一章

    第一章 Android系统移植与驱动开发 Android源代码定制完全属于自己的嵌入式系统,但是支持的设备不多,所以要移植,而在移植的过程中使用的不得不提的是驱动开发. Android系统构架主要包括 ...

随机推荐

  1. Python super执行基类的构造方法

    有一个需求是这样的,先有一个Machine的类,有通用的name.position.date属性,然后又出现了一个Server的类继承Machine类,但是Server类多出一个ipaddr的属性,所 ...

  2. Python学习---PyCharm的使用学习

    1.1. IDEA的使用 PyCharm2017下载 链接:https://pan.baidu.com/s/1HPR9FtVV5BCvd3uTdOetxw 密码:ok0q 激活IDEA2017(方案一 ...

  3. 最优化 KKT条件

    对于约束优化问题: 拉格朗日公式: 其KKT条件为: 求解 x.α.β 其中β*g(x)为互补松弛条件 KKT条件是使一组解成为最优解的必要条件,当原问题是凸问题的时候,KKT条件也是充分条件.

  4. Angular实现多标签页效果(路由重用)

    1.需求 做了几年的MES系统,从ASP.NET WebForm至MVC,系统决定了用户界面必须为标签页方式实现,因为用户在进行一项操作的时候很有可能会进行其它的操作,比如查询之类的.如果按MVC的方 ...

  5. POJ2074 Line of Sight

    嘟嘟嘟 题意:用一条水平线段表示以栋房子:\((x_0, y_0)(x_0', y_0)\).然后有一条低于房子的水平线段\(l_0\),代表你可以到的位置.接下来输入一个数\(n\),一下\(n\) ...

  6. 28、springboot整合RabbitMQ(2)

    1.监听 1.1.监听队列 如订单系统和库存系统 订单系统下订单之后将消息存放在消息队列中 库存系统需要时刻进行监听消息队列的内容,有新的订单就需要进行库存相关的操作   此时模拟监听消息队列中的Bo ...

  7. Python 模块化 模块搜索顺序、重复导入、模块加载列表(五)

    模块搜索顺序.重复导入.模块加载列表 0x00 模块搜索顺序: 举例: #test.py import sys for p in sys.path: print(p) 运行结果: C:\python ...

  8. vue04-动画、组件

    一.vue中使用动画 文档:https://cn.vuejs.org/v2/guide/transitions.html 1. Vue 中的过渡动画 <!DOCTYPE html> < ...

  9. stm32 晶振不起振

    1. STM32f103有内部晶振.刚刚上电时,所有Clock都是源于内部晶振,所以当片内没有程序或内部程序没有使能外部晶振时,外部晶振是不会起振的.2. STM32f103有内部复位电路,只有当检测 ...

  10. MongoDB常用指令

    db 查看当前操作的数据库 show dbs 显示所有数据库 show collections 显示当前数据库下的所有集合 use database_name 连接到一个名叫[database_nam ...