学习一个新的知识,我总想对其有一个直观的印象。在这基础上,会产生一种偷窥的欲望,想通过窥视它的冰山一角,了解它内部秘密。 撕开它神秘的面纱的时候到了,让我们拭目以待(哈哈):
1.Android系统架构图
网上找了一些,觉得就这张比较全面一些,请大家鉴赏:
2. Android的系统架构分为四层:应用,应用框架层,系统运行库,Linux kernal内核层
对于一个成熟的操作系统来说,分层是必须的,因为分层可以屏蔽差异,可以提供抽象,可以减小改动带来的影响,提高系统健壮性和可扩展性等等等(此处省略10000字),大家都懂的哈......
1.Android应用层
应用层就是我们基于Android平台开发的JAVA程序,不过它有着自己的格式,包括资源文件,JAVA程序等,最终生成一个.apk的包,而这个就是我们经常下载使用的程序安装包。这个程序运行在Dalvik 虚拟机上(类似JVM,根据手机特性进行了一些修改和变化)。Google在Android中内置了一些必要的应用程序,如联系人,拨号,短信,主屏幕,日历,地图,浏览器等程序。与其他手机操作系统固化在系统内部的系统软件不同,这些应用程序都是可以被开发人员开发的其他应用程序所替换。
应用程序开发者可以使用Android的API 实现自己的程序。这个就是Android开发者所征战的主战场--Android应用开发。
2.应用程序框架层
Android的应用程序框架主要为Android开发者提供API框架,我们的程序都是通过框架与Android底层进行交互的。个人觉得跟windows/linux API是一个层面的东西。
应用程序框架层主要包括以下各种控件:
- View 视图:可以用来构建应用程序,包括List, Grid, TextBox, Button 以及可嵌入的Web浏览器。
- Content Providers 内容提供器: 让一个应用程序访问另一个程序的数据,或共享自己的数据。
- Resource Manager资源管理器:提供非代码资源的访问,如本地字符串,图形和布局文件(Layout file).
- Nofitication Manager通知管理器: 应用可以在状态栏中显示自定义的提示信息。
- Activity Manager活动管理器:用来管理应用程序生命周期并提供常用的导航退回功能。
- Window Manager窗口管理器:管理所有的窗口程序。
- Package Manager包管理器:Android系统内的程序管理。
下面是Android框架组件的四大天王:
Activity (活动)
Broadcast Intent Receiver (广播意图接收者)
Service (服务)
Content Provider (内容提供者)
3. 系统运行库层(C/C++库和Android运行环境RunTime)
本层次对应一般嵌入式系统,相当于中间件层次。Android的本层次分成两个部分一个是各种库,另一个是Android 运行环境。本层的内容 大多是使用C++实现的。当使用Application Framwork 层时,Android系统通过C/C++库支持我们使用的Application Framework内的各个组件。
C/C++库包括:
- Bionic系统C库:这也是系统中一个最为底层的库,C库是通过Linux的系统调用来实现。
- MediaFramework多媒体库:Android系统的多媒体库的核心部分,基于PacketVideo(即PV)的 OpenCORE, 此库从功能上一共分为两大部分,一部分是音频,视频的回放(PlayBack),另一部分是音视频的记录(Recorder)。此库支持多种常见格式的音频,视频的回放和录制,以及图片,MPEG4, MP3, AAC, AMR, JPG, PNG等。
- SGL:2D图形引擎库
- SSL:即Secure Socket Layer位于TCP/IP协议与各种应用层协议之间,为数据通信提供安全支持。
- OpenGL ES 1.0:提供3D 的支持
- Surface Management界面管理工具:提供了对管理显示子系统等功能。
- SQLite: 一个通用的嵌入式关系数据库。
- Webkit: web 网络浏览器引擎
- FreeType:位图(Bitmap)及矢量字体(Vector)的功能
Android的各种库一般是以系统中间件形式提供的,它们均有的一个显著特点就是与移动设备的平台的应用密切相关。
Android 运行环境主要指的虚拟机技术——Dalvik。Android中的所有Java程序都是运行在Dalvik VM上的。Android上的每个程序都有自己的线程,DVM只执行.dex的Dalvik executable 文件。每个Android应用在底层都对应有一个独立的DVM实例并在其解释下执行。
虽然DVM也是用Java编程语言,Dalvik虚拟机和一般JAVA虚拟机(Java VM)并不兼容,他们两个的区别是JVM标准执行的是.class的字节码(bytecode ),而是DVM执行的是其专有的(.dex)执行文件。在编译过程中,Java把类编译成一个或多个.class byte code 文件,然后打包到jar中,JVM会从中jar文件中获得相应的.class文件和JRE字节码。 Android VM虽然也是是用Java语言进行编程, Java程序通过编译后,还需要通过SDK中的dex工具转化成.dex格式,DVM再从其中读取指令和数据。
每一个应用程序即一个进程(Linux的一个Process)。 二者最大的区别在于Java VM是以基于栈的虚拟机(Stack-based),而Dalvik是基于寄存器的虚拟机(Register-based)。 显然,后者最大的好处在于可 以根据硬件实现更大的优化,这更适合移动设备的特点。
DVM非常适合在移动终端上使用,与PC相比,它不需要很快的CPU和大量的内存空间. Google的测算显示,64MB的内存已经能让系统正常运转了。 其中24MB被用于底层系统的初始化和启动。另外20MB被用于启动高层服务。DVM有如下特征:
- 使用专有的.dex格式。
- 原因是java类文件在编译过后,会产生至少一个.class文件包含大量陈余信息,dex文件格式会把所有的.class文件内容整合到一个.dex文件中。即减少了整体文件的尺寸和IO操作,也提高了类的查找速度。
- 增加了对新的操作码的支持
- 文件结构尽量简洁,使用等长的指令,借以提高解析速度。
- 尽量扩大只读结构的大小,借以提高跨进程的数据共享。
- dex的优化,dex文件的结构是紧凑的,但是如果想提高运行时的性能,就需要对dex文件进行进一步的优化,这些优化针对以下几个方面:
- 验证dex文件中的所有类
- 对一些特定的类和方法里面的操作码进行优化
- 调整所有的字节序(Little_endian)和对齐结构中的每一个域
- 基于寄存器,基于寄存器的虚拟机虽然比基于堆栈的虚拟机在硬件,通用性上要差一些,但是它的代码执行效率去更好
- 每一个Android应用都运行在它自己的DVM实例中,每一个DVM实例都是一个独立的进程空间。 所有的Android应用的线程都对应一个Linux线程,DVM因此可以更多地依赖操作系统的线程调度和管理机制。不同的应用在不同的进程空间里运行,不同的应用都是用不同的Linux用户来运行以最大程度地保户应用程序的安全性和独立性。
4. Linux kernal 内核
Android使用Linux2.6内核作为操作系统,Linux2.6是一种标准的技术,Linux也是一个开放的操作系统。Android系统的安全性,内存管理,进程管理,网络协议栈和驱动模型等都依赖于该Linux2.6内核。该内核同时也作为硬件和软件栈之间的抽象层。
Android对操作系统的使用包括核心和驱动程序两部分 ,Android更多的是需要一些与移动设备相关的驱动程序。 主要的驱动如下所示:
显示驱动(Display Driver):基于Linux的帧缓冲(Frame Buffer)驱动
键盘驱动(KeyBoard Driver): 作为输入设备的键盘驱动
Flash内存驱动(Flash Memory Driver): 基于MTD的Flash驱动程序
照相机驱动(Camera Driver): 常用基于Linux的v4l2(Video for Linux)驱动。
音频驱动(Audio Driver): 常用基于ALSA(Advanced Linux Sound Architecture),高级Linux声音体系)驱动
蓝牙驱动(Bluetooth Driver): 基于IEEE 802.15.1标准的无线传输技术
WiFi驱动(Camera Driver): 基于IEEE 802.11标准的驱动程序
Binder IPC驱动: Android一个特殊的驱动程序,具有单独的设备节点,提供进程间通讯的功能
Power Management(电源管理):比如电池电量等
在Android中,各种包写成android.*的方式,重要包的描述如下所示:
-
android.app :提供高层的程序模型、提供基本的运行环境
- android.content :包含各种的对设备上的数据进行访问和发布的类
- android.database :通过内容提供者浏览和操作数据库
- android.graphics :底层的图形库,包含画布,颜色过滤,点,矩形,可以将他们直接绘制到屏幕 上.
- android.location :定位和相关服务的类
- android.media :提供一些类管理多种音频、视频 的媒体接口
- android.net :提供帮助网络 访问的类,超过通常的java.net.* 接口
- android.os :提供了系统服务、消息传输、IPC机制
- android.opengl :提供OpenGL的工具
- android.provider :提供类访问Android的内容提供者
- android.telephony :提供与拨打电话相关的API交互
- android.view :提供基础的用户界面接口框架
- android.util :涉及工具性的方法,例如时间日期的操作
- android.webkit :默认浏览器操作接口
- android.widget :包含各种UI元素(大部分是可见的)在应用程序的屏幕中使用