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编译脚本。