Android实战第二季

Android 通用架构

Android 有一个通用的展示软件栈的架构,即是如此图:

简单介绍:

Applications 层:主要是 Android 自带的 GMS(Google Mobile Service) 应用和应用开发者开发的应用;

Application Framework :主要是为 Application 开发者提供各种功能、服务和开发 API 。

Android Runtime(Core libraries and Dalvik Virtual Mache) :为应用运行提供运行环境的 Java 虚拟机和运行时库。

Libraries :主要是 Android 系统运行库和工具集;

C/C++ 库:

a) 标准 C/C++ 库 bionic : BSD 许可证,可以修改而无需公开源代码。提供 C/C++ 标准库绝大部分的功能,是一个专为嵌入式系统设计的轻量级标准库实现。相对于传统的 glibc ,其体积和内存占用很小。

b) C 语言工具库 libcutils :是 Android 系统中的基石库,基本上 Android 中所有的本地库和程序都链接了这个库。

c) init 进程:此进程是 Android 设备启动后,系统执行的第一个用户空间的可执行程序,由内核缺省直接启动,以守护进程的形式后台运行。提供以下功能:设备管理、解析并执行初始化脚本 init.rc 。

d) shell 工具: sh 和 toolbox 、 busybox 。

e) C++ 语言工具库 libutils :属于 Android 的底层库。以 C++ 实现,提供的 API 也是 C++ 接口规范。提供基本头文件、 Binder 框架以及使用 Binder 机制的相关库。

通过 Android 应用程序框架为开发者提供服务的 C/C++ 库 :

a) 系统 C 库:一个从 BSD 继承来的标准 C/C++ 系统函数库, 是专门为基于嵌入式 Linux 系统的设备定制的。即 bionic libc 库。

b) 媒体库:基于 PacketVideo OpenCORE 。该库支持多种常用的音频、视频格式回放和录制,同时支持静态图像文件。编码格式包括 MPEG4, H.264, MP3, AAC, AMR, JPG, PNG 。

c) Surface Manager :对显示子系统的管理,并且为多个应用程序提 供了 2D 和 3D 图层的无缝融合。

d) LibWebCore :一个最新的 web 浏览器引擎用,支持 Android 浏览器和一个可嵌入的 web 视图

e) SGL - 底层的 2D 图形引擎

f) 3D libraries :基于 OpenGL ES 1.0 APIs 实现;该库可以使用硬件 3D 加速(如果可用)或者使用高度优化的 3D 软加速。

g) SQLite :一个对于所有应用程序可用,功能强劲的轻型关系型数据库引擎。

系统工具集 :

a) 主要以 busybox 为主,链接 bionic libc 库,为大多数嵌入式 Linux 所采用。主要包含一些系统管理工具,全为文本命令行工具。

b) 另外 Android 官方也提供了专门的调试守护进程,如 adbd 等。

HAL :一个对硬件访问虚拟化的中间抽象层,接着我们详细介绍;

Linux Kernel :基于开源 Linux kernel 经过修改的支撑整个软件栈的基础操作系统内核,当前主要是依赖于 Linux kernel 2.6 。驱动主要分为两类,一类是 Android 专用驱动,其并不是硬件驱动,而主要是一些为上层提供服务的辅助功能层,比如 ashmem 、 logger 、 binder 、 power manager ;另一类则是设备驱动则,其多是硬件驱动,属于 Linux 内核标准的驱动,比如 fb 显示驱动 (LCD) 、输入设备驱动 ( 游戏杆、鼠标、键盘、触摸屏 ) 、视频驱动 (Camera) 、音频驱动、 MTD 存储设备驱动、网络驱动 ( 蓝牙、 WiFi 、 Ethernet) 等。驱动在内存映射的时候也分为 kernel space 和 user space ,放在 kernel space 都是需要遵循 GPL 开源的;放在 user space 中的驱动,是遵循 Apache/MIT 许可证的,可以不开源,其运行在 kernel space 之上。

Hardware Abstraction Layer:

HAL 是 Google 为了解决 Linux 开源许可证 GPL 和 Android 本身的 Apache 许可证冲突的一个硬件抽象层,主要原则是把控制硬件的动作都放到了 Android HAL 中,而 linux driver 仅仅完成一些简单的数据交互作用,甚至把硬件寄存器空间直接映射到 user space 。

HAL 存在的原因:

  1. 快速适配硬件设备中非 linux kernel 标准的接口;

  2. 解决 Linux 开源许可证 GPL 与硬件设备厂商驱动的专利不兼容;通过 Android 的 Apache 许可证和 HAL 技术实现来解决这一难题;

  3. 开放的满足设备厂商开发开与之驱动对应的特定需求的要求;

HAL 层具备如下特点:

  1. 在用户空间 (user space) 而不是内核空间 (kernel space) ,可以是 c/c++ 库;

  2. 将 Android platform 部分和系统硬件完全的进行了隔离开;

  3. 向上层提供 Android platform 操作硬件的接口,向下要求硬件驱动对其功能进行实现; ( 比方说上层应用对于 Graphics, Audio, Camera, Bluetooth, GPS, Radio(RIL), Wifi 等的操作。 )

在编程方式上,上层应用通过 HAL 对硬件的操作有两种方式:

  1. 通过 Java->JNI->*.so 库 (c/c++) ;

  1. 通过 Java app->ApplicationManager->Service(java)->service(jni)->HAL->HAL stub->System Call 方式进行调用;

注:一般 HAL 动态库放在位置 /system/lib/hw 目录。

一般开发类型

  1. Android 手机产品:构建硬件系统,移植 Android 软件平台系统;主要涉及设备驱动程序,以及在硬件抽象层实现标准接口等。

  1. Android 应用程序:基于 Application Framework 和其他应用,开发应用程序;

  2. Android 系统开发:主要是增强或者完善 Android 平台系统的功能,开发中主要包含如下部分:

a) 开发 c 或者 c++ 库;

b) 定义将要通过 JNI 提供的上层 Java 的系统 API 接口;

c) 封装 JNI ;

d) 通过 JNI 封装 Java 类和接口 API ,提供给 Android 应用使用;

Android 开发社区

Cyanogenmod 社区: http://www.cyanogenmod.com/

涉及开发语言: C/C++/Java 等。