技术经验共享

经过数年的发展,Android 系统取得了巨大的进展。一方面,Android 设备层出不穷,逐代更新;另一方面,Android第三方应用也成为不同领域开发者的开发重点。从软件系统的角度考虑,Android系统已经逐渐趋于成熟和稳定。Android 2.3.x版本的开源软件广泛应用于手机、电视等各种设备;Android 4.x作为开源的新版本,整合了手机和平板电脑两方面的功能。

由于软件系统的架构已经成熟,Android 开源版本的升级已经不再对框架层做出较大的更改,而是横向增加外围的功能。从软件工程师的角度,深入 Android 系统开发已经到了比较适当的阶段。

但是,目前从事 Android 各个方面开发的工程师大都很难达到深入了解系统级别的目的,在开发乃至学习中存在着较大的盲区和误区。

Android开发者主要的问题集中在以下几个方面。

(1)领域的交叠造成混乱。由于 Android 的开发者来自不同领域,很可能不了解其他方面的技术背景。庞大的 Android 软件系统也涉及 Linux 开发、Java 开发,以及 Android系统本身各个方面的技术,因此只熟悉一个方面的技术很难深入Android系统的开发。

(2)开发者低估Android系统的复杂性。Android系统的结构、功能已经和桌面电脑相当,在某些方面甚至需要考虑更多内容。在 Android 系统实现一个模块要涉及软件系统的各个层次,很多时候已经超出了开发者的认知范畴。

(3)Android 应用开发者的局限。很多 Android 应用程序的开发者仅仅使用 Windows中的SDK开发环境。在实际操作中,此种环境并不足以开发Android应用程序,甚至只开发第三方应用程序也不能只使用此环境。这是由Android系统的内部结构决定的。

(4)系统级的软件结构设计不成熟。Android设备的开发者为了实现某种功能、某个模块,有时会使用权宜(Workaround)的方式。虽然暂时解决了问题,但是效率较低,事倍功半,还可能存在兼容性问题和安全漏洞。

(5)错误的理念,互相误导。Android开发门槛较低,实际的难度却较深。由于目前网络交流比较方便,很多偏颇或者肤浅的开发经验得以传播。

在理想的状态下,Android的高级开发者应该具有Linux开发经验、熟悉C/C++和Java语言、具有GUI系统的经验,具有大型软件设计经验。这不意味着开发者必须达到这个程度才能开发Android,但是开发者的确应当首先知道自己能做什么,不能做什么。不可一味拔高,做完全超出自己知识和技术能力外的开发工作。

关于本书的内容

本书的编写团队主要由各种岗位的开发人员组成,开发过程中的宝贵经验是本书主要的内容来源。本书力求为广大开发者提供一些宝贵的经验,让工程师的灵感得以传播,让各个不同领域的开发者都能够以正确、高效的方式进行学习和开发。Android是一个实际的系统,能够作为传播的内容应该来自实际开发过程中归纳的经验,而不应来自对代码的阅读,更不应来自道听途说。这也是本书的核心理念。

本书主要由两篇组成,分别侧重于 Android 开发的不同方面。本书中 Android 系统的技术关系如下图所示。

第1篇称之为“Android核心框架层开发”。第1章介绍框架的基础,第2章介绍编译系统,第3章至第5章介绍本地框架层,第6章是Java运行环境,第7章至第9章介绍Java框架层内容,第10章介绍GUI系统和应用程序管理。本篇自下而上介绍Android核心的框架层次结构,并将开发的技巧和要点蕴含于其中。

第2篇称之为“Android 系统级应用开发要点”,偏重系统级的应用层,关注 Android开发过程中的重点方面。用5章篇幅关注了系统的兼容性、安全性、预置应用层、定制、调试和测试几个方面。

本书组织结构和特点

本书介绍 Android 系统中的通用内容,不依赖特定的硬件,使用仿真器的环境基本可以学习大部分的内容。

Android中具有多个子系统和模块,其中某些部分的实现非常复杂。对于这些部件,本书主要给出它们的结构框图和代码路径。至于它们内部的实现,不作为本书的重点。为了体现实用性,本书的重点是对于开发有所帮助的部分。

第1篇内容,重点在于Android软件系统的中间两个层次。Android是一个基于Linux的系统,其自下而上的软件结构是本书第1篇的主线。本书采用了自本地层到Java层,最后介绍GUI系统的方式,完整展现Android框架层的结构。

在主线之外,本书第1篇还有三条次线:第一条是Android系统较为特殊的通信机制,包括属性、套接字和 Binder;第二条是系统的运行流程;第三条是各个部分调试方法。除此之外,开发技巧和要点则位于每一章当中。本书第1篇尽量将分散的知识和经验总结成一个串行的结构,可以保证自前而后的顺序。当然也有部分前面的内容需要后面知识的情况,读者可以对照阅读。

第2篇内容,重点在于Android系统最上面的一个层次,本部分内容的复杂度不是很高。本篇在组织上的一个要点是应用程序包和框架层之间的关系。5 个章节相互独立,也有所联系。安全机制、NDK特殊程序结构、可定制部分、调试和测试手段等开发的实用方面位于各章当中。

在 Android 系统的相关开发中,有两种不同方式:一种是快速的、表面化的开发,不追究系统原理,靠形式上的仿做来实现功能;另一种是在深厚的技术底蕴中,精研Android系统,以清晰思路进行最优化的开发。在本书作者看来,两种方式并无优劣之分,为了实现开发成果,各种开发方式都可使用。本书的内容,既有对 Android 系统的精研,也有对快速开发的支持。

对于两种方式的区别,本书关注几个要点:第一,开发者可以在不深入研究系统的情况下,进行快速的表面开发,但要注意不能陷入开发的误区,本书的编译板级支持、NDK开发、预置应用、系统定制等几个部分是这种类型;第二,有些核心模块开发,必须在深入研究系统的情况下才能完成,不能以表层开发的方式开发核心模块,本书的本地框架、Java框架、Java本地调用几部分是这种类型;第三,精研系统的目的一般也是为了开发,应该避免“一叶障目,不见森林”,对片面和局部进行极端的深入研究往往效率低、难度大,因此本书核心部分的研究通常先给出整体框图和各个部分的代码路径。

由于 Android 系统开源已经升级了若干个版本,以后还将进行升级。在开发过程中的经验有些只适用某些版本,而不能适应所有版本。这也为 Android 系统的开发过程造成了一些困难。为了达到普遍的适应性,本书在编写上考虑了版本升级的问题。首先,本书对照了从 Android 的历史版本和最新发布之前,大多数的内容在各个版本的 Android 系统中都具有,并且基本相同的,稳定的部分显然也是精华的内容;其次,对于Android 2.3.x之前版本不同的内容,本书会标注点明;最后,Android 4.x对核心框架改动的内容并不多,本书单独构建一章予以介绍。

本书秉承实用理念,措辞精练,每一章、每一小节都为读者提供知识和技术的要点。目的是在有限的篇幅内,为读者展示更多的内容。本书在排版上吸收了各方面的经验,采取了相当紧凑的方式。书中列出的结构图以清晰的方式表示了各部分的结构,列出的代码选取了最精华的片断,并且增加了作者的注释。

本书读者

本书适合于一切在做或者准备做 Android 开发的技术人员。本书的内容涉及 Android系统的内部核心实现。本书作者没有能力帮助读者快速获得十年的开发经验,但是可以为读者指明开发的方向,并加强读者对技术的认识,更上一层楼。

Linux用户空间中的C语言开发和Java语言开发是本书的技术基础,也是Android系统技术最重要的两个基础。建议每个领域的读者都应增强这两个方面的知识。

Android系统级的开发需要Linux主机环境,通过阅读本书学习Android系统的开发,最好具有此环境。在Windows中使用Source Insight等工具阅读Android源代码,并运行SDK中的仿真器是一种退而求其次的方式,这种方式也可以学习到很多知识。作者依然强烈建议读者阅读本书的时候可以对照 Android 源代码,并可以在 Linux 环境通过编译全部源代码生成仿真器。

不同的知识结构、从事不同领域的读者在阅读本书的过程中,重点可能不同。

如果读者希望全面了解Android系统,自前而后地阅读本书是非常适合的。通过对第1篇的系统框架结构和启动流程的学习,读者会更深入地理解 Android 系统是什么,由什么组成,涉及了哪些方面。第2篇作为第1篇的补充,也可以为读者提供大量较为实用的知识和技巧。

如果读者从事Android设备的全面开发,则通常需要具有Linux和Java较全面的知识,阅读要点如下所示:

● 第1篇的框架和系统结构部分是重点;

● 第1篇的编译系统部分帮助读者理解对系统的全局性配置;

● 第1篇通信部分和结构设计对于在系统中增加模块有所帮助;

● 第1篇的调试部分可以辅助读者的开发过程;

● 第2篇的系统定制有助于帮助读者理解系统的一些细节;

● 第2篇的兼容性和安全系统帮助读者了解和解决系统中深层次的问题。

如果读者从事 Android 设备硬件移植方面的开发,通常要对 Linux 语言的开发有较深的了解,阅读要点如下所示:

● 第1篇通信部分和具体硬件相关子系统结构相结合,了解一个硬件如何适配于Android系统;

● 第1篇的启动流程部分为读者提供了硬件优化方面的知识;

● 第1篇的GUI系统提供将Android系统适配于非手机设备的相关知识;

● 第2篇安全系统方面帮助读者了解新增硬件的安全管理。

如果读者从事Android应用程序的开发,则通常要对Java语言的开发有一定的理解,阅读要点如下所示:

● 第1篇Java框架部分帮助读者了解Android系统中的隐藏内容;

● 第2篇第10章帮助读者了解SDK开发的局限性,第三方应用和预置应用的区别;

● 第1篇Java层调试部分,第2篇测试和调试部分有助于读者深入调试应用;

● 第2篇预置应用部分帮助读者了解Android中预置应用程序层的结构;

● 第1篇的JNI部分和第2篇的NDK部分会对读者在应用程序中使用本地内容有所帮助。

本书作者

本书的编写工作由国内 Linux 和 Android 领域资深的技术人员韩超领衔。本书也是韩超付出心血最多,编写时间最长,亲自执笔比例最大的一本书。参与本书编写的还有来自Android开发领域的梁泉、崔海斌、马若劼、于仕林等,机锋网(www.gfan.com)的张宇、张超、赵家维、黄亮、沈桢、徐威特等,国软时代(www.gredu.org.cn)的孙丽娜,以及杨钰、曹道刚等。广大社区开发者也对本书的成稿做出了贡献。

本书的核心作者团队大都来自开发一线,在工作之余完成本书。为了使本书尽早和读者见面,编写过程略显仓促。虽然经过审校,可能依然存在一些错误,敬请读者谅解。