1. 系统结构图
借用一下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语言编写的。