1. 系统结构图

借用一下HAL层的图,

android hal层 升级接口 android hal层框架_操作系统


2. 系统结构分层

2.1 Linux Kernel内核

Android基于Linux2.6提供内核服务。Android对操作系统的使用包括核心和驱动程序两部分。主要驱动有:Display, Frame Buffer, Flash, Camera, Video, Audio, Wifi, Keyboard,Bluetooth, Power…

2.2 HAL硬件抽象层

HAL层是指硬件抽象层(Hardware Abstraction Layer)。用于解决LINUX的GPL规则和Android遵循的APACHE规则冲突的问题。GPL要求开源而APACHE不要求开源,HAL层可以解决硬件生产厂商的知识产权问题,他们可以只提供二进制代码。

所以,ANDROID是开放,而不开源。

我们写一个自定义设备的HAL层。

/*定义模块ID*/

#defineXXX_HARDWARE_MODULE_ID "XXX"



/*硬件模块结构体*/

//见hardware.h中的hw_module_t定义的说明,xxx_module_t的第一个成员必须是hw_module_t类型,其次才是模块的一此相关信息,当然也可以不定义,

//这里就没有定义模块相关信息

structxxx_module_t {

struct hw_module_t common;

};



/*硬件接口结构体*/

//见hardware.h中的hw_device_t的说明,要求自定义xxx_device_t的第一个成员必须是hw_device_t类型,其次才是其它的一些接口信息.

structxxx_device_t {

struct hw_device_t common;

//以下成员是HAL对上层提供的接口或一些属性

int fd;

int (*set_val)(struct xxx_device_t* dev,int val);

int (*get_val)(struct xxx_device_t* dev,int* val);

};



/*模块实例变量*/

structxxx_module_t HAL_MODULE_INFO_SYM = { //变量名必须为HAL_MODULE_INFO_SYM,这是强制要求的,你要写Android的HAL就得遵循这个游戏规则,

//见hardware.h中的hw_module_t的类型信息说明.

common: {

tag: HARDWARE_MODULE_TAG,

version_major: 1,

version_minor: 0,

id: XXX_HARDWARE_MODULE_ID, //头文件中有定义

name: MODULE_NAME,

author: MODULE_AUTHOR,

methods: &xxx_module_methods, //模块方法列表,在本地定义

}

};




2.3 Android Runtime 运行环境

这是一个核心库的集合,为JAVA编程提供核心类库。每一个应用程序都是Dalvik中的实例,运行在自己的进程中。

Dalvik虚拟机可执行程序格式是.dex,此格式专为Dalvik设计。适合内存和处理器速度有限的嵌入式系统。

dx是一套工具,可将java.class转换成为.dex格式,一个dex文件包含多个class文件。dex文件为了达到最佳化,会增大1~4倍,以ODEX结尾。

2.4 Libraries 本地库

是一个C/C++库的集合,这些功能通过Application Framework暴露给应用程序。主要有系统C库,媒体库,界面管理,3D,FreeType,SQLite,图形库等。

2.5 Application Framework 应用程序框架

在简化组件的重用,所有的应用程序其实是一组服务和系统。包括Activity Manager等。

2.6 应用程序

如电子邮件客户端,联系人等。所有应用程序都是使用JAVA语言编写的。