您的位置:首页 > 运维架构 > 网站架构

Android平台基本架构及Dalvik概述

2015-07-18 22:12 423 查看
对于Android开发,小编觉得仅仅照着视频或者照着Android疯狂讲义上的例子照搬照抄是不够的,了解、熟悉Android平台的架构及基本原理,相关基本要素的运行机制是极为重要的,这将为从事android长远开发奠定基石作用。所以小编将在后续时间与大家分享小编学习的有关Android原理机制方面的知识,不足或错误的地方请批评指正。

一、Android平台架构

首先请看下面一张图:



相信很多有都看过这张图。通过上面这张图,小编得出的信息如下:
Android平台的架构可以拆分成5个部分。它们分别是Linux内核、Android Runtime、Libraries、Application Framework以及Applications。
下面来一一了解各个部分到底是干嘛的,它们在Android体系中扮演着什么角色。

(一)、Linux Kernel

Linux内核主要是基于Linux2.6来作为核心,利用其基本功能,构建Linux内核来帮助Android系统完成最底层、最核心的功能服务。这些功能主要包括进程管理、安全管理、内存管理、堆栈管理及驱动管理。它主要完成与核心底层硬件的信息交互与处理。在Linux内核中,存在于许多硬件进行交互的驱动程序,如USB Driver、照相机Camera Driver、内部进程通信驱动、蓝牙、无限驱动等。曾经有过一个说法,当把Linux官网上的Linux内核移植到Android平台中会影响Android的运行,这就产生Android下的Linux内核与传统的Linux内核不一致的说法。有学者进行了分析实验,最后得出当把传统的Linux移植到Android中时,会影响手机的触摸屏等操作滞缓,以及一些硬件设备的使用出现一定的差异,最后发现Google在进行Linux开发的时候重写或重新构造了内核的驱动部分,使之与原有的驱动不一样,这些专为手机使用建立的内核驱动才方便手机的运行。所以这里的LInux内核是Google官方专门为手机使用开发的Linux内核,定制了手机专用的驱动程序。

(二)、Android Runtime

所谓的Android运行时,主要包括两部分,第一是Android基本核心库。第二个是Dakvik虚拟机。
其中Android基本核心库用来提供大部分在Java编程中需要使用的基本的核心的功能。第二部分是虚拟机,都知道Android应用程序的运行是基于虚拟机的,但是这里的虚拟机和Java虚拟机是不一致的,具体的差别是Java虚拟机处理的是Java的字节流,而Dalvik虚拟机是在Java字节流的基础上,通过dx工具经过一系列处理,将字节流打包成dex格式的文件,从而让Dalvik虚拟机使用,所以两者的本质是不一样的。在Android应用程序中,每个应用程序在虚拟机内部都是对应一个Dalvik虚拟机实例,有着自己独立运行的线程。而这些线程的管理,都通过Dalvik向Linux内核提供的接口,使得Linux内核可以有效的管理线程安全等因素。

(三)、Libraries

这里的Libraries是Android所包含的C/C++类库,这些类库可以供给Android的各个组件使用。这些类库所具有的功能是通过Android Framework来暴露给开发者的。
这些类可以包括如下:
libc、OpenCORE媒体库、SGL-基于2D图像的引擎、3D库、SurfaceView Manager-界面管理、SQLite--轻量级的关系数据库引擎、SSL--网络传输的安全控制等。

(四)、Application Framework

Framework 的主要功能就是为Android开发者提供一系列用于开发的服务APIs和接口。这些服务及接口包括:
View 丰富的、可扩展的视图集合
Content Provider 使应用程序可以访问其他应用程序的数据、或者使数据可以被共享
Resource Manager 资源管理器。这部分的资源是以非代码的形式、不被编译的方式被访问
Activity Manager 用来管理应用程序的生命周期
Notification 使应用程序可以在状态栏实现自定义的警告。

(五)、Applications

应用程序集合。通过Libraries和Framework开发的应用程序,每个应用程序的构建及运行主要依赖前4个部分。

二、Android平台中的库

该节主要来描述Android应用程序开发时主要会用到的库,了解每个库的具体职能。
(1)、Android util
该库主要用来包括Java中常用的核心功能,包括Java容器、字符串格式化、XML解析等基本功能。
(2)、Android os
提供消息传递、进程间通信等功能
(3)、Android graphic
通过提高图像API,完成低级的绘图功能。
(4)、Andorid text
提高文本处理和解析功能。
(5)、Android database
提供使用数据库的功能。
(6)、Android view
构造用户界面集合,提供与用户的交互行为
(7)、Android Content
内容API,管理数据的发布及访问
(8)、Android provider
为了方便开发人员对某些标注的内容提供器进行访问,该库提供了对所有android发行版中包含的标准数据库的访问、
(9)、telephony、webKit、bluttooth、location
提供对电话薄、网络、蓝牙、GPS的使用访问。
(10) Android Media
提供对媒体数据的访问,如图像、视频、音频。
(11)SSL
用来支持使用安全套接字加密协议的安全Internet通信。

三、什么是Apk文件

Android Apk文件实际上是一个压缩文件。当我们用解压缩工具对其进行解压时,我们可以看到如下的结构目录:



其实从这个图上,我们可以明显感觉到该图和我们进行开发时的工程目录树十分相似。Apk的文件主要组成部分有如下几个:
(1)、Manifest文件
这个XML文件是整个Apk最为核心的文件,它是用来描述整个Apk是什么的。在该文件中,定义了应用程序的名称、图标、权限、sdk使用的最低版本号、以及应用程序所使用的Activiy、service、receiver等子元素。其根元素是只允许唯一存在的applicaion元素。Root标签是manifest标签。因此,整个Manifest.xml文件表述了整个应用程序的全局信息。
(2)、META-INF元数据信息。
META-INF文件中需要值得一提的是校验码。当应用程序开发完成进行打包的时候,根据所有的文件信息、权限信息等会由系统自动生成一个检验码A。而当Apk安装到手机上时,Android系统也一样会对当前的文件信息等计算一个校验码B,当校验码B与存储在META文件中的校验码A比较时,若完全无误则完成安装,否则,不进行安装。所以在Apk获取之后如果对其进行解压,替换里面的数据资源,重新打包,一样不会完成安装,这是出于对apk文件的安全性及完整性进行的设置。
(3)、classes.dex
之前说过,Java虚拟机处理的是Java程序的字节流,而Dalvik虚拟机则通过dx工具将Java的Class打包封装成可供Dalvik虚拟机执行的.dex文件。其实这个过程是一个优化的过程,我们知道每一个类都有一个常量池(有关常量池的具体概念会在别的文章中具体描述,可以参加Java目录下的文章)。而一个应用程序往往会有很多的classes,如果每个类都独立有一个常量池,在类与类之间的数据处理上会降低一定的效率,所以为了提高应用程序之间的紧凑度,提高文件读写数据传输的效率,DEX文件将所有的类的常量池提到了同一个常量池中,将所有的class进行了整合。
(4)、res文件
可以看出这里的res文件分为了两个部分。其中不带.arsc后缀的res文件是不被编译的res文件,里面可以包括jpg、png、js、html、css、xml等。而resource.arsc则是被编译后的资源文件,以字节流的方式进行存储与获取。

将android应用程序进行打包成apk文件使用的是aapt工具。

四、Dalvik

关于Dalvik虚拟机,前面已经提及。它实际上是区别于Java虚拟机的,同时,内部的线程管理是通过底层的Linux内核来实现与完成管理(这其实是层次结构的一个优势,我只负责管理我的内部,我只提供一个接口为你提供服务,我内部的事情我自己管理,其他人不用管)。那么,每一个android应用程序实际上都在Dalvik内部有一个实例和线程,其代码在虚拟机的解释下执行。
Java虚拟机与Dalvik虚拟机的不同地方在于:
(1)、Java虚拟机运行Java字节流,Dalvik虚拟机运行DEX格式文件。
(2)、Java类在被编译成字节码文件.class之后进行打包到Jar中,此时虚拟机从class文件和jar文件中获取字节码信息来执行。而Dalvik会直接从处理好的DEX文件中读取指令和数据。
(3)、Java虚拟机是基于堆栈的,而Dalvik虚拟机是基于寄存器的。寄存器的虚拟机在代码执行上具有高效率,而在指令分发上却比较耗时。
总而言之,每一个Android应用程序都运行在一个Dalvik虚拟机实例中,而每一个虚拟机的实例都是一个独立的进程空间,虚拟机的线程机制、内存分配和管理都是依靠底层Linux内核来实现。所以Android的应用程序线程其实对应了Linux内核的一个线程,不同线程之间独立运行可以保护应用程序的安全执行。

这里需要提及一个叫做Zygote的进程。它是一个虚拟机进程,同时也是一个虚拟机实例的孵化器。它可以通过复制自身完成一个进程派生。Zygote在系统开启时就完成了虚拟机的初始化,配置了库的加载等一系列的设置。当有一个Android应用程序运行时,Zygote接收到了请求消息,就会复制自身,完成虚拟机实例的产生。这样做可以大大的提高效率,同时,复制自身会共享内存中的只读区域,节省了内存的开销。

再次之处,Dalvik是Android平台特有的,支持手机应用程序效率执行的虚拟机,与Java虚拟机有许多不同之处。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: