第1章 Android开发基础
Android是一款操作系统的名称,是科技界巨头谷歌(Google)公司推出的一款运行于手机和平板电脑等设备的智能操作系统。因为Android系统的底层内核是以Linux开源系统架构的,所以它是Linux家族的产品之一。虽然Android外形比较简单,但是其功能十分强大。自从2011年开始到现在为止,Android系统一直占据全球智能手机市场占有率第一的宝座。在本章的内容中,将简单介绍Android系统的诞生背景和发展历程,为读者步入本书后面知识的学习打下基础。
1.1 移动智能设备系统发展现状
在Android系统诞生之前,智能手机这个新鲜事物大大丰富了人们的生活,得到了广大手机用户的青睐。各大手机厂商在市场和消费者用户需求的驱动之下,纷纷研发出了各种智能手机操作系统,并且大肆招兵买马来抢夺市场份额,Android系统就是在这个风起云涌的历史背景下诞生的。在了解Android这款神奇的系统之前,将首先了解当前移动智能设备系统的发展现状。
智能手机和移动智能设备介绍
智能手机是指具有像个人计算机那样强大的功能,拥有独立的操作系统,用户可以自行安装应用软件、游戏等第三方服务商提供的程序,并且可以通过移动通信网络接入到无线网络中。在Android系统诞生之前已经有很多优秀的智能手机产品,例如Symbian系列和微软的Windows Mobile系列等。
对于初学者来说,可能还不知道怎样来区分智能手机。某大型专业统计站点曾经为智能手机的问题做过一项市场调查,经过大众讨论并投票之后,总结出了智能手机所必须具备的功能标准,下面是当时投票后得票率最高的前5个选项:
(1)操作系统必须支持新应用的安装;
(2)高速度处理芯片;
(3)支持播放式的手机电视;
(4)大存储芯片和存储扩展能力;
(5)支持GPS导航。
根据大众投票结果,手机联盟制定了一个标准,并以这个标准为基础,总结出了如下智能手机的主要特点:
(1)具备普通手机的全部功能,例如可以进行正常的通话和发短信等手机应用;
(2)是一个开放性的操作系统,在系统平台上可以安装更多的应用程序,从而实现功能的无限扩充;
(3)具备上网功能;
(4)具备PDA的功能,实现个人信息管理、日程记事、任务安排、多媒体应用和浏览网页;
(5)可以根据个人需要扩展机器的功能;
(6)扩展性能强,并且可以支持第三方软件。
随着科技的进步和发展,智能手机被归纳到移动智能设备当中。在移动智能设备中,还包含了平板电脑、游戏机和笔记本电脑。
1.2 Android系统基础
Android一词最早出现于法国作家Auguste Villiers de l’Isle-Adam在1886年发表的科幻小说《未来夏娃》中,他将外表像人的机器起名为Android。本书的主角就是Android系统,在本节将简要介绍Android系统的诞生和发展历程。
1.2.1 Android系统的发展现状
从2008年HTC和Google联手推出第一台Android手机G1开始,在2011年第一季度,Android在全球的市场份额首次超过塞班系统,跃居全球第一。下面的几条数据能够充分说明Android系统的霸主地位。
(1)2011年11月数据,Android占据全球智能手机操作系统市场52.5%的份额,中国市场占有率为58%。2015年12月消息,数据研究公司IDC公布了最新的报告,报告称至2019年谷歌仍将继续保持领先。在这份报告中指出,预计2019年Android系统将占据全球82.6%的移动系统市场份额,届时iOS的预计份额将为14.1%,也就是说未来4年苹果的市场份额将出现小幅下滑。
(2)如果从某一个时间段进行统计,Android系统也是雄踞市场占有率第一的位置。据著名互联网流量监测机构Net Applications发布的最新数据显示,从2013年9月到2014年7月,在这将近一年的时间里,Android市场占有率却一直处于稳步攀升状态,从最初的29.42%狂飙至44.62%,而iOS的使用量却在一路下滑,从去年9月份的53.68%降至44.19%。
(3)如果从市场硬件产品出货量方面进行比较,Android系统则具有压倒性的优势,其市场份额高达85%,而iOS仅占11.9%
由上述统计数据可见,Android系统的市场占有率位居第一,并且毫无压力。Android机型数量庞大,简单易用,相当自由的系统能让厂商和客户轻松地定制各样的ROM,定制各种桌面部件和主题风格。简单而华丽的界面得到广大客户的认可,对手机进行刷机也是不少Android用户所津津乐道的事情。
可惜Android版本数量较多,市面上同时存在着1.6到当前最新的6.x等各种版本的Android系统手机,应用软件对各版本系统的兼容性对程序开发人员是一种不少的挑战。同时由于开发门槛低,导致应用数量虽然很多,但是应用质量参差不齐,甚至出现不少恶意软件,导致一些用户受到损失。同时Android没有对各厂商在硬件上进行限制,导致一些用户在低端机型上体验不佳。另一方面,因为Android的应用主要使用Java语言开发,其运行效率和硬件消耗一直是其他手机用户所诟病的 地方。
1.2.2 常见的Android设备
因为Android系统的免费和开源,也因为系统本身强大的功能性,使得Android系统不仅被用于手机设备上,而且也被广泛用于其他智能设备中。在接下来的内容中,将简要介绍除了手机产品之外,常见的搭载Android系统的智能设备。
1.Android智能电视
Android智能电视,顾名思义是搭载了Android操作系统的电视,使得电视智能化,能让电视机实现网页浏览、视频电影观看、聊天、办公、游戏等,与平板电脑和智能手机一样的功能。其凭借Android系统让电视实现智能化的提升,数十万款Android市场的应用、游戏等内容随意安装。
2.Android机顶盒
Android机顶盒是指像智能手机一样,具有全开放式平台,搭载了Android操作系统,可以由用户自行安装和卸载软件、游戏等第三方服务商提供的程序,通过此类程序来不断对电视的功能进行扩充,并可以通过网线、无线网络来实现上网冲浪的新一代机顶盒总称。
通过使用Android机顶盒,可以让电视具有上网、看网络视频、玩游戏、看电子书、听音乐等功能,使电视成为一个低成本的平板电脑。Android机顶盒不仅仅是一个高清播放器,更具有一种全新的人机交互模式,既区别于电脑、又有别于触摸屏。Android机顶盒配备红外感应条,遥控器一般采用空中飞鼠,这样就可以方便地实现触摸屏上的各种单点操作,可以方便地在电视上玩愤怒的小鸟、植物大战僵尸等经典游戏。例如乐视公司的LeTV机顶盒便是基于Android打造的,如图1-1所示。
图1-1 基于Android的LeTV机顶盒
3.游戏机
Android游戏机就像Android智能手表一样,在2013年出现了爆炸式增长。在CES展会上,NVIDIA的Project Shield掌上游戏主机以绝对震撼的姿态亮相,之后又有Ouya和Gamestick相继推出。不久前,Mad Catz也发布了一款Andriod游戏机。
4.智能手表
智能手表是将手表内置智能化系统、搭载智能手机系统而连接于网络而实现多功能,能同步手机中的电话、短信、邮件、照片、音乐等。
5.智能家居
智能家居是以住宅为平台,利用综合布线技术、网络通信技术、 智能家居-系统设计方案安全防范技术、自动控制技术、音视频技术将家居生活有关的设施集成,构建高效的住宅设施与家庭日程事务的管理系统,提升家居安全性、便利性、舒适性、艺术性,并实现环保节能的居住环境。
智能家居是在互联网影响之下的物联化体现。智能家居通过物联网技术将家中的各种设备(如音视频设备、照明系统、窗帘控制、空调控制、安防系统、数字影院系统、网络家电以及三表抄送等)连接到一起,提供家电控制、照明控制、窗帘控制、电话远程控制、室内外遥控、防盗报警、环境监测、暖通控制、红外转发以及可编程定时控制等多种功能和手段。与普通家居相比,智能家居不仅具有传统的居住功能,还兼备建筑、网络通信、信息家电、设备自动化,集系统、结构、服务、管理为一体的高效、舒适、安全、便利、环保的居住环境,提供全方位的信息交互功能。帮助家庭与外部保持信息交流畅通,优化人们的生活方式,帮助人们有效安排时间,增强家居生活的安全性,甚至为各种能源费用节约资金。
上述智能设备只是冰山一角,随着物联网和云服务的普及和发展,将有更多的智能设备诞生。
1.3 Android系统架构
Android系统是一个移动设备的开发平台,其软件层次结构包括操作系统(OS)、中间件(Middle Ware)和应用程序(Application)。根据Android的软件框图,其软件层次结构自下而上依次分为以下4层。
(1)操作系统层(OS)。
(2)各种库(Libraries)和Android运行环境(RunTime)。
(3)应用程序框架(Application Framework)。
(4)应用程序(Application)。
上述各个层的具体结构如图1-2所示。
图1-2 Android操作系统的组件结构图
在本节的内容中,将详细讲解Android系统各个层次的基本知识。
1.3.1 最底层的操作系统层(OS)——C/C++实现
Android系统的底层内核基于Linux操作系统,当前最新版本的Android的核心为标准Linux 3.10内核。Android底层的操作系统层(OS)使用C和C++语言编写实现,其实Android系统就是Linux系统,只是Android系统充分利用了已有的机制,尽量使用标准化的内容,如驱动程序,并且做出必要的扩展。Android灵活充分使用了内核到用户空间的接口,这主要表现在字符设备节点、Sys文件系统、Proc文件系统和不增加系统调用。
在Android系统中,包含的内核组件如下所示:
- Binder驱动程序(用户IPC机制);
- Logger驱动程序(用户系统日志);
- timed_output驱动框架;
- timed_gpio驱动程序;
- lowmemorykill组件;
- ram_console组件;
- Ashmem驱动程序;
- Alarm驱动程序;
- pmem驱动程序;
- ADB Garget驱动程序;
- Android Paranoid网络。
1.3.2 Android的硬件抽象层——C/C++实现
其实Android生态系统的架构十分清晰,自下而上经典的模型分别为:Linux驱动、Android硬件抽象层、Android本地框架、Android的Java框架、Android的Java应用程序。因为Android系统需要运行于在不同的硬件平台上,所以需要具有很好的可移植性。其中Android系统的硬件抽象层负责建立Android系统和硬件设备之间的联系。
对于标准化比较高的子系统来说,Android系统使用完全标准的Linux驱动,例如输入设备(Input-Event)、电池信息(Power Supply)、无线局域网(WiFi协议和驱动)和蓝牙(Bluetooth协议和驱动)。
对于Android系统的硬件抽象层来说,主要实现了与移动设备相关的驱动程序,主要包含了如下所示的驱动系统。
- 显示驱动(Display Driver):常用基于Linux的帧缓冲(Frame Buffer)驱动。
- Flash内存驱动(Flash Memory Driver):是基于MTD的Flash驱动程序。
- 照相机驱动(Camera Driver):常用基于Linux的v4l(Video for)驱动。
- 音频驱动(Audio Driver):常用基于ALSA(Advanced Linux Sound Architecture,高级Linux声音体系)驱动。
- WiFi驱动(Camera Driver):基于IEEE 802.11标准的驱动程序。
- 键盘驱动(KeyBoard Driver):作为输入设备的键盘驱动。
- 蓝牙驱动(Bluetooth Driver):基于IEEE 802.15.1标准的无线传输技术。
- Binder IPC驱动:Andoid一个特殊的驱动程序,具有单独的设备节点,提供进程间通信的功能。
- Power Management(能源管理):管理电池电量等信息。
1.3.3 各种库(Libraries)和Android运行环境(RunTime)——中间层
可以将Android系统的中间层次分为两个部分,一个是各种库,另一个是Android运行环境。Android系统的中间层次的内容大多是使用C实现的,其中包含如下所示的各种库。
- C库:C语言的标准库,也是系统中一个最为底层的库,C库是通过Linux的系统调用来实现。
- 多媒体框架(MediaFrameword):这部分内容是Android多媒体的核心部分,基于PacketVideo(即PV)的OpenCORE,从功能上本库一共分为两大部分,一部分是音频、视频的回放(PlayBack),另一部分是则是音视频的记录(Recorder)。
- SGL:2D图像引擎。
- SSL:即Secure Socket Layer位于TCP/IP与各种应用层协议之间,为数据通信提供安全支持。
- OpenGL ES:提供了对3D图像的支持。
- 界面管理工具(Surface Management):提供了对管理显示子系统等功能。
- SQLite:一个通用的嵌入式数据库。
- WebKit:网络浏览器的核心。
- FreeType:位图和矢量字体的功能。
在Android系统中,各种库一般以系统中间件的形式提供,它们都有一个显著的特点:与移动设备的平台的应用密切相关。
在以前的版本中,Android运行环境主要是指Android虚拟机技术:Dalvik。Dalvik虚拟机与Java虚拟机(Java VM)不同,它执行的不是Java标准的字节码(Bytecode),而是Dalvik可执行格式(.dex)中的执行文件。在执行的过程中,每一个应用程序即一个进程(Linux的一个Process)。二者最大的区别在于Java VM是基于栈的虚拟机(Stack-based),而Dalvik是基于寄存器的虚拟机(Register-based)。显然,后者最大的好处在于可以根据硬件实现更大的优化,这更适合移动设备的特点。
从Android 4.4开始,默认的运行环境是ART。ART的机制与Dalvik不同。在Dalvik机制下,应用每次运行的时候,字节码都需要通过即时编译器转换为机器码,这会拖慢应用的运行效率。而在ART环境中,应用在第一次安装的时候,字节码就会预先编译成机器码,使其成为真正的本地应用。这个过程叫作预编译(Ahead-Of-Time,AOT)。这样,应用的启动(首次)和执行都会变得更加 快速。
1.3.4 应用程序框架(Application Framework)
Android的应用程序框架为应用程序层的开发者提供APIs,它实际上是一个应用程序的框架。由于上层的应用程序是以Java构建的,因此本层次提供的首先包含了UI程序中所需要的各种控件,例如:Views(视图组件),其中又包括了List(列表)、Grid(栅格)、Text Box(文本框)和Button(按钮)等,甚至一个嵌入式的Web浏览器。
作为一个基本的Andoid应用程序,可以利用应用程序框架中的以下5个部分来构建。
- Activity(活动)。
- Broadcast Intent Receiver(广播意图接收者)。
- Service(服务)。
- Content Provider(内容提供者)。
- Intent and Intent Filter(意图和意图过滤器)。
1.3.5 应用程序(Application)——Java实现
Android的应用程序主要是用户界面(User Interface)方面的,通过浏览Android系统的开源代码可知,应用层是通过Java语言编码实现的,其中还包含了各种资源文件(放置在res目录中)。Java程序和相关资源在经过编译后,会生成一个APK包。Android本身提供了主屏幕(Home)、联系人(Contact)、电话(Phone)和浏览器(Browers)等众多的核心应用。同时应用程序的开发者还可以使用应用程序框架层的API实现自己的程序。这也是Android开源的巨大潜力的体现。
1.4 Android和Linux的关系
在了解Linux和Android的关系之前,首先需要明确如下3点。
(1)Android采用Linux作为内核。
(2)Android对Linux内核做了修改,以适应其在移动设备上的应用。
(3)Andorid开始是作为Linux的一个分支,后来由于无法并入Linux的主开发树,曾经被Linux内核组从开发树中删除。2012年5月18日,Linux kernel 3.3发布后来又被加入。
1.4.1 Android继承于Linux
Android是在Linux的内核基础之上运行的,提供的核心系统服务包括安全、内存管理、进程管理、网络组和驱动模型等内容,内核部分还相当于一个介于硬件层和系统中其他软件组之间的一个抽象层次,但是严格来说它不算是Linux操作系统。
因为Android内核是由标准的Linux内核修改而来的,所以继承了Linux内核的诸多优点,保留了Linux内核的主题架构。同时Android按照移动设备的需求,在文件系统、内存管理、进程间通信机制和电源管理方面进行了修改,添加了相关的驱动程序和必要的新功能。但是和其他精简的Linux系统相比(例如uClinux),Android基本上保留了Linux的基本架构,因此Android的应用性和扩展性更强。当前Android的版本和Linux内核的版本没有直接对应关系,也就是说所有版本的Android系统都可以运行在Linux 2.6以上内核中。其实Android不是一个完整的OS(系统),这也是Android一直说自己是平台的原因。Android中的Linux内核负责系统底层的调度工作,对于一般用户而言,内核可以近似看成Windows下的“驱动”。
1.4.2 Android和Linux内核的区别
Android系统的系统层面的底层是Linux,中间加上了一个叫作Dalvik的Java虚拟机,表面层上面是Android运行库。每个Android应用都运行在自己的进程上,享有Dalvik虚拟机为它分配的专有实例。为了支持多个虚拟机在同一个设备上高效运行,Dalvik被改写过。
Dalvik虚拟机执行的是Dalvik格式的可执行文件(.dex)——该格式经过优化,以降低内存耗用到最低。Java编译器将Java源文件转为class文件,class文件又被内置的dx工具转化为dex格式文件,这种文件在Dalvik虚拟机上注册并运行。
Android系统的应用软件都是运行在Dalvik之上的Java软件,而Dalvik是运行在Linux中的,在一些底层功能——如线程和低内存管理方面,Dalvik虚拟机是依赖Linux内核的。由此可见,可以说Android是运行在Linux之上的操作系统,但是它本身不能算是Linux的某个版本。
Android内核和Linux内核的差别主要体现在11个方面,接下来将一一简要介绍。
1.Android Binder
Android Binder是基于OpenBinder框架的一个驱动,用于提供Android平台的进程间通信(Inter-Process Communication,IPC)。原来的Linux系统上层应用的进程间通信主要是D-bus(Desktop bus),采用消息总线的方式来进行IPC。
2.Android电源管理(PM)
Android电源管理是一个基于标准Linux电源管理系统的轻量级的Android电源管理驱动,针对嵌入式设备做了很多优化。利用锁和定时器来切换系统状态,控制设备在不同状态下的功耗,以达到节能的目的。
3.低内存管理器(Low Memory Killer)
Android中的低内存管理器和Linux标准的OOM(Out Of Memory)相比,其机制更加灵活,它可以根据需要杀死进程来释放需要的内存。Low memory killer的代码很简单,关键的一个函数是Lowmem_shrinker。作为一个模块在初始化时调用register_shrinke注册了个Lowmem_shrinker,它会被虚拟机在内存紧张的情况下调用。Lowmem_shrinker完成具体操作。简单来说,就是寻找一个最合适的进程杀死,从而释放它占用的内存。
4.匿名共享内存(Ashmem)
匿名共享内存为进程间提供大块共享内存,同时为内核提供回收和管理这个内存的机制。如果一个程序尝试访问Kernel释放的一个共享内存块,它将会收到一个错误提示,然后重新分配内存并重载数据。
5.Android PMEM(Physical)
PMEM用于向用户空间提供连续的物理内存区域,DSP和某些设备只能工作在连续的物理内存上。驱动中提供了mmap、open、release和ioctl等接口。
6.Android Logger
Android Logger是一个轻量级的日志设备,用于抓取Android系统的各种日志,是Linux所没有的。
7.Android Alarm
Android Alarm提供了一个定时器,用于把设备从睡眠状态唤醒,同时它也提供了一个即使在设备睡眠时也会运行的时钟基准。
8.USB Gadget驱动
USB Gadget驱动是一个基于标准Linux USB gadget驱动框架的设备驱动,Android的USB驱动是基于gadget框架的。
9.Android Ram Console
为了提供调试功能,Android允许将调试日志信息写入一个被称为RAM Console的设备里,它是一个基于RAM的Buffer。
10.Android timed device
Android timed device提供了对设备进行定时控制的功能,目前仅仅支持vibrator和LED设备。
11.Yaffs2文件系统
在Android系统中,采用Yaffs2作为MTD nand flash文件系统。Yaffs2是一个快速稳定的应用于NAND和NOR Flash的跨平台的嵌入式设备文件系统,同其他Flash文件系统相比,Yaffs2使用更小的内存来保存它的运行状态,因此它占用内存小;Yaffs2的垃圾回收非常简单而且快速,因此能达到更好的性能;Yaffs2在大容量的NAND Flash上性能表现尤为明显,非常适合大容量的Flash存储。
1.5 Android开发学习路线图
Android系统是一个巨大的智能设备系统,从系统架构到最终的问世发布,并经过一步步的完善,整个过程无不体现了科技界巨头——谷歌公司工程师们的智慧结晶。作为一名Android开发初学者来说,刚接触时会有或多或少的迷茫。在本节的内容中,将引领读者一起探讨Android开发的学习之路。
1.5.1 Android开发的两大方向
1.应用程序开发方向
移动应用程序就是经常提到的APP程序,和1.3.5节中的内容相对应,通常使用Java语言实现。这是当前Android开发中最简单的一个方向,也是当今学习者和就业者最多的一个方向。我们现实中所见到的网易客户端APP、火车站购票APP、美团APP、极品飞车游戏等,这些都属于移动应用程序范畴。
和其他几个方向相比,移动应用程序开发方向的门槛要低,需要接触的Android知识点主要涉及1.3节中提到的应用程序框架(Application Framework)层和应用程序(Application)层。开发者一般只需具备Java面向对象编程、Java网络通信和Android API等知识即可。并且移动应用程序开发方向还是其他方向的基础,也就是说,要想学习其他方向的知识,那么必须先掌握移动应用程序开发方向的知识。
2.底层开发方向
底层开发方向的主要工作是开发1.3节中介绍的除顶层之外的程序。例如硬件抽象层的Android驱动开发和移植,中间层的库订制和产品定制,基于底层的内核重构和产品制造。对于广大读者来说,底层开发方向的门槛比较高。首先读者需要对Andoid系统的源码进行完全了解,这就需要具备Java、C语言、C++和Linux内核方面的知识。然后需要具备和硬件开发相关的知识,简单的只需要直接使用市面中的开发板即可,而复杂的需要自定义实现硬件DIV,然后再进行驱动开发。最复杂的当属硬件产品开发,当然这需要一个开发团队的众多工程师联合进行。例如对于1.2.2节中介绍的移动电视来说,APP开发人员需要为用户开发开机后显示的操作界面,通过此界面可以观看电视和玩游戏。而电视设备中各个电器元件的驱动开发需要底层程序员实现,开发对应的驱动实现元器件和APP程序的桥接。
当然,笔者上述两大方向划分只是笼统地根据Android系统的整体架构进行的,具体的开发方向是一个仁者见仁智者见智的问题。下面笔者将对Andoid的开发方向进行一个简单的总结,具体如 图1-3所示。
图1-3 Android开发的两大方向
本书将重点讲解移动应用程序开发方面的知识,极少涉及底层方面的知识。
1.5.2 Android应用开发需要具备的基础知识
作为学习门槛最低的Android应用程序开发方向来说,读者需要具备Java开发的一些知识,这也是学习本书应该必须具备的基础知识。在此建议读者按照如下两个阶段的学习来打基础。
(1)第一阶段:学习并掌握Java语言的基本语法、高级面向对象特性、设计模式以及常用类库。完成该阶段课程学习之后,可以熟练使用Java语言实现文件读写和网络操作等常见功能。本阶段主要学习Java语言、面向对象程序设计以及设计模式,主要内容有。
- Java基本数据类型与表达式,分支循环。
- String和StringBuffer的使用、正则表达式。
- 面向对象的抽象、封装、继承、多态、类与对象、对象初始化和回收;构造函数、this关键字、方法和方法的参数传递过程、static关键字、内部类,Java的垃极回收机制,Javadoc介绍。
- 对象实例化过程、方法的覆盖、final关键字、抽象类、接口、继承的优点和缺点剖析;对象的多态性:子类和父类之间的转换、抽象类和接口在多态中的应用、多态带来的好处。
- Java异常处理,异常的机制原理。
- 常用的设计模式:Singleton、Template、Strategy模式。
- JavaAPI介绍:基本数据类型包装类、System和Runtime类、Date和DateFomat类等。
- Java集合介绍:Collection、Set、List、ArrayList、Vector、LinkedList、Hashset、TreeSet、Map、HashMap、TreeMap、Iterator、Enumeration等常用集合类API。
- Java I/O输入输出流:File和FileRandomAccess类、字节流InputStream和OutputStream、字符流Reader和Writer,以及相应实现类、IO性能分析、字节和字符的转化流、包装流的概念,以及常用包装类和计算机编码。
- Java高级特性:反射、代理和泛型。
- 多线程原理:如何在程序中创建多线程(Thread、Runnable)、线程安全问题、线程的同步和线程之间的通信、死锁。
- Socket网络编程。
(2)第二阶段:学习并掌握数据库操作方法,Web应用开发技术以及常见数据格式解析。主要学习内容有。
- Java解析XML文件DOM4J。
- SQL数据查询语言,SQLite轻量化数据库。
- JSP和Servlet应用。
- HTTP解析。
- Tomcat服务器的应用配置。
- WebService服务配置应用。