首先为了理解安卓系统是怎么工作的,就先来看一下android的系统架构,其架构大至可以分为四层:linux内核层、系统运行库层、应用框架层和应用层,那就先说说这几层。
1.linux内核层:
Android系统是基于Linux内核的,这一层为Android设备的各种硬件提供了底层的驱动(如显示,音频,照相机,蓝牙,WI-FI,电源管理等等),那么Android为什么会选择采用linux呢?原因与Linux的特性有关,内核作为一个抽象层存在硬件和软件之间,强大的内存管理和进程管理,基于权限的安全模式,支持共享库,经过认证的驱动模式,Linux本身就是开源项目等等。
但同时Android对于Linux进行了改动,比如它没有glibc,最初用于一些便携的移动设备并没有采用glibc作为c库,而是goolge自己开发的Bionic Libc来作为代替品,也并没有完全照搬Linux系统的内核还增加了Gold-Fish平台以及yaffs2 Flash文件系统,而且它没有了本地基于x服务的窗口系统即Android并没有使用Linux的x窗口,同时还对驱动程序进行了增强显示驱动、键盘驱动、Flash内存驱动、照相机驱动、音频驱动、蓝牙驱动、WiFi驱动、Binder IPC驱动、Power Management(电源管理),包括硬件时钟,内存分配和共享,低内存管理,kernel调试,日志设备,android IPC机制,电源管理等。
1)Binder IPC驱动:基于OpenBinder框架的一个驱动,用于提供 Android平台的进程间通信功能。源代码位于drivers/staging/android/binder.c。
2)电源管理(PM) :一个基于标准Linux电源管理系统的轻量级Android电源管理驱动,针对嵌入式设备做了很多优化,比如电池电量。源代码位于:kernel/power/earlysuspend.c、kernel/power/consoleearlysuspend.c、kernel/power/fbearlysuspend.c、kernel/power/wakelock.c、kernel/power/userwakelock.c
3)低内存管理器:比Linux的标准的OOM机制更加灵活,它可以根据需要杀死进程以释放需要的内存。源代码位于 drivers/staging/ android/lowmemorykiller.c。
4)匿名共享内存: 为进程间提供大块共享内存,同时为内核提供回收和管理这个内存的机制。源代码位于mm/ashmem.c。
5) PMEM :用于向用户空间提供连续的物理内存区域,DSP和某些设备只能工作在连续的物理内存上。源代码位于drivers/misc/pmem.c。
6) Logger :一个轻量级的日志设备,用于抓取Android系统的各种日志。源代码位于drivers/staging/android/logger.c。
7) Alarm :提供了一个定时器,用于把设备从睡眠状态唤醒,同时它还提供了一个即使在设备睡眠时也会 运行的时钟基准。源代码位于drivers/rtc/alarm.c。
8)USB Gadget:驱动 一个基于标准 Linux USB gadget驱动框架的设备驱动,Android的USB驱动是基于gaeget框 架的。源代码位于drivers/usb/gadget/。
9)Ram Console: 为了提供调试功能,Android允许将调试日志信息写入一个被称为RAM Console的设备里,它是一个基于RAM的Buffer。源代码位于drivers/staging/android / ram_console.c。
10)timed device: 提供了对设备进行定时控制的功能,目前支持vibrator和LED设备。源代码位于drivers/staging/android /timed_output.c(timed_gpio.c)。
11)Yaffs2 :是文件系统 Android采用Yaffs2作为MTD nand flash文件系统,源代码位于fs/yaffs2/目录下。Yaffs2是一个快速稳定的应用于NAND和NOR Flash的跨平台的嵌入式设备文件系统,同其他Flash文件系统相比,Yaffs2能使用更小的内存来保存其运行状态,因此它占用内存小。Yaffs2的垃圾回收非常简单而且快速,因此能表现出更好的性能。Yaffs2在大容量的NAND Flash上的性能表现尤为突出,非常适合大容量的Flash存储。
那么为什么不自己开发一个内核而是使用Linux内核,这个牵扯到很多尽量描述一下,首先当时有了开源的Linux为什么还要在自己去开发内核,android的本质是一个基于Linux上运行的java虚拟机,Google只用了kernel所以只有系统的底层结构是一样的其他的东西在Android里都是不一样的尤其是编程接口,所以Android距离Linux比MAC OS距离Linux还要远。android是被google收购的,原来的小团队没有时间和精力去研发所以使用了上面说的开源的Linux(免费还免维护费),同时因为google是一个互联网公司,google是靠服务来盈利不像Apple是设备商依靠软件给设备服务,所以google是一个纯粹的软件提供者,为了让硬件厂商能够合作需要从硬件的角度思考问题(硬件厂商更愿意再有一定把握的平台进行开发),同时google也有比较好的对应措施去弥补Linux操作系统的一些缺点,从技术上失去了一些动力。
关于内核的作用简单说就是提供了进程管理、文件网络管理、系统安全权限管理、以及系统与硬件设备通讯基础。而在无论Android还是iOS这类高度依赖框架的多层次操作系统上,内核对上层开发者来说是几乎不可见的,只能通过开放给你的框架接口进行相关操作。因此可以说内核对整个系统来说是基础性的,而非功能性。就整个Android工程来说主体交互、功能框架才是重中之重。再说说开发内核到底有多大好处,或者说性价比有多高的问题。作为整套系统的基础,内核的高效稳定可以说是重重之重,而任何一款软件的开发都要经历迭代过程,微软开发NT内核耗费大量资金与时间,而且至今还在不断改进与维护正是对此种迭代的最佳例证。而即使如此,经过将近十年的开发与维护,NT内核之效率与功能性仍弱于Linux。由于Linux的开源特性,大量个人与企业对其进行持续不断的维护与改进是Linux始终保持领先的重要原因,而微软以其一己之力自不能与其媲美。这实际上是告诉大家在已有开源Linux的前提下,自己开发系统内核实际上是一件吃力不讨好的事。因此使用来源Linux自然是省时省力省钱又保险的选择。另外值得一提的是苹果自主研发内核实际上是不准确的iOS与OSX其实都是基于UNIX内核。
2.系统运行库层:
通过一些c/c++库来为Android提供主要的特性支持,如SQLite提供了数据库的支持,OpenGL|ES库提供了3D绘图的支持,WebKit库提供了浏览器内核的支持等等。同时在这一层的还有Android运行时库提供了一些核心库,能够允许开发者使用JAVA语言来编写Android应用。还包含了虚拟机Dalvik但之后改为了ART运行环境,使每一个Android应用都有自己的进程,并且都有一个自己的Dalvik虚拟机实例,相较于JAVA的虚拟机Dalvik是专门为移动设备定制的,针对内存和CPU性能都有了优化。
所以Android的系统运行库包含两部分,一个是系统库,另一个是运行时,Android系统的各个组件都在使用c/c++库,这些功能是通过Android应用框架暴露给开发人员的,系统库是应用程序框架的支撑,是连接应用程序框架层与Linux内核层的重要纽带,在程序运行时中执行其运行时分为核心库和Dalvik虚拟机两部分。
系统库(九个):
1、Libc:系统c库,是从BSD继承来的标准C系统函数库,专门为基于EmbeddedLinux的设备定制。
2、Media Framework(多媒体库):Android系统多媒体库,基于PacketVideoOpen、CORE。该库支持录放.并且可以录制许多流行的音频视频格式.还有静态映像文件,包括MPEG4、H.264、MP3、AAC、JPG、PNG等。
3、Surface Manager:主要负责管理针对显示系统的访问,并且为多个应用程序提供2D和3D图层的无缝融合。
4、Webkit:浏览器。一个最新的web浏览器引擎,用来支持Android浏览器和一个可嵌入的Web视图。
5、SGL:一个内置的2D图形引擎。
6、SSL:位于TCP/IP与各种应用层协议之间为数据通信提供支持。
7、OpenGL ES:3D效果的支持。基于OpenGLES 1.0 APIs实现;该库可以使用硬件3D加速或者使用高度优化的3D软加速。
8、greeType:提供位图bitmap和向量vector的字体描述与显示。
9、SQLite:一个对于所有应用程序可用、功能强劲的轻型关系型数据库引擎
除了之上的主要系统类库之外,还有Android NDK,即Android原生库。NDK为开发者提供了直接使用Android系统资源,并采用C 或C++语言编写程序的接口。因此,第三方应用程序可以不依赖于Dalvik虚拟机进行开发。NDK提供了一系列从C或C++生成原生代码所需要的工具,为开发者快速开发 C 或 C++的动态库提供方便,并能自动将生成的动态库和Java 应用程序一起打包成应用程序包文件,即.apk文件。
注意,使用原生库无法访问应用框架层API,兼容性可能无法保障。而且从安全性角度考虑,Android原生库用非类型安全的程序语言C/C++编写,更容易产生安全漏洞,原生库的缺陷也可能更容易直接影响应用程序的安全性。
Android运行时:
1、核心库:提供了Java语言API中的大多数功能,同时也包含Android的一些核心API.如android.OS、android.net、android.media等。
2、Dalvik虚拟机:Android程序不同于J2ME程序(是java的一种运行环境),每个Android应用都运行在自己的进程上,享有Dalvik虚拟机为它分配的专有实例,并在该实例中执行。Dalvik虚拟机是一种基于寄存器的Java虚拟机,而不是传统的基于栈的虚拟机,并进行了内存资源使用的优化以及支持多个虚拟机的特点。设计成在一个设备可以高效地运行多个虚拟机。Dalvik虚拟机可执行文件格式是(.dex),dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。 大多数虚拟机包括JVM都是基于栈的,而Dalvik虚拟机则是基于寄存器的,所有的类都经由JAVA编译器编译,然后通过SDK中 的 "dx" 工具转化成.dex格式由虚拟机执行。Java编译器将Java源文件转为class文件,class文件又被内置的dx(具有转化为dex格式文件,该格式文件针对最小内存使用做了优化,这种文件在Dalvik虚拟机上注册并运行)。在一些底层功能方面,例如线程和低内存管理等.Dalvik虚拟机是依赖Linux内核的。
Dalvik虚拟机是基于Apache的Java虚拟机,并被改进以适应低内存、低处理器速度的移动设备环境。Dalvik虚拟机依赖于Linux内核,实现进程隔离与线程调度管理、安全和异常管理、垃圾回收等重要功能。但Dalvik虚拟机并非传统意义上的Java虚拟机(JVM)。Dalvik虚拟机不仅不按照Java虚拟机的规范来实现而且两者不兼容。
Dalvik和标准Java虚拟机有以下主要区别:
(1)Dalvik基于寄存器,而JVM基于栈。一般认为,基于寄存器的实现虽然更多依赖于具体的CPU结构,硬件通用性稍差,但其使用等长指令,在效率速度上较传统JVM更有优势。
(2)Dalvik经过优化,允许在有限的内存中同时高效地运行多个虚拟机的实例,并且每一个Dalvik应用作为一个独立的Linux进程执行,都拥有一个独立的Dalvik虚拟机实例。Android这种基于Linux的进程“沙箱”机制,是整个安全设计的基础之一。
(3)Dalvik虚拟机从DEX(Dalvik Executable)格式的文件中读取指令与数据,进行解释运行。DEX文件由传统的、编译产生的CLASS文件,经dx工具软件处理后生成。
(4 )Dalvik的DEX文件还可以进一步优化提高运行性能。OEM的应用程序可以在系统编译后,直接生成优化文件(.ODEX文件),第三方的应用程序则可在运行时在缓存中优化与保存,优化后的格式为DEY(.dey文件)。
3.应用框架层:
这一层主要提供了构建应用程序时可能用到的各种API,Android自带的一些核心应用就是使用这些API完成的。那什么是应用程序框架层,可以说是一个应用程序的核心,是一个共同使用和遵守的约定然后在这个约定上共同扩展,但程序保持主体结构的一致,其作用的是让程序保持清晰在满足不同需求的同时又不互相影响。而对于Android来提供给应用开发者的本身就是一个框架,所有的应用开发都必须遵守这个框架的原则,同时在这个基础上进行扩展可以访问核心应用程序所使用的API框架(即要实现某个功能就调用安卓系统自己提供的功能,如果不想调用就可以通过继承实现个性化扩展),安卓的应用框架提供开发Android应用程序所需的一系列类库采用重用机制,开发人员可以进行快速的应用程序开发方便高效的使用安桌平台本身的组件或者替换平台本身的各种应用程序组件。
该框架包含:活动管理器、窗口管理器、内容提供者、视图系统、包管理器、电话管理器、资源管理器、位置管理器、通知管理器、XMPP服务。
活动管理器:管理各个应用程序的生命周期以及通常的导航回退功能。作用:负责一新ActivityThread进程创建,Activity生命周期的维护。其自身也存在一个框架,本文就不再讨论,有兴趣的可以看一看。
窗口管理器:管理所有的窗口程序,在安卓应用框架中窗口主要分为两种:
(一)是应用窗口(一个activity有一个主窗口,弹出的对话框也有一个窗口,Menu菜单也是一个窗口。在同一个activity中,主窗口、对话框、Menu窗口之间通过该activity关联起来)。
(二)是公共界面的窗口(系统级别的窗口如:最近运行对话框、关机对话框、状态栏下拉栏、锁屏界面等)窗口管理系统是基于C/S模式的。整个窗口系统分为服务端和客户端两大部分,客户端负责请求创建窗口和使用窗口,服务端完成窗口的维护,窗口显示等。
内容提供器:使得不同应用程序之间存取或者分享数据。就是可以配置自己的Content Provider去存取其他的应用程序或者通过其他应用程序暴露的Content Provider去存取它们的数据,总的来说就是提供了一个数据共享机制。
视图系统:构建应用程序的基本组就是文本框、按钮等。
通告管理器:使得应用程序可以在状态栏显示自定义的提示信息,通过NotificationManager 、 Notification这两个类可以完成在状态栏显示提示的信息。
包管理器:安卓系统内的程序管理,Package Manger是一个实际上管理应用程序安装、卸载和升级的API。当我们安装APK文件时,Package Manager会解析APK包文件和显示确认信息。
电话管理器:管理所有的移动设备 用于管理手机通话状态、获取电话信息(设备、sim卡、网络信息),监听电话状态以及调用电话拨号器拨打电话。
资源管理器:提供应用程序使用的各种非代码资源。提供应用程序使用的各种非代码资源,如本地化字符串、图片、布局文件、颜色文件等
位置管理器:提供位置服务,LocationManager系统服务是位置服务的核心组件,它提供了一系列方法来处理与位置相关的问题,包括查询上一个已知位置、注册和注销来自某个。LocationProvider的周期性的位置更新、注册和注销接近某个坐标时对一个已定义的Intent的触发等。总的来说就是提供有关位置的操作。
XMPP服务:例如提供Google Talk 服务,XMPP(Extensible Messageing and Presence Protocol:可扩展消息与存在协议):是一种即时消息协议用于信息的传输。是一种基于XML的开放式实时通信协议,XMPP是基于服务器的也是分散式的
4.应用层
所有安装在手机上的应用程序都是这个层,比如手机自带的程序或者下载的游戏等等。