Android框架简介

一架构图示

下面这张图展示了Android系统的主要组成部分:

Android_system_architecture

图1、Android系统架构(来源于:android sdk)

可以很明显看出,Android系统架构由5部分组成,分别是:Linux Kernel、Android Runtime、Libraries、Application Framework、Applications。第二部分将详细介绍这5个部分。

二架构详解
2.1、Linux Kernel

Android基于Linux 2.6提供核心系统服务,例如:安全、内存管理、进程管理、网络堆栈、驱动模型。Linux Kernel也作为硬件和软件之间的抽象层,它隐藏具体硬件细节而为上层提供统一的服务。

如果你学过计算机网络知道OSI/RM,就会知道分层的好处就是使用下层提供的服务而为上层提供统一的服务,屏蔽本层及以下层的差异,当本层及以下层发生了变化不会影响到上层。也就是说各层各司其职,各层提供固定的SAP(Service Access Point),专业点可以说是高内聚、低耦合。

如果你只是做应用开发,就不需要深入了解Linux Kernel层。

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 Drive):基于IEEE 802.11标准的驱动程序。

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

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


2.2、Android Runtime

Android包含一个核心库的集合,提供大部分在Java编程语言核心类库中可用的功能。每一个Android应用程序是Dalvik虚拟机中的实例,运行在他们自己的进程中。Dalvik虚拟机设计成,在一个设备可以高效地运行多个虚拟机。Dalvik虚拟机可执行文件格式是.dex,dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。

大多数虚拟机包括JVM都是基于栈的,而Dalvik虚拟机则是基于寄存器的。两种架构各有优劣,一般而言,基于栈的机器需要更多指令,而基于寄存器的机器指令更大。dx 是一套工具,可以將 Java .class 转换成 .dex 格式。一个dex文件通常会有多个.class。由于dex有時必须进行最佳化,会使文件大小增加1-4倍,以ODEX结尾。

Dalvik虚拟机依赖于Linux 内核提供基本功能,如线程和底层内存管理。

2.3、Libraries

Android包含一个C/C++库的集合,供Android系统的各个组件使用。这些功能通过Android的应用程序框架(application framework)暴露给开发者。下面列出一些核心库:

  • 系统C库——标准C系统库(libc)的BSD衍生,调整为基于嵌入式Linux设备
  • 媒体库——基于PacketVideo的OpenCORE。这些库支持播放和录制许多流行的音频和视频格式,以及静态图像文件,包括MPEG4、 H.264、 MP3、 AAC、 AMR、JPG、 PNG
  • 界面管理——管理访问显示子系统和无缝组合多个应用程序的二维和三维图形层
  • LibWebCore——新式的Web浏览器引擎,驱动Android 浏览器和内嵌的web视图
  • SGL——基本的2D图形引擎
  • 3D库——基于OpenGL ES 1.0 APIs的实现。库使用硬件3D加速或包含高度优化的3D软件光栅
  • FreeType ——位图和矢量字体渲染
  • SQLite ——所有应用程序都可以使用的强大而轻量级的关系数据库引擎

        每个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(Dalvik Executable)的文件。在Java SE程序中的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用户来运行,可以最大程度地保护应用的安全和独立运行。


2.4、Application Framework

通过提供开放的开发平台,Android使开发者能够编制极其丰富和新颖的应用程序。开发者可以自由地利用设备硬件优势、访问位置信息、运行后台服务、设置闹钟、向状态栏添加通知等等,很多很多。

开发者可以完全使用核心应用程序所使用的框架APIs。应用程序的体系结构旨在简化组件的重用,任何应用程序都能发布他的功能且任何其他应用程序可以使用这些功能(需要服从框架执行的安全限制)。这一机制允许用户替换组件。

所有的应用程序其实是一组服务和系统,包括:

  • 视图(View)——丰富的、可扩展的视图集合,可用于构建一个应用程序。包括包括列表、网格、文本框、按钮,甚至是内嵌的网页浏览器
  • 内容提供者(Content Providers)——使应用程序能访问其他应用程序(如通讯录)的数据,或共享自己的数据
  • 资源管理器(Resource Manager)——提供访问非代码资源,如本地化字符串、图形和布局文件
  • 通知管理器(Notification Manager——使所有的应用程序能够在状态栏显示自定义警告
  • 活动管理器(Activity Manager——管理应用程序生命周期,提供通用的导航回退功能
  • 窗口管理器(Window Manager):管理所有的窗口程序。
  • 包管理器(Package Manager):Android系统内的程序管理

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

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

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

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

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

2.5、Applications

Android装配一个核心应用程序集合,包括电子邮件客户端、SMS程序、日历、地图、浏览器、联系人和其他设置。所有应用程序都是用Java编程语言写的。更加丰富的应用程序有待我们去开发!

三总结

从上面我们知道Android的架构是分层的,非常清晰,分工很明确。Android本身是一套软件堆叠(Software Stack),或称为「软件叠层架构」,叠层主要分成三层:操作系统、中间件、应用程序。从上面我们也看到了开源的力量,一个个熟悉的开源软件在这里贡献了自己的一份力量。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值