amdroid的四层架构

 

 由下往上:

Linux Kernel(Linux核心层)

Libraries Android Runtime(系统运行库层)

Application FrameWork(应用程序框架层)

Application(应用程序层)

 

1. Linux内核层
Android系统是基于Linux 2.6内核的,这一层为Android设备的各种硬件提供了底层的驱动,如显示驱动、音频驱动、照相机驱动、蓝牙驱动、Wi-Fi驱动、电源管理等。

2.系统运行库层

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

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

多媒体库(MediaFrameword):Android系统多媒体库,基于 PacketVideo OpenCORE,该库支持多种常用的音频、视频格式的回放和录制以及一些图片,比如: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(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用户来运行,可以最大程度地保护应用的安全和独立运行

 

3. 应用框架层
这一层主要提供了构建应用程序时可能用到的各种API,Android自带的一些核心应用就是使用这些API完成的,开发者也可以通过使用这些API来构建自己的应用程序。
4. 应用层
所有安装在手机上的应用程序都是属于这一层的,比如系统自带的联系人、短信等程序,或者是你从Google Play上下载的小游戏,当然还包括你自己开发的程序。

 

posted @ 2017-09-15 11:19  LiangFuCheng  阅读(225)  评论(0编辑  收藏  举报