Android(安卓)是一种基于Linux内核研发的移动操作系统,由Google公司和开放手机联盟共同领导、开发,具有真正开放源代码的特性,主要使用于移动设备中,如智能手机和平板电脑。Android经过多年的发展,目前在全球范围内长期占据优势地位。
但Android系统最初并不是由Google创办的,Andy Rubin(安迪·鲁宾)2003年成立Android公司及研发团队,并且开发出Android平台,因此他也被称为“Android之父”。
2005年8月,Google公司收购了Android公司及其团队,Andy Rubin继续负责Android项目,担任Google公司工程副总裁。这是Google进军移动领域的开始,同时开阔了Android的发展前景。
2007年11月5日,Android操作系统第一次向外界展示。同时,谷歌宣布建立一个全球性的联盟组织,该组织由34家手机制造商、软件开发商、电信运营商及芯片制造商共同组成,并与84家硬件制造商、软件开发商及电信运营商组成开放手持设备联盟(Open Handset Alliance)来共同研发和改良Android系统。
2008年9月,谷歌发布了第一代Android操作系统:Android 1.0。随后,Android操作系统迅速发展,目前已经发布了多个版本,并不断在更新优化,截稿前,最新版本为2020年9月9日发布的Android 11。
Android是基于开源的Linux系统开发的,Android同样是开源的,从底层的操作系统到上层的应用程序达到了完全开放的状态。Google和开放手机联盟的目的就是建立标准化、开放式的移动软件平台,在移动产业内形成一个开放式的生态系统。由于提供了一个开放的环境,吸引了大量的开发者,第三方开源库、第三方开源分享等资料自然而然就越来越多,从而促进Android系统日益成熟。
Android系统的硬件丰富性表现在两方面:一是Android支持多元化的设备,不光支持智能手机,还支持平板电脑、智能电视、智能移动穿戴设备(如智能手表、车载导航等);另一方面,由于其开放性,众多移动终端厂商加入联盟,多种基于Android的个性化操作系统出现,如EMUI、MIUI等。
Android的开放性在应用的开发上也有所体现,用户可以不受限制、免费、自由地开发,发布需要的应用;并且众多实用库、开发工具、开发资源使得程序的开发变得更加简单。这对于开发者来说具有极大的吸引力,从而产生了大量优质、新颖的应用资源,从中受益最大的就是消费者,这也在市场方面提高了Android的竞争力。
Android为Google旗下产品,所以可以无缝对接各种Google优质服务,如搜索、地图、邮件等,为用户提供更好的服务,部分功能甚至已经嵌入Android系统。
以上为Android系统的优势,但其也存在一些问题。
(1)软件质量问题:由于应用开发完全自由,软件的质量参差不齐,导致部分低劣、安全性存在问题的软件出现,增大了软件的控制难度。
(2)系统碎片化问题:多种移动设备厂商在Android原生系统的基础上进行修改和定制,可能会导致部分在原生系统上能够执行的功能在定制系统上无法执行。
(3)屏幕适配问题:各家移动设备厂商生产了具有各种尺寸的屏幕的手机,以及更大的平板电脑,这种屏幕碎片化的问题给Android程序开发人员带来了较大的工作量,程序界面需要适配不同尺寸的屏幕。
Android采用分层的结构,分为五层,共六部分。Android平台架构如图3-1所示。从上到下分别为系统应用层(System Apps)、Java API框架层(Java API Framework)、系统运行库层(Native C/C++Libraries、Android Runtime)、硬件抽象层(Hardware Abstraction Layer,HAL)、Linux内核层(Linux Kernel)、电源管理(Power Maganement)。各层之间分工明确,上层依赖下层的功能或服务,共同构成了Android的体系架构。
图3-1 Android平台架构
系统应用层提供直接与用户交互的应用程序,包括系统内置的应用程序和非系统级的应用程序。例如,电子邮件、短信、日历、互联网浏览和联系人等核心应用,以及从各大应用商店下载的第三方应用等,通常都是用Java语言编写的。
Android平台自带的应用与用户可以选择安装的第三方应用一样,并没有特殊性,是可以被开发人员开发的应用替代的,第三方应用可成为用户的默认浏览器、图库、相机、短信、键盘等,使得程序能够更加灵活、个性化。
应用程序框架层提供了大量用Java语言编写的API,通过调用API中的接口,可以实现Android系统所有的功能。
通过这些API,可以简化核心模块化系统组件和服务的重复使用,任何一个应用都可以发布自己的功能模块,只要遵守框架的限制,就可以被其他应用使用,具体包括以下组件和服务。
(1)内容提供器(Content Providers):使得不同应用程序之间可以共享数据。
(2)视图系统(View System):构建应用程序的基本UI组件,包括列表、网格、文本框、按钮,甚至是可嵌入的网络浏览器。
(3)活动管理器(Activity Manager):管理各个应用程序的生命周期及通常的导航回退功能。
(4)位置管理器(Location Manager):提供位置服务。
(5)包管理器(Package Manager):管理所有安装在Android系统中的应用程序。
(6)通知管理器(Notification Manager):使得应用程序可以在状态栏中自定义提示信息。
(7)资源管理器(Resource Manager):用于访问非代码资源,如本地化的字符串、图片、布局文件、颜色文件等。
(8)电话管理器(Telephony Manager):管理所有的移动设备功能。
(9)窗口管理器(Window Manager):管理所有开启的窗口程序。
系统运行库层分为以下两部分。
(1)原生C/C++库(Native C/C++Libraries),包含一些用于系统中不同组件的C/C++库,一般情况下不能直接调用,通过应用程序框架为开发者提供服务,这些原生C/C++库也是应用程序框架的支撑环节。
如果采用C/C++代码开发应用,可以使用Android NDK直接从原生代码访问某些原生平台库。
原生C/C++库主要包括以下几部分。
● Webkit:一套网页浏览器的软件引擎。
● OpenMAX AL:应用和多媒体中间层的标准接口,使得应用在多媒体接口上具有可移植性。
● Libc:从BSD继承来的标准C系统函数库,是专门为基于嵌入式Linux设备定制的。
● Media Framework:多媒体库,支持多种常用的音频、视频的录制和回放。
● OpenGL ES:3D绘图函数库。
(2)Android运行时(Android Runtime),Android运行时分为核心库和ART两部分,核心库提供了Java语言核心库使用的大部分功能,ART则负责运行应用程序。
①Android Runtime(ART)。Android 5.0(API 21)及更高的版本采用ART取代Dalvik虚拟机,ART是Android上的应用和部分系统服务使用的托管式运行时。
每个Android应用程序都有一个专有的进程,并且有对应的ART实例,在该实例中运行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。ART通过执行DEX文件在低内存设备上运行多个虚拟机,DEX文件是一种专为Android设计的字节码格式,经过优化,其使用的内存很少。编译工具链(如Jack)将Java源代码编译为DEX字节码,使其可在Android平台上运行。
在Android版本5.0(API 21)之前,采用Dalvik虚拟机作为Android的运行时,Dalvik是一种基于寄存器的Java虚拟机,和传统的基于栈的虚拟机不同(如JVM),Dalvik对内存资源进行了优化,并且支持一个设备上运行多个虚拟系统。
ART在Dalvik的基础上又做了进一步的优化,在Dalvik下,程序每次运行,字节码都需要通过即时编译器转换为机器码,会影响程序的运行效率;而在ART环境中,程序第一次安装时,字节码就会预先编译成机器码,使得程序运行时的速度非常快。但是ART机制会占据更多的存储空间,应用安装和系统启动时间会增加。ART兼容了Dalvik,所以如果一个应用在ART上的运行效果很好,那么它在Dalvik上应该也可以运行,但反过来就不一定了。
ART的功能主要包括以下几方面。
● 预先(AOT)编译,ART引入了预先编译机制,可提高应用的性能,在安装时就会编译应用。
● 优化的垃圾回收(GC)机制,优化垃圾回收机制,提高应用性能。
● 对开发、调试的优化支持,ART提供了大量功能来优化应用开发和调试,包括专用采样分析器、详细的诊断异常和崩溃报告。
②Core Libraries(核心库):核心库提供Java API框架层使用的大部分功能。
HAL是硬件与软件之间的抽象层,可定义一个标准接口以供硬件供应商实现,是对硬件设备具体实现的抽象,隐藏了平台的硬件接口细节,使其具有硬件无关性,可在多种平台上进行移植。
硬件抽象层(HAL)提供标准界面,向更高级别的Java API框架显示设备硬件功能。HAL包含多个库模块,其中,每个模块都为特定类型的硬件组件实现一个界面,如相机或蓝牙模块。当框架API要求访问设备硬件时,Android系统将为该硬件组件加载库模块。
Android平台的基础是Linux内核。例如,Android Runtime(ART)依靠Linux内核来执行底层功能,如系统的安全性、线程和底层内存管理、网络协议栈、驱动模型等。
Android App的开发采用的主流语言就是Java,但是Android是基于Linux操作系统而产生的,所以Android的底层也是支持C/C++的。基于Android系统的应用程序一般可采用以下两种方式进行开发。
Android的SDK是由Java开发的,所以如果要使用SDK开发,必须使用Java语言,这种方式也是目前的主流方式。
那么,为何Java会成为Android开发的主流语言呢?首先,Android系统最初的目的就是要实现开源,支持在不同厂商的不同硬件设备上运行。Java以其跨平台性著称,具备上述功能,通过跨平台屏蔽底层硬件的差异,让程序员不必考虑底层硬件的差别而编写多种代码。同时,Java是一种相当成熟的计算机编程语言,其开发者数量巨大,第三方类库、工具等资源众多,使得其开发难度降低。还有最重要的一点,Java虚拟机规范也是开放的,谷歌只要按照甲骨文的虚拟机规范很容易写出一套虚拟机。
将多种因素结合在一起,Java成为最适合Android开发的语言。
NDK,即Native Development Kit,是指原生开发工具包,与Android SDK类似,NDK是Google推出的用于Android App开发的开发工具包。与Android SDK不同的是,NDK采用C/C++语言。NDK是一系列工具的集合,帮助开发者快速开发C(或C++)的动态库,并能自动将so和Java应用一起打包成APK。这些工具对开发者的帮助是巨大的。它集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件,就可以创建so。它可以自动将so和Java应用一起打包,大大减轻了开发人员的打包工作。
Android程序运行在Dalvik虚拟机中,NDK允许用户使用类似C/C++的原生代码语言执行部分程序。之前Android并没有提供NDK,只有SDK。开发者要使用C/C++的第三方类库,就必须使用非官方的方法,执行起来较困难。并且这种需求在增多,所以NDK的产生是必然的。
NDK具有很多采用Java开发Android所不具备的优点,具体如下。
● 对代码的保护,由于APK的Java层代码很容易被反编译,而C/C++库被反编译的难度较大。
● 可以方便地使用现存的开源库,因为大部分的开源库都是用C/C++代码编写的。
● 提高程序的执行效率,将要求高性能的应用逻辑使用C语言开发,从而提高应用程序的执行效率。
● 便于移植,用C/C++语言写的库很容易在其他的嵌入式平台上再次使用。
由于NDK具有这些优点,所以可以用于以下情况。
● 用于一些计算密集型应用和要求高性能的图像渲染工作,如大型的游戏或物理模拟。使用Android SDK通过Java来开发,在速度和性能上很难满足要求。
● 重复使用自己或其他开发者的C/C++库。
基于Android SDK的开发方式,目前主流采用Java语言。但是2017年,Google在I/O大会上宣布Kotlin正式成为Android的官方语言,引起了开发界的轰动。Kotlin是用于现代多平台应用的静态编程语言,由JetBrains(捷克的一家软件开发公司)开发,具有简洁、安全、互操作、工具友好等优点。但是,目前的学习资料、第三方资源尚且不多,还需要更多的人推动其发展。同时,NDK的开发难度较大,对于Android开发的初学者来说并不适用。所以,就目前而言,Java仍是Android开发的首选。
因此,本书后续会采用Android SDK的Java开发方式讲解移动GIS应用的开发。