• 11.1 Android 操作系统介绍
• Android 是 Google 公司于2007 年11月发布的一款非常优秀的智能移 动平台操作系统。到2011 年第一季度Android 在全球的市场份额首 次超过Nokia的Symbian系统,跃居全球第一。
• Android系统最初由AndyRubin等人于2003年10月创建。Google于 2005 年8月17日收购Android并组建OHA(OpenHandsetAlliance, 开放手机联盟)开发改良 Android,之后逐渐扩展到平板电脑及其他 移动平台领域上。
• Android 系统是一个基于 Apache License(Apache 许可证)、GPL (GNU General Public License,GNU 通用公共许可证)软件许可的开 源手机操作系统,底层由 Linux 操作系统作为内核,我们可以直接从 Android 的官方网站上下载最新的Android源码和相关开发工具包:
– 面向开发者的Android网址:https://developer.android.google.cn/
– Android开源项目网址:http://source.android.com
• 11.2 Android 软件架构介绍
• Android 的软件架构采用了分层结构,如下图所示,由上至下分别为:Applications 应 用层、Application Framework 应用框架层、Android Runtime & Libraries 运行时库和本 地库层、Linux Kernel 内核层。
① Applications 应用层:用户安装应用程序及系统自带应用程序层,主要用来与用户进行 交互,如Home 指Android 手机的桌面,Phone 指电话应用,用来拨打电话等。
② Application Framework 应用框架层:系统框架层,封装了大量应用程序所使用的类, 从而达到组件重用的目的,它主要向上层应用层提供API,如:ActivityManager主要 用于管理所有的Activity、画面导航、回退等生命周期相关的操作,PackageManager 主要用来管理程序安装包的安装、更新、删除等操作。
③ Android Runtime & Libraries 运行时库和本地库层:Runtime 是 Android 的运行环境,在 该层有DalvikVirtualMachine(Android 的虚拟机简称 DVM)的实现,在DVM 中运行着 Java 的核心语言库代码和Java 程序。同时,在DVM 运行期间要调用系统库代码,如: 负责显示的SurfaceManager 本地代码,负责多媒体处理相关的MediaFrameworks代码 及C 库libc等。
④ Linux Kernel 内核层:Android 系统是基于Linux 系统的,所以Android 底层系统相关的 框架和标准的Linux 内核没有什么很大的区别,只不过添加了几个Android 系统运行 必备的驱动,如:BinderIPC进程间通信驱动、PowerManager电源管理驱动等。
• 总结:Android 的软件架构是我们学习Android 开发必须要掌握的知识点,它对我们将 来编写Android 应用程序、理解Android 框架代码、编写本地代码、修改底层驱动都有 重要的指导意义,可谓是学习Android 的灵魂。
• 11.3 Android 内核
• 内核(Kernel)是Android系统最核心的部分,其主要作用在于与计算机 硬件进行交互,实现对硬件的编程控制和接口操作。内核的主要功能包 括:内存管理、进程间通信、进程调度、虚拟文件系统、网络等功能。 和标准的Linux 内核一样,Android 内核主要实现内存管理、进程间通信 及进程调度等功能。Android 对Linux 内核的更改较少,但增加了一些没 有加入标准内核的内容,例如:yaffs文件系统。
• Android 内核结构和标准Linux 4.1.15 内核基本上相同,为了适应嵌入式 硬件环境和移动应用程序的开发,Android 在其基础上,增加了私有内 容。
• Android 在标准Linux 内核中增加的内容是一些驱动程序,这些驱动主要 分为两种类型:
① Android 专用驱动
② Android 使用的设备驱动
① Android 专用驱动:
– Android 专用驱动和组件并非Linux 标准的内容,它们实际上是纯软件的 内容和体系结构,与硬件平台无关。Android 专用驱动类似于Linux 内存 设备驱动程序。随着Andorid内核的升级,Android 专用驱动的目录几经 变化,在较新的版本中,主要的驱动程序放在drivers/staging/android/目 录中,另外也有几个驱动程序分布在其他的目录中。
– 主要的Android 专用驱动如下:
① Binder:基于OpenBinder系统的驱动,为Android 平台提供IPC 支持;
② Logger:轻量级的log 驱动;
③ LowMemoryKiller:缺少内存的情况下,杀死进程;
④ Ashmem:匿名共享内存;
⑤ PowerManagement(PM):电源管理模块;
⑥ PMEM:物理内存驱动。
② Android 使用的设备驱动:
– 作为主要为智能手机定制的操作系统,Android 通常使用Linux 中 一些标准的设备驱动程序。
– Android 使用的设备驱动有:
① Framebuffer 显示驱动;
② Event 输入设备驱动;
③ ASLA 音频驱动;
④ WLAN 驱动;
⑤ 蓝牙驱动等。
• Android 内核目录结构
– Android 内核结构和标准Linux 4.1.15 内核基本上相同,IMX6 综合嵌入式 教学科研平台(实验箱)运行的Android 内核版本位于 /Android/myandroid/kernel_imx,其源码目录结构如图:
• arch:与体系结构相关的代码全部放在这里,我们的实验设备中使用的是其中的arm 目录。
• Documentation:这里存放着内核的所有开发文档,其中的文件会随版本的演变发生变化, 通过阅读这里的文件是获得内核最新的开发资料的最好的地方。
• drivers:此目录包括所有的驱动程序,下面又建立了多个目录,分别存放各个分类的驱动程 序源代码。drivers 目录是内核中最大的源代码存放处,大约占整个内核的一多半。其中我们 经常会用到的目录有:
– drivers/char:字符设备是drivers 目录中最为常用,也许是最为重要的目录,因为其中包含了大量与 驱动程序无关的代码。通用的tty层在这里实现,console.c定义了linux终端类型,vt.c中定义了虚拟 控制台;lp.c中实现了一个通用的并口打印机的驱动,并保持设备无关性;kerboard.c实现高级键盘 处理,它导出handle_scancode 函数,以便于其他与平台相关的键盘驱动使用。
– driver/block:其中存放所有的块设备驱动程序,也保存了一些设备无关的代码。如nbd.c实现了网络 块设备,loop.c实现了回环块设备。
– drives/ide:专门存放针对IDE 设备的驱动。
– drivers/scsi:存放SCSI 设备的驱动程序,当前的cd 刻录机、扫描仪、U 盘等设备都依赖这个SCSI 的 通用设备。
– drivers/staging:Android 专用驱动程序大部分存放在这个目录中。
– drivers/net:存放网络接口适配器的驱动程序,还包括一些线路规程的实现,但不实现实际的通信协 议,这部分在顶层目录的net 目录中实现。
– drivers/video:这里保存了所有的帧缓冲区视频设备的驱动程序,整个目录实现了一个单独的字符设 备驱动。/dev/graphics/fb/fb 设备的入口点在fbmem.c文件中,该文件注册主设备号并维护一个此设 备的清单,其中记录了哪一个帧缓冲区设备负责哪个次设备号。
– drivers/media:这里存放的代码主要是针对无线电和视频输入设备,比如目前流行的usb摄像头。
• fs:此目录下包括了大量的文件系统的源代码,其中在嵌入式开发中要使用的包括:devfs、cramfs、ext2、 jffs2、romfs、yaffs、vfat、nfs、proc 等。 文件系统是Linux 中非常重要的子系统,这里实现了许多重要的 系统调用;用于文件访问的系统调用在open.c、read_write.c等文件中定义,select.c实现了select 和poll 系统调用,pipe.c和fifo.c 实现了管道和命名管道,mkdir、rmdir、rename、link、symlink、mknod 等系统 调用在namei.c中实现。文件系统的挂装和卸载和用于临时根文件系统的initrd在super.c中实现。 Devices.c 中实现了字符设备和块设备驱动程序的注册函数;file.c、inode.c实现了管理文件和索引节点内部 数据结构的组织。Ioctl.c实现ioctl系统调用。
• include:内核所有头文件存放的地方,其中Linux 目录是头文件最多的地方,也是驱动程序经常要包含的 目录。
• init:Linux 的main.c 程序,通过这个比较简单的程序,我们可以理解Linux 的启动流程。
• ipc:systemV的进程间通信的原理实现,包括信号量、共享内存。
• kernel:这个目录下存放的是除网络、文件系统、内存管理之外的所有其他基础设施,其中至少包括进程调 度sched.c,进程建立fork.c,定时器的管理timer.c,中断处理,信号处理等。
• lib:包括一些通用支持函数,类似于标准C 的库函数。其中包括了最重要的vsprintf函数的实现,它是 printk 和 sprintf 函数的核心。还有将字符串转换为长整形数的simple_atol函数。
• mm:包含实现内存管理的代码,包括所有与内存管理相关的数据结构,我们在驱动中需要使用的kmalloc 和kfree 函数在slab.c 中实现,mmap定义在mmap.c中的do_mmap_pgoff函数。将文件映射到内存的实现 在filemap.c 中,mprotect 在mprotect.c,remap 在 remap.c 中实现;vmscan.c中实现了kswapd内核线程。
• net:包含了套接字抽象和网络协议的实现,每一种协议都建立了一个目录,但是其中的core、bridge、 ethernet、 sunrpc、khttpd 不是网络协议。我们使用最多的是ipv4、ipv6、802、ipx等。
• scripts:这个目录存放许多脚本,主要用于配置内核。
• 11.4 Android 子系统介绍
• Android 是一个庞大的手机的系统,它不仅仅实现了手机的基本的打 电话,发信息的功能,还实现了更复杂的多媒体处理、2D 和3D 游戏 处理、信息感知处理等。
• Android 的子系统主要包含:
① Android RIL 子系统:Radio Interface Layer(简称:RIL子系统,即:无 线电接口层子系统)用于管理用户的电话、短信、数据通信等相关功 能,它是每个移动通信设备必备的系统。
② Android Input 子系统:Input 输入子系统用来处理所有来自己用户的输 入数据,如:触摸屏,声音控制物理按键等。
③ Android GUI 子系统:GUI 即:图形用户接口子系统,也就是所谓的图 形界面,它用来负责显示系统图形化界面,形象让用户和系统操作及 信息进行交互。Android 的GUI 系统和其它各子系统关系密切相关,是 Android 中最重要的子系统之一,如:绘制一个2D 图形、通过 OpenGL 库处理3D 游戏、通过SurfaceFlinger(Android 中图形混合器, 用于将屏幕上显示的多个图形进行混合显示)来重叠几个图形界面。
④ Android Audio 子系统:Android 的音频处理子系统,主要用于音频方 面的数据流传输和控制功能,也负责音频设备的管理。Android 的 Audio 系统和多媒体处理紧密相连,如:视频的音频处理和播放、电话 通信及录音等。
⑤ Android Media 子系统:Android 的多媒体子系统,它是Android 系统 中最庞大的子系统,与硬件编解码、OpenCore多媒体框架、Android 多媒体框架等相关,如:音频播放器,视频播放器,Camera 摄像预览 等。
⑥ Android Connectivity 子系统:Android 连接子系统是智能设备的重要组 成部分,它除了一般所谓的网络连接,如:以太网、WIFI 外,还包含: 蓝牙连接、GPS 定位连接、NFC 等。
⑦ Android Sensor 子系统:Android 的传感器子系统为当前智能设备大大 提高了交互性,它在创新应用程序和应用体验里发挥了重要作用,传 感器子系统和手机的硬件设备紧密相关,如:gyroscope 陀螺仪、 accelerometer 加速度计、proximity 距离感应器、magnetic 磁力传感器 等。
• 11.5 Android 应用程序开发过程
• Android 应用程序开发是基于Android 架构提供的API 和类库编 写程序,这些应用程序是完全的Java 代码程序,它们构建在 Android 系统提供的API 之上。
• Android 开发方式:开发Android 应用程序可以基于Google 提 供的Android SDK 开发工具包,也可以直接在Android 源码中进 行编写。
① Android SDK 开发:它提供给程序员一种最快捷的开发方式,基于IDE 开发环境(Android Studio)和SDK 套件(Android SDK),快速开发出 标准的Android 应用程序,但是,对于一些要修改框架代码或基于自 定义API 的高级开发,这种方式难以胜任。
② Android 源码开发:基于Android 提供的源码进行开发,可以最大体现 出开源的优势,让用户自定义个性的Android 系统,开发出更高效、 更与众不同的应用程序,这种方式更适合于系统级开发,对程序员要 求比较高。
API:Application Programming Interface,应用程序接口
SDK:Software Development Kit,软件开发工具包
IDE:Integrated Development Environment,集成开发环境
• Android 源码开发过程:
① 搭建开发环境:根据两种开发方式的不同,搭建开发环境略有不同。 如果侧重于系统底层源码开发,则采用第二种开发方式(Android 源码 开发);如果侧重于应用软件开发,则采用第一种开发方式(Android SDK 开发)。
② 下载Android 源码:得益于Android 的开源特点,Android 源码中包含 大量宝贵的技术知识,我们可以在阅读源码过程中更深入的了解 Android 系统的奥秘,为我们编写更高效、更有特点的应用程序打下基 础,同时能展现给读者一个更庞大系统的设计蓝图,为系统设计师及 项目经理提供参考价值。同时,Android 的源码中提供的应用程序示例、 设计模式、软件架构,为我们编写大型应用程序提供经验。
③ 编译Android 源码:通过编译Android 源码,生成我们开发环境及目 标系统,为我们做系统底层开发、系统定制与优化做准备,通过分析 编译过程,让我们学习到大型工程的代码管理与编译原理。
④ 配置开发环境:为了更有效的开发,我们通常会对开发环境做配置, 不同的程序员可能会有不同的编程习惯。
• 11.6 Android 源码目录结构