Android平台采用了整合的策略思想,包括底层Linux操作系统、中间层的中间件和上层的Java应用程序。下面我把Android的特性及其架构体系结构总结一下。

一、Android的平台特性

  Android平台有如下特性:

  1. 应用程序框架支持组件的重用与替换。

  这样我们可以把系统中不喜欢的应用程序删除,安装我们喜欢的应用程序。

  2. Dalvik虚拟机专门为移动设备进行了优化。

  Android应用程序将由Java编写、编译的类文件通过DX工具转换成一种后缀名为.dex的文件来执行。Dalvik虚拟机是基于寄存器的,相对于Java虚拟机速度要快很多。

  3. 内部集成浏览器基于开源的WebKit引擎。

  有了内置的浏览器,这将意味着WAP应用的时代即将结束,真正的移动互联网时代已经来临,手机就是一台“小电脑”,可以在网上随意遨游。

  4. 优化的图形库包括2D和3D图形库,3D图形库基于OpenGL ES 1.0。

  强大的图形库给游戏开发带来福音。在3G最为重要的的应用莫过于手机上网和手机游戏。

  5. SQLite用作结构化的数据存储。

  6. 多媒体支持包括常见的音频、视频和静态印象文件格式

  如MPEG4、H.264、MP3、AAC、AMR、JGP、PNG、GIF。

  7. GSM电话(依赖于硬件)。

  8. 蓝牙(Bluetooth)、EDGE、3G、WiFi(依赖于硬件)。

  9. 照相机、GPS、指南针和加速度计(依赖于硬件)。

  10. 丰富的开发环境包括设备模拟器、调试工具、内存及性能分析图表和Eclipse集成的开发环境插件。

  Google提供了Android开发包SDK,其中包含了大量的类库和开发工具,并且针对Eclipse的可视化开发插件ADT。

1. 程序应用

  Android 连同一个核心应用程序包一起发布,该应用程序包包括E-mail客户端、SMS短消息程序、日历、地图、浏览器、联系人管理程序等。所有的应用程序都是用Java编写的。

  2. 应用程序框架

  开发者完全可以访问核心应用程序所使用的API框架。该应用程序框架架构用来简化组件软件的重用,任何一个应用程序都可以发布它的功能块并且任何其他的应用程序都可以使用其所发布的功能块(不过得遵循框架的安全性限制)。该应用程序重用机制使得组件可以被用户替换。

  以下所有的应用程序都由一系列的服务和系统组成,包括:

  1)一个可扩展的视图(Views)可以用来创建应用程序,包括列表(lists)、网络(grids)、文本框(text boxes)、按钮(buttons),甚至是一个可嵌入的Web浏览器。

  2)内容管理器(Content Providers)使得应用程序可以访问另一个应用程序的数据(如联系人数据库),或者共享它们自己的数据。

  3)一个资源管理器(Resource Manager)提供非代码资源的访问,如本地字符串、图形和分层文件(layout files)。

  4)一个通知管理器(Notification Manager)使得应用程序可以在状态栏中显示客户通知信息。

  5)一个活动类管理器(Activity Manager)用来管理应用程序生命周期并提供常用的导航回退功能。

  3. Android程序库

  Android包括一个被Android系统中各种不同组件所使用的C/C++集库。该库通过Android应用程序框架为开发者提供服务。

  以下是一些主要的核心库:

  1)系统C库:一个从BSD继承来的标准C系统函数库(libc),专门为基于Embedded Linux的设备定制。

  2)媒体库:基于PacketVideo OpenCORE;该库支持录放,并且可以录制许多流行的音频视频格式,还有静态映像文件包括MPEG4、H.264、MP3、AAC、JPG、PNG。

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

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

  5)SGL:一个内置的2D图形引擎。

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

  7)FreeType:位图(bitmap)和向量(vector)字体显示。

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

  4. Android运行库

  Android包括了一个核心库,该核心库提供了Java编程语言核心库的大多数功能。

  每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。Dalvik是针对同时高效地运行多个VMs实现的。Dalvik虚拟机执行.dex的Dalvik可执行文件,该格式文件针对最小内存使用做了优化。该虚拟机是基于寄存器的,所有的类都是经由Java汇编器编译,然后通过SDK中的DX工具转化成.dex格式由虚拟机执行。

  Dalvik虚拟机依赖于Linux的一些功能,比如线程机制和底层内存管理机制。

  5. Linux内核

  Android的核心系统服务依赖于Linux内核,如安全性、内存管理、进程管理、网络协议栈和驱动模型。Linux内核也同时作为硬件和软件栈之间的硬件抽象层。



------

安卓虚拟机即dalvik和java虚拟机的区别如下:
1.java虚拟机基于栈。 基于栈的机器必须使用指令来载入和操作栈上数据,所需指令更多更多 。而dalvik虚拟机是基于寄存器的:java虚拟机运行的是java字节码。(java类会被编译成一个或多个字节码.class文件,打包到.jar文件中,java虚拟机从相应的.class文件和.jar文件中获取相应的字节码)
2.Dalvik和Java之间的另外一大区别就是运行环境——Dalvik经过优化,允许在有限的内存中同时运行多个虚拟机的实例




Dalvik 和标准Java 虚拟机(JVM)首要差别 Dalvik 基于寄存器,而 JVM 基于栈。基于寄存器的虚拟机对于更大的程序来说,在它们编译的时候,花费的时间更短。 Dalvik 和Java 运行环境的区别 1:Dalvik主要是完成对象生命周期管理,堆栈管理,线程管理,安全和异常管理,以及垃圾回收等等重要功能。 2:Dalvik负责进程隔离和线程管理,每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例,其代码在虚拟机的解释下得以执行。 3:不同于Java虚拟机运行java字节码,Dalvik虚拟机运行的是其专有的文件格式Dex 4:dex文件格式可以减少整体文件尺寸,提高I/o操作的类查找速度。 5:odex是为了在运行过程中进一步提高性能,对dex文件的进一步优化。 6:所有的Android应用的线程都对应一个Linux线程,虚拟机因而可以更多的依赖操作系统的线程调度和管理机制 7:有一个特殊的虚拟机进程Zygote,他是虚拟机实例的孵化器。它在系统启动的时候就会产生,它会完成虚拟机的初始化,库的加载,预制类库和初始化的操作。如果系统需要一个新的虚拟机实例,它会迅速复制自身,以最快的数据提供给系统。对于一些只读的系统库,所有虚拟机实例都和Zygote共享一块内存区域。 8:Dalvik是由Dan Bornstein编写的,名字来源于他的祖先曾经居住过名叫Dalvík的小渔村,村子位于冰岛。



-----------

android系统源码目录system/framework下各个jar包的用途


  1. am.jar:终端下执行am命令时所需的java库。源码目录:framework/base/cmds/am
  2. android.policy.jar:锁屏界面需要用到的jar包,该包引用了android.test.runner.jar,源码目录:framework/base/policy
  3. android.test.runner.jar:测试应用所需的jar包,该包引用了core.jar,core-junit.ajr以及framework.jar,源码目录:framework/base/test-runner
  4. bmgr.jar:adb shell命令下对Android Device所有package备份和恢复的操作时所需的java库。官方文档:http://developer.android.com/guide/developing/tools/bmgr.html。不过这个android服务默认是Disabled,而且要backup的应用必须实现BackupAgent,在AndroidManifest.xml的application标签中加入android:backupAgent属性。源码目录:framework/base/cmds/bmgr
  5. bouncycastle.jar: java三方的密匙库,网上资料说用来apk签名、https链接之类,官网 :http://www.bouncycastle.org/java.html
  6. com.android.future.usb.accessory.jar:用于管理USB的上层java库,在系统编译时hardware层会调用到。源码目录:frameworks/base/libs/usb
  7. com.android.location.provider.jar:
  8. com.android.nfc_extras.jar:NFC外部库。android/nfc/NfcAdapter.java会调用到包中的NfcAdapterExtras.java。源码目录:frameworks/base/nfc-extras
  9. core-junit.jar :junit核心库,在运行*Test.apk时被调用。
  10. core-junitrunner.jar:未知,公司话机上有。
  11. core-tests*.jar:framework下的一系列测试jar包,不做测试时可删除。
  12. core.jar:核心库,启动桌面时首先加载这个。源码目录: 
  13. ext.jar:android外部三方扩展包,源码主要是external/nist-sip(java下的sip三方库)、external/apache-http(apache的java三方库)、external/tagsoup(符合SAX标准的HTML解析器)。其实这个jar包可以添加外部扩展jar包,只需在framework/base/Android.mk中的ext-dir添加src目录即可。
  14. framework-res.apk:android系统资源库。
  15. framework.jar:android的sdk中核心代码。
  16. ime.jar:ime命令所需jar包,用于查看当前话机输入法列表、设置输入法。源码目录:framework/base/cmds/ime
  17. input.jar:input命令所需的jar包,用于模拟按键输入。源码目录:framework/baes/cmds/input
  18. javax.obex.jar:java蓝牙API,用于对象交换协议。源码目录:framework/base/obex
  19. monkey.jar:执行monkey命令所需jar包。源码目录:framework/base/cmds/monkey
  20. pm.jar:执行pm命令所需的jar包,pm详情见adb shell pm,源码目录:framework/base/cmds/pm
  21. services.jar:话机框架层服务端的编译后jar包,配合libandroid_servers.so在话机启动时通过SystemServer以循环闭合管理的方式将各个service添加到ServiceManager中。源码目录:framework/base/service
  22. sqlite-jdbc.jar: sqlite的Java DataBase Connextivity jar包。
  23. svc.jar:svc命令所需jar包,可硬用来管理wifi,power和data。源码目录:framework/base/cmds/svc,详情见:http://madgoat.cn/2011/02/android_svc/


----------