了解安卓架构(linux内核层、系统运行库层、应用框架层、应用层)

首先为了理解安卓系统是怎么工做的,就先来看一下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虚拟机两部分。

系统库(九个):
一、Libc:系统c库 ,是从BSD继承来的标准C系统函数库,专门为基于EmbeddedLinux的设备定制。
二、Media Framework (多媒体库):Android系统多媒体库,基于PacketVideoOpen、CORE。该库支持录放.而且能够录制许多流行的音频视频格式.还有静态映像文件,包括MPEG四、H.26四、MP三、AAC、JPG、PNG等。
三、Surface Manager :主要负责管理针对显示系统的访问,而且为多个应用程序提供2D和3D图层的无缝融合。
四、Webkit:浏览器 。一个最新的web浏览器引擎,用来支持Android浏览器和一个可嵌入的Web视图。
五、SGL: 一个内置的2D图形引擎。
六、SSL: 位于TCP/IP与各类应用层协议之间为数据通讯提供支持。
七、OpenGL ES :3D效果的支持。基于OpenGLES 1.0 APIs实现;该库可使用硬件3D加速或者使用高度优化的3D软加速。
八、greeType :提供位图bitmap和向量vector的字体描述与显示。
九、SQLite :一个对于全部应用程序可用、功能强劲的轻型关系型数据库引擎

除了之上的主要系统类库以外,还有Android NDK,即Android原生库。NDK为开发者提供了直接使用Android系统资源,并采用C 或C++语言编写程序的接口。所以,第三方应用程序能够不依赖于Dalvik虚拟机进行开发。NDK提供了一系列从C或C++生成原生代码所须要的工具,为开发者快速开发 C 或 C++的动态库提供方便,并能自动将生成的动态库和Java 应用程序一块儿打包成应用程序包文件,即.apk文件。
注意,使用原生库没法访问应用框架层API,兼容性可能没法保障。并且从安全性角度考虑,Android原生库用非类型安全的程序语言C/C++编写,更容易产生安全漏洞,原生库的缺陷也可能更容易直接影响应用程序的安全性。

Android运行时:
一、 核心库:提供了Java语言API中的大多数功能,同时也包含Android的一些核心API.如android.OS、android.net、android.media等。

二、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.应用层

全部安装在手机上的应用程序都是这个层,好比手机自带的程序或者下载的游戏等等。