Android移动应用开发实用教程
上QQ阅读APP看书,第一时间看更新

1.3 Android平台架构

为了更加深入地理解Android的精髓,有必要了解Android的系统架构及其组成。这样才能知道Android究竟能干什么,所要学的是什么。

1.3.1 Android平台架构概述

Android是一个移动设备的开发平台,其软件层次结构包括操作系统(OS)、中间件(MiddleWare)和应用程序(Application)。根据Android的软件框图,其软件层次结构自下而上分为以下4层。

●操作系统层(OS)。

●各种库(Libraries)和Android运行环境(RunTime)。

●应用程序框架(Application Framework)。

●应用程序(Application)。

上述各个层的具体结构如图1-19所示。

1.操作系统层(OS)——最底层

因为Android源于Linux,使用了Linux内核,所以Android使用Linux 2.6作为操作系统。Linux 2.6是一种标准的技术,Linux也是一个开放的操作系统。Android对操作系统的使用包括核心和驱动程序两部分,Android的Linux核心为标准的Linux 2.6内核,Android更多的是需要一些与移动设备相关的驱动程序。主要的驱动程序有以下几个。

●显示驱动(Display Driver):常用基于Linux的帧缓冲(Frame Buffer)驱动。

●Flash内存驱动(Flash Memory Driver):是基于MTD的Flash驱动程序。

●相机驱动(Camera Driver):常用基于Linux的v4l驱动。

978-7-111-51177-9-Chapter01-23.jpg

图1-19 Android操作系统的层次结构图

●音频驱动(Audio Driver):常用基于ALSA(Advanced Linux Sound Architecture,高级Linux声音体系)的驱动。

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

●键盘驱动(KeyBoard Driver):作为输入设备的键盘驱动。

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

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

●能源管理(Power Management):管理电池电量等信息。

2.各种库(Libraries)和Android运行环境(Runtime)——中间层

本层次对应一般嵌入式系统,相当于中间件层次。Android的本层次分为两部分,一个是各种库,另一个是Android运行环境。本层次的内容大多是使用C和C++实现的。其中包含的各种库如下。

●C库:C语言的标准库,也是系统中一个最为底层的库,C库是通过Linux的系统调用来实现的。

●多媒体框架(Media Framework):这部分内容是Android多媒体的核心部分,基于PacketVideo(即PV)的OpenCORE。从功能上本库共分为两部分,一部分是音频和视频的回放(PlayBack),另一部分则是音视频的记录(Recorder)。

●SGL:2D图像引擎。

●SSL:即Secure Socket Layer,位于TCP/IP与各种应用层协议之间,为数据通信提供安全支持。

●OpenGL ES 1.0:提供了对3D的支持。

●界面管理工具(Surface Management):提供了管理显示子系统等功能。

●SQLite:一个通用的嵌入式数据库。

●WebKit:网络浏览器的核心。

●FreeType:位图和矢量字体的功能。

Android的各种库一般是以系统中间件的形式提供的,它们都有的一个显著特点是与移动设备平台的应用密切相关。

Android运行环境主要是指虚拟机技术——Dalvik。Dalvik虚拟机和一般Java虚拟机(Java VM)不同,它执行的不是Java标准的字节码(Bytecode),而是Dalvik可执行格式(.dex)中的执行文件。在执行的过程中,每一个应用程序即一个进程(Linux的一个Process)。二者最大的区别在于,Java VM是基于栈的虚拟机(Stack-based),而Dalvik是基于寄存器的虚拟机(Register-based)。显然,后者最大的好处在于可以根据硬件实现更大的优化,这更适合移动设备的特点。

3.应用程序(Application)

Android的应用程序主要是用户界面(User Interface,UI)方面的,通常用Java语言编写,其中还可以包含各种资源文件(放置在res目录中)、Java程序及相关资源经过编译后,将生成一个APK包。Android本身提供了主屏幕(Home)、联系人(Contact)、电话(Phone)及浏览器(Brower)等众多的核心应用。同时应用程序的开发者还可以使用应用程序框架层的API实现自己的程序。这也是Android开源巨大潜力的体现。

4.应用程序框架(Application Framework)

Android的应用程序框架为应用程序层的开发者提供了API,它实际上是一个应用程序的框架。由于上层的应用程序是以Java构建的,因此本层次提供了首先包含UI程序中所需要的各种控件,例如Views(视图组件),其中又包含了List(列表)、Grid(栅格)、Text-Box(文本框)和Button(按钮)等,甚至一个嵌入式的Web浏览器。

一个基本的Android应用程序可以利用应用程序框架中的以下5部分。

●Activity(活动)。

●Broadcast Intent Receiver(广播意图接收者)。

●Service(服务)。

●Content Provider(内容提供者)。

●Intent and Intent Filter(意图和意图过滤器)。

本书讲解的是应用程序(Application)方面的知识。这些知识都是用Java开发的,当然也还需要掌握一些其他层的相关知识,例如底层的内核、驱动等知识。

1.3.2 Android应用工程文件组成和介绍

Android工程的主要目录有src、gen、Android X.X、bin及res等文件夹。下面以图1-16中的项目结构为例进行介绍。

1.src目录——程序文件

在里面保存了程序员直接编写的程序文件。和一般的Java项目一样,src目录下保存的是项目的所有包及源文件(.java)。

2.gen目录

存放编译器自动生成的一些Java代码,.java格式的文件是在建立项目时自动生成的,这个文件是只读模式,不能更改。BuildConfig.java是调试(Debug)时用的,一般不用关注。这个目录中最关键的文件就是R.java,R类中包含很多静态类,静态类的名称都与res中的一个名称对应,就像是一个资源字典大全。其中包含了用户界面、图像及字符串等对应各个资源的标识符,R类定义了该项目所有资源的索引。例如界面中有一个文本控件,这个控件就在布局文件中有id。id是android:id=“@+id/textview”,那么通过R.id.textivew就可以找到这个控件。

通过R.java可以很快地查找到所需要的资源,同时编译器也会检查R.java列表中的资源是否被使用,未被使用到的资源不会被编译到软件中,这样可以减少在手机内占用的空间。这个R.java默认有attr、drawable、layout和string 4个静态内部类(从Android 4.2开始有8个静态类,多了id、menu、style和dimen),每个类对应一种资源。例如在工程中添加一副图片,那么工程就会在此类的drawable内部类中添加一条数据,如果删除了此图片,工程则会自动删除此条数据。由此可见,R.java类似于计算机的注册表。

3.Android4.4.2、Android Private Libraries和Android Dependencies

这3个目录是库。Android 4.4.2文件夹下包含android.jar文件,这是一个Java归档文件,其中包含构建应用程序所需的所有Android SDK库(如Views、Controls)和APIs。通过android.jar将自己的应用程序绑定到Android SDK和Android Emulator,这允许用户使用所有Android的库和包,且使自己的应用程序在适当的环境中调试。

需要特别说明的是Android Dependencies,该目录出现在ADT 16以后的版本中,是ADT第三方库新的引用方式,当需要引用第三方库时,只需要将该库复制到libs文件夹中,ADT就会自动完成对该库的引用(如本例中的android-support-v4.jar)。ADT 22中新增了Ex-port,新增了Android Private Libraries库,所有的第三方JAR包引入都被放入了Android Pri-vate Libraries。对于ADT 21,库工程生成的jar和主工程的第三方jar都归纳为Android De-pendencies,而ADT 22是自动将JAR分成Android Private Libraries和Android Dependencies两类,ADT 21不需要选中Export就能自动将所有引用的JAR包导出并打包到APK,而ADT 22则给开发人员选择权限,让开发人员自己决定哪些包要导出到APK里。

4.assets文件夹

除了提供res目录用于存放资源文件外,android在assets目录下也可存放资源文件。as-sets目录下的资源文件不会在R.java自动生成id,所以读取asset目录下的文件必须指定文件的路径,可以通过AssetManager类来访问这些文件。

5.bin文件夹

该目录是编译之后的文件及一些中间文件的存放目录,ADT先将工程编译成Android JAVA虚拟机(Dalvik Virtual Machine)文件classes.dex,最后将该classes.dex封装成APK包(APK就是Android平台生产的安装程序包)。

6.libs文件夹

该目录用于存放第三方库(新建工程时,默认会生成该目录,没有的话手动创建即可)。

7.res文件夹

用于存放项目中的资源文件,该目录中有资源添加时,R.java会自动记录下来。res目录下一般有如下几个子目录,如图1-20所示。

978-7-111-51177-9-Chapter01-24.jpg

图1-20 res子目录

●drawable-hdpi、drawable-ldpi、drawable-mdpi、drawable-xhdpi、drawable-xxhd-pi:存放应用程序可以使用的图片文件(png、jpg),子目录根据图片质量分别保存。

●layout:屏幕布局目录,layout目录内默认布局文件是activity_main.xml,可以在该文件内放置不同的布局结构和控件以满足项目界面的需要,也可以新建布局文件。

●menu:存放定义了应用程序菜单资源的XML文件。

●values、values-v11、values-v14、values-w820dp:存放定义了多种类型资源的XML文件,如软件上需要显示的各种问题,还可以存放不同类型的数据,如dimens.xml、strings.xml和styles.xml。

8.AndroidManifest.xml文件——设置文件

AndroidManifest.xml是一个控制文件,在里面包含了该项目中所使用的Activity、Service和Recevier。下面是HelloAndroid项目中的AndroidManifest.xml文件。

978-7-111-51177-9-Chapter01-25.jpg

在上述代码中,intent-filter描述了Activity启动的位置和时间。每当一个Activity(或者操作系统)要执行一个操作时,它将创建出一个Intent对象,这个Intent对象能承载的信息可描述用户想做什么、想处理什么数据、数据的类型,以及一些其他信息。而Android则会和每个Application所暴露的intent-filter的数据进行比较,找到最合适的Activity来处理调用者所指定的数据和操作。下面来仔细分析AndroidManifest.xml文件,如表1-2所示。

表1-2 AndroidManifest.xml分析

978-7-111-51177-9-Chapter01-26.jpg

(续)

978-7-111-51177-9-Chapter01-27.jpg