Android移动应用开发技术与实践
上QQ阅读APP看书,第一时间看更新

1.3 Android平台架构

Android操作系统是基于Linux架构的,采用软件叠层(Software Stack)的方式来构建。它实际上就是在标准的Linux系统之上添加了Java虚拟机Dalvik,并且在Dalvik虚拟机上搭建了一个Java Application Framework,所有的Android应用程序都是基于这个框架之上。下面具体分析Android的平台架构,让读者更清晰地了解Android的工作原理。

1.3.1 Android平台架构概述

Android平台采用了分层和整合的框架思想,它的底层是基于Linux系统之上,这个平台由Linux内核层、系统运行库层、应用框架层和应用层4层组成。各个层次叠状结构使得层和层之间互相分离,清除了各层之间的耦合关系。这样的层次结构保证了层与层之间的低耦合,也就是说当前层发生变化时,上层应用程序无须做任何改变。下面简单介绍Android的特性和体系结构。

1.Android的平台特性

1)平台具有开放性。Android系统成为一个开源的移动平台,它不仅仅构建了底层的操作系统,而且它还构造了上层的用户界面和必要的应用程序,这为移动开发者迅速而快捷地开发出移动创新产品奠定了基础。

2)优化的移动设备虚拟机。Android采用Dalvik虚拟机,这是专门为移动设备量身定做的虚拟机。Android应用程序的运行原理就是将由Java编写、编译的类文件通过DX工具转换成一种扩展名为.dex的文件来执行。Dalvik虚拟机相对于Java虚拟机,速度要快很多,这是由于它是基于寄存器的。

3)强大的2D和3D图形库,而且3D图形库基于OpenGL ES 1.0,多媒体支持包括常见的音频、视频和静态映像文件格式。

4)结构化存储数据库SQLite,并且Android也打破了应用之间的界限。

5)Android具有丰富的开发库和工具,开发者可以使用这些库文件和工具迅速创建属于自己的应用。

2.Android的平台架构

Android共分为5层,分别为Linux内核层(Linux Kernel)、硬件抽象层(HAL层)、系统运行环境和运行库层(Libraies)、应用框架层(Application Framework)和应用层(Application),平台整体架构如图1-31所示。

(1)Linux内核层(Linux Kernel)

Android是基于Linux内核的,系统服务依赖于Linux,Android设备的各种硬件都依赖于Linux,并且Linux为Android提供底层驱动,在安全性、内存管理和进程管理等核心系统服务方面提供了支撑服务,在Linux内核层主要包含下面几个组件。

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

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

● USB驱动(USB Driver):提供USB设备的连接支持。

● 键盘驱动程序(KeyBoard Driver):为输入设备提供支持。

(2)硬件抽象层(HAL)

硬件抽象层(HAL)提供标准接口,HAL包含多个模块库,其中每个模块都为特定类型的硬件实现一组特定的接口,比如WiFi/蓝牙功能模块接口,当框架API请求访问设备硬件时,Android系统就会为该硬件加载相应的库模块。有的书中把HAL归到Linux内核层中,但图1-31中可以看出,架构分为5层更为清晰。

(3)系统运行环境和运行库层(Libraies)

这一层包括C/C++库和Android运行环境,可以将此层看作由提供Android系统特性的函数库和Android运行时库两部分组成,下面分别进行介绍。

图1-31 Android平台整体架构

1)Android系统特性的函数库:Android包含C/C++库,这些库为Android系统提供了主要的特性支持。一般说来,Android应用开发者不能直接调用这套C/C++库,但可以通过其上的应用框架层来调用这些库,常用的一些核心库包括:

● 系统C库:一个从BSD继承来的标准C系统函数库(libc),专门为基于Embedded Linux的设备定制。

● 媒体库:该库支持录放,并且可以录制许多流行的音频视频格式,还有静态映像文件。

● Surface Manager:对显示子系统的管理,并且为多个应用程序提供2D和3D图层的无缝融合。

● LibWebCore:一个最新的Web浏览器引擎,用来支持Android浏览器和一个可嵌入的Web视图。

● SGL:一个内置的2D图形引擎。

● 3D libraries:基于OpenGL ES 1.0 APIs实现;该库可以使用硬件3D加速(如果可用)或者使用高度优化的3D软加速。

● FreeType:位图(bitmap)和向量(vector)字体显示。

● SQLite:一个对于所有应用程序可用、功能强劲的轻型关系型数据库引擎。

2)Android运行时库:Android运行时库由Android核心库集和Dalvik虚拟机两部分组成。Android核心库集,能够允许开发者使用Java语言来编写Android应用;Dalvik虚拟机是移动设备的虚拟机,可以使每一个Android应用程序都能运行在独立的进程中,并且拥有一个自己的Dalvik虚拟机实例。Dalvik虚拟机执行.dex的Dalvik可执行文件,该格式文件针对最小内存使用做了优化。该虚拟机是基于寄存器的,所有的类都是经由Java汇编器编译,然后通过SDK中的DX工具转化成.dex格式由虚拟机执行。

(4)应用框架层(Application Framework)

Android应用程序框架层提供了大量的API供开发者使用,在开发Android应用程序时,就是面向底层的应用程序框架进行的。应用程序框架层不仅可以作为应用程序开发的基础,还可以实现复用软件功能。应用框架层主要包括以下组件。

● 活动类管理器(Activity Manager):Acticity是Andriod应用程序中的基本组件,此类接受Android系统管理,有生命周期和控制方法。

● 窗口管理器(Window Manager):负责整个系统的窗口管理,可以控制窗口的打开、关闭、隐藏等。

● 联系人提供器(Contact Providers):实现多个应用程序之间的数据共享功能。

● 视图系统(View System):用于构建应用程序的UI界面,例如按钮组件、文本组件和列表组件等。

● 通知管理器(Notification Manager):管理手机顶部状态栏的提示消息,如短消息提示和电话提示等。

● 资源管理器(Resource Manager):提供访问非代码的资源,如国际化文字显示、布局管理器和图形界面等。

● 视图(Views):用来创建视图页面,包括文本框(Text Boxes)、列表(Lists)和按钮(Buttons)等,也可以是一个可嵌入的Web浏览器。

(5)应用层(Application)

所有手机上安装的应用程序(App)都属于这一层。应用程序也会包含系统核心应用程序,例如,电子邮件客户端、SMS程序、日历、地图、浏览器、联系人等,这些应用程序都是使用Java编写的。读者学习Android开发就是基于这一层进行App的开发。

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

了解了Android平台的整体架构后,接下来介绍基于Android Studio平台下的应用工程文件组成和基本介绍。Android Studio应用工程界面如图1-32所示。

图1-32 Android Studio应用工程界面

1.res目录

Android Studio的res主要是存放资源目录,用来存储项目的资源,包括图片资源、字符串资源、颜色资源、尺寸资源等。

● drawable:用来存储图片资源。

● layout:用来存储布局文件。

● mipmap:用来存储应用图片和图标,且有不同分辨率图标。

● values:存储App的一些引用值,可以将应用中反复使用和后期可能会修改的值存到values中,方便后期调用和修改。

colors.xml:存储了一些color的值。

strings.xml:存储引用的string值。

styles.xml:存储App需要用到的一些样式。

【例1-1】 strings.xml中存储项目名称。

上面代码中定义了一个字符串常量,其值为My Application,该字符串的名称为app_name,定义后可以在Java代码、XML文件中调用这个资源文件中的字符串。

【例1-2】 布局文件activity_main.xml。

上面布局文件定义的属性值的含义如下。

● android:layout_width和android:layout_height:指定了控件的宽度和高度,wrap_content表示让当前控件的大小能够刚好包住里面的内容,也就是由控件内容决定当前控件的大小。

● android:text:TextView显示的内容,@string/Hello_World表示TextView的值存储在values/strings.xml中,键为Hello_World的值。

2.java目录

该目录用来存放Java代码,其下包含MainActivity方法。代码如下:

上面Java代码的含义是:

● 第1行代表包名,第2~3行代表需要导入的类包,其中v7包是一个重要的包,要使用AppCompatActivity就得导入这个包。

● MainActivity作为项目入口Activity类是继承AppCompatActivity类的,onCreate方法是继承Activity的,是项目需要刚加载就要执行的方法。

● setContentView(R.layout.activity_main)表示要让这个MainActivity类加载的布局文件就是activity_main.xml。

3.manifests目录

该目录下包含AndroidManifest.xml文件,其中包含了该工程组成部件和信息,相当于应用的配置文件,也叫清单文件。通过这个清单文件,可以得到项目的包名、Android版本、组成部件等信息,其中application节点表示当前的应用程序,该应用程序包含一个Activity组件,该Activity通过意向(intent-filter)来指定行为以及分类启动。

【例1-3】 清单文件AndroidManifest.xml。

注意:清单文件描述了包中暴露的组件如Activity、service等,它们各自的实现类可以实现处理数据和启动位置等功能。

清单文件中具体节点以及属性的含义如表1-1所示。

表1-1 AndroidManifest.xml的属性值

4.Gradle Scripts目录

AS用Gradle取代了Eclipse的ADT工具,它作为一种依赖管理工具,是基于Groovy语言,面向Java应用为主,它抛弃了基于XML的各种烦琐配置,取而代之的是一种基于Groovy的内部领域特定DSL语言。

Gradle对项目自动编译时将读取项目的配置文件,比如指定项目的依赖包等。因此在AS中有两个build.grade,一个表示整个项目全局配置,另一个表示在当前模块中进行配置,如图1-33所示。

图1-33 build.grade文件

(1)全局的build.gradle(Project)

表示整个项目的一些配置信息。代码如下:

● repositories节点:Gradle可以通过Repository找到外部依赖(External Dependencies)Gradle支持很多仓库,因此它不用指定特定仓库,一般设置为在jcenter()托管仓库,很多的Android开源项目都会选择将代码托管到jcenter上,声明了这行配置后,就可以在项目中轻松使用任何的jcenter上的开源项目了。

● dependencies节点:classpath 'com.android.tools.build:gradle:3.1.2'声明了Gradle的版本。

(2)当前模块的build.gradle(App)

表示当前模块的Gradle构建配置信息,代码如下:

1)apply plugin:代表着应用了一个插件,一般来说有两个值可选:com.android.application和com.android.library,前者表示这是一个应用程序模块,后者表示是一个库模块,它们的区别是:前者可以直接运行,而后者只能作为代码依附在别的应用程序模块来运行。所以在引入一些Model为自己的应用程序所用时,build.gradle文件的第一行就是apply plugin:com.android.library。

2)android节点:

● compileSdkVersion:用于指定项目的编译版本。这里26表示使用Android 8.0系统的SDK进行编译。

● buildToolsVersion:用于指定项目的构建工具的版本。

● defaultConfig节点:

■ applicationId:用于指定项目的包名,在创建项目的时候已经指定了包名,当要改变整个项目的包名时,可以在这里改变。

■ minSdkVersion:项目最低的兼容版本。19表示兼容到API 19即是Android 4.4。

■ targetSdkVersion:表示使用的目标SDK版本。

● buildTypes节点:通常这个闭包中会有两个节点,一是debug,一是release。debug用于生成测试版安装文件的配置,release用于生成正式版安装文件的配置,dubug节点可以忽略不写。

3)dependencies节点:

● 在这个节点下可以指定当前项目所有的依赖包。通常Android Studio项目中有三种依赖方式:本地依赖、库依赖和远程依赖。

● 通常项目中的第一行是本地依赖声明,它把libs目录下的所有.jar后缀文件全部添加到带项目的构建路径中去;第二行是远程依赖声明;第三行是驱动声明。

单击AS工具栏的按钮,然后在弹出的窗口单击app,找到Dependencies选项卡,就可以找到App的依赖包,包括Gradle中声明的包文件,如图1-34所示。

图1-34 Dependencies包下的文件

(3)local.properties

这个文件用于指定本机中的Android SDK路径,通常内容都是自动生成的。

(4)gradle.properties

这个文件是全局的Gradle配置文件,在这里配置的属性将会影响到项目中所有的Gradle编译脚本。