转自http://blog.sina.com.cn/s/blog_6417f5e201011rfr.html

(一)Android系统框架详解

Android采用分层的架构,分为四层,从高层到底层分为应用程序层,应用程序框架层,系统运行库层和Linux核心层

1,Android应用程序层

应用是用Java语言编写的运行在虚拟机上的程序,即图中最上层的蓝色部分,其实,Google最开始时就在Android系统中捆绑了一些核心应用,比如e-mail客户端、SMS短消息程序、日历、地图、浏览器、联系人管理程序,等等。

2,应用程序框架层

这一层即是编写Google发布的核心应用时所使用的API框架,开发人员同样可以使用这些框架来开发自己的应用,这样便简化了程序开发的架构设计,但是必须遵守其框架的开发原则,组件如下:

丰富而又可扩展的视图(Views):可以用来构建应用程序,它包括列表(lists)、网格(grids)、文本框(textboxes)、按钮(buttons), 甚至可嵌入的Web浏览器。

内容提供器(Content Providers):它可以让一个应用访问另一个应用的数据(如联系人数据库),或共享它们自己的数据

资源管理器(Resource Manager):提供非代码资源的访问,如本地字符串、图形、和布局文件(layoutfiles)。

通知管理器 (Notification Manager):应用可以在状态栏中显示自定义的提示信息。

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

窗口管理器(Window Manager):管理所有的窗口程序。

包管理器(Package Manager):Android系统内的程序管理

在Android SDK中内置了一些对象,其中最重要的组件要属Activities、Intents、Services以及ContentProviders四个组件。

Activities活动
一个活动就是一个用户界面。一个应用程序可以定义一个或多个活动,每个活动都能够保存和恢复自身的状态。

Intents意向
Intent是描述一个特定活动的一种机制,比如“选取照片”、“拨打电话”等这类具体动作。在Android中,所有的东西都是通过Intents完成的,因此开发者有机会替代或重用大量的组件。比如有一个“发送邮件”的intent,当你应用程序需要发送邮件时可以激活这个intent。开发者甚至可以重新编写一个新的邮件应用程序,并注册为活动以处理这个intent代替标准的邮件应用程序。那么其他应用程序就可以使用新编写应用程序来发送邮件了。

Services服务
一个服务Service就是运行在后台、没有用户直接交互的任务,与Unixdaemon类似。比如要做一个音乐播放器,可能会被另一个活动激活,但音乐是需要作为背景音乐播放,那么这种程序就可以考虑作为一种服务Service。然后别的活动可以来操作这个播放器。Android中内置了很多服务,可以方便的使用API进行访问。

Content Providers内容提供者
一个内容提供者contentProvider就是由自定义的API封装读写操作的一套数据。ContentProvider是不同应用程序之间共享全局数据最好的方式。比如,Google提供了联系人的ContentProvider,包括姓名、地址、电话等所有信息在内的联系方式能够被所有应用程序使用。

3,系统运行库层

当我们使用Android应用框架时,Android系统会通过一些C/C++库来支持对我们使用的各个组件,使其能更好地为开发者服务

Bionic系统 C 库:C语言标准库,系统最底层的库,C库通过Linux系统来调用。

多媒体库(MediaFrameword):Android系统多媒体库,基于 PacketVideoOpenCORE,该库支持多种常用的音频、视频格式的回放和录制以及一些图片,比如:MPEG4、MP3、AAC、AMR、JPG, PNG等。

SGL:2D图形引擎库。

SSL:位于TVP/IP协议与各种应用层协议之间,为数据通讯提供支持。

OpenGL ES 1.0:3D效果的支持。

SQLite:关系数据库。

Webkit:Web浏览器引擎。

FreeType :位图(Bitmap)及矢量(Vector)。

每个Java程序都运行在Dalvik虚拟机之上。与PC一样,每个Android应用程序都有自己的进程,Dalvik虚拟机只执行".dex"的可执行文件。当Java程序通过编译,最后还需要通过SDK中的 "dx"工具转化成".dex"格式才能正常地在虚拟机上执行。

图中黄色的部分则是Dalvik虚拟机,Google于2007年底正式发布了Android SDK, 作为Android系统的重要特性,Dalvik虚拟机也第一次进入了人们的视野。它对内存的高效使用,以及在低速CPU上表现出的高性能,确实令人刮目相看。Android系统可以简单地完成进程隔离和线程管理。每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例,其代码在虚拟机的解释下得以执行。很多人认为Dalvik虚拟机是一个Java虚拟机,因为Android的编程语言恰恰就是Java语言。但是这种说法并不准确,因为Dalvik虚拟机并不是按照Java虚拟机的规范来实现的,两者并不兼容;同时还要两个明显的不同:Java虚拟机运行的是Java字节码,而Dalvik虚拟机运行的则是其专有的文件格式DEX(DalvikExecutable)的文件。在JavaSE程序中的Java类会被编译成一个或者多个字节码文件(.class)然后打包到JAR文件,而后Java虚拟机会从相应的CLASS文件和JAR文件中获取相应的字节码;Android应用虽然也是使用Java语言进行编程,但是在编译成CLASS文件后,还会通过一个工具(dx)将应用所有的CLASS文件转换成一个DEX文件,而后Dalvik虚拟机会从其中读取指令和数据。

Dalvik虚拟机非常适合在移动终端上使用,相对于在桌面系统和服务器系统运行的虚拟机而言,它不需要很快的CPU速度和大量的内存空间。根据Google的测算,64M的RAM已经能够让系统正常运转了。其中24M被用于底层系统的初始化和启动,另外20M被用于高层启动高层服务。当然,随着系统服务的增多和应用功能的扩展,其所消耗的内存也势必越来越大。归纳起来,Dalvik虚拟机有如下几个主要特征:

专有的DEX文件格式

DEX是Dalvik虚拟机专用的文件格式,而为什么弃用已有的字节码文件(.CLASS文件)而采用新的格式呢?

(1)一个应用中会定义很多类,编译完成后即会有很多相应的CLASS文件,CLASS文件中会有不少冗余的信息,而DEX文件格式会把所有的CLASS文件内容整合到一个文件中。这样,除了减少整体的文件尺寸和I/O操作,也提高了类的查找速度。

(2)增加了新的操作码的支持。

(3)文件结构尽量简洁,使用等长的指令,借以提高解析速度。

(4)尽量扩大只读结构的大小,借以提高跨进程的数据共享。

DEX的优化

DEX文件的结构是紧凑的,但是如果我们还想运行时的性能有进一步提高,我们就仍然需要对DEX文件进行进一步优化。优化主要是针对以下几个方面:

(1)调整所有字段的字节序(LITTLE_ENDIAN)和对齐结构中的每一个域。

(2)验证DEX文件中的所有类。

(3)对一些特定的类进行优化,对方法里的操作码进行优化。

基于寄存器

相对于基于堆栈实现的虚拟机,基于寄存器实现的虚拟机虽然在硬件、通用性上要差一些,但是它在代码的执行效率上却更胜一筹。

一个应用,一个虚拟机实例,一个进程

每一个Android应用都运行在一个Dalvik虚拟机实例中,而每一个虚拟机实例都是一个独立的进程空间。虚拟机的线程机制、内存分配和管理、Mutex等的实现都依赖底层操作系统。所有Android应用的线程都对应一个Linux线程,虚拟机因而可以更多地依赖操作系统的线程调度和管理机制。不同的应用在不同的进程空间里运行,加之对不同来源的应用都使用不同的Linux用户来运行,可以最大程度地保护应用的安全和独立运行。

4,Linux核心层

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

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 SoundArchitecture)的高级Linux声音体系驱动。

蓝牙驱动(Bluetooth Driver):基于IEEE 802.15.1标准的无线传输技术。

WiFi驱动(Camera Drive):基于IEEE 802.11标准的驱动程序。

Binder IPC驱动:Android的一个特殊的驱动程序,具有单独的设备节点,提供进程间通讯的功能。

Power Management(能源管理):比如电池电量等

更多相关文章

  1. NPM 和webpack 的基础使用
  2. 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程
  3. UnityAndroid开发(1) 打包和使用Sqlite数据库
  4. Android(安卓)数据存储
  5. Android下的一个音乐播放工具类
  6. 项目中遇到的问题留下笔记
  7. Android(安卓)开发学习 HelloAndroid例子
  8. Android(安卓)开发学习 HelloAndroid例子
  9. Android(安卓)增加鼠标支持

随机推荐

  1. android 版本更新和下载安装 适配android
  2. android菜鸟学习笔记16----Android项目打
  3. Android系列之Wifi定位
  4. AsyncTask使用和源码解析
  5. android开发每日汇总【2011-11-10】
  6. android 反编译
  7. 系出名门Android(5) - 控件(View)之TextV
  8. 如何关闭android中的HandlerThread
  9. android 使用Intent传递数据之返回结果
  10. java/android 使用swig编译c/c++ 代码类