著名软件架构师、顾问、作家和演讲家Ted Neward有一天和朋友Simone聊天时,谈到如何给初级程序员分配任务的问题。Simone用在墙上挂画这个例子作了一个巧妙的比喻。
你让一个初级员工在墙上挂一幅画,但是他从来没有干过这种事情。因为你知道怎么在墙上挂一幅画,并且觉得这是一件简单的事情,所以就没有向他解释如何去做。事实上,这个初级员工有很多细节问题是不清楚的,例如,要使用什么样的工具等。这时候就可能会出现两种情况。第一种情况是他认为可以使用订书机和磁带机来把这幅画挂在墙上。第二种情况是他会在Google上搜索,阅读参考书,并且向讨论组求助,最后认为应该要使用高级气动射钉枪来把这幅画挂在墙上。当你最终告诉这个初级员工要使用锤子和钉子来完成这件事情时,又会出现另外一个问题:他不知道如何有效地使用锤子和钉子来将一幅画挂在墙上。因为他从未见过锤子,不知道要用手来固定钉子,然后再用又圆又平的锤头来大力地将钉子打进墙里面去。
这个例子使得Ted Neward想起了他刚开始学习XML时碰到的问题。Ted Neward看到文档这样写:用SAX解析器读取XML文件,不要用DOM解析器,因为DOM解析器运行速度慢,并且占用内存多。Ted Neward不解,问别人:为什么不能用DOM解析器来解析XML文件呢?难道就因为它的实现效果差吗?别人告诉他:不,如果你只是想获得作者和标题信息,那么何必将一个10M大小的XML文件全部加载到内存中去呢?Ted Neward听了之后,说:我需要将一个完整的20KB大小的XML文件的内容映射到网页上去。这时候别人就告诉他:那你还是使用DOM解析器吧。
于是,Ted Neward就思考这样一个问题:一个初级程序员如何才能从入门到精通一门新的技术?最后,Ted Neward得出的结论是:初级程序员们必须学会向有经验的人提出问题,这样才会少走弯路,并且得到正确的答案。
在本书的构思之初,我们同样也在思考这样一个问题:这本书应该怎么写,才能让一个从未接触过Android的程序员能够从入门到精通Android系统的实现原理?
本书作者刚开始学习Linux内核知识时,面对着浩如烟海的源代码,根本就无从下手。后来就陆陆续续地在网上寻找学习资料。一段时间下来,学习资料是找到不少,也看了不少。但是接下来在阅读Linux内核的源代码时,总是感觉不能将那些相关的知识点粘合在一起形成一个完整的知识面。直到最后阅读了《Linux内核源代码情景分析》这本书之后,才有一种豁然开朗的感觉。《Linux内核源代码情景分析》一书最大的特点便是通过情景描述来分析Linux内核源代码,这样做的好处就是能够将那些相关的知识点粘合在一起形成一个完整的知识面。例如,在分析打开一个文件的过程时,会有针对性地介绍所涉及到的数据结构和算法,这样读者就可以对文件系统的实现原理有一个生动而深刻的理解。
想到了这一点之后,联想到前面所说的墙上挂画的例子,按照“情景”来学习一门新的技术不就正好是一个恰当的工具吗?于是,我们就决定参考《Linux内核源代码情景分析》一书的写法,按照情景来分析Android系统的源代码,使得读者可以对整个Android系统的实现原理有一个融会贯通的理解。
墙上挂画这个例子还告诉我们,有了工具之后,还需要正确有效地运用它,才能让它发挥应有的作用。毋容置疑,《Linux内核源代码情景分析》是一本经典的Linux内核书籍典范,但是相信阅读过这本书的读者普遍有这样一个感觉:在阅读的过程中稍感吃力,因此需要多次重复阅读,才能消化其中的知识。我们思考了这个问题,认为《Linux内核源代码情景分析》一书在以下两个方面稍有欠缺。
第一方面是缺少一些原理描述图。例如,在按照情景来分析一个过程时,缺少相应的过程描述图。人的大脑对图像的认知是相当敏感的,当我们在使用文字来描述一个观点的时候,如果能够配合相应的图像来表达,那么这个观点就会相当的直觉,易于理解和接受。
第二方面是缺少一些使用示例。虽然有时候我们已经知道一个接口的实现原理了,但是当我们真正去使用它的时候,却不知道怎么下手。就好比我们已经知道画挂在墙上是因为它被钉子钉住在墙里了,但是这个钉子是如何钉住在墙里的呢?如果我们能够给出一个示例来说明钉子是如何被打进墙里去的,即先用手固定钉子,然后再用锤子大力将它打进墙里去,那么就能够更好地理解为什么可以用锤子和钉子来将画挂在墙上了。
认识到以上两点之后,本书在写作的过程中,碰到一些比较复杂的知识点时,都会给出相应的原理描述图。例如,使用类关系图来描述组件间的关系模型,以及使用序列图来描述情景过程。同时,还会给出完整的使用示例来阐述这些知识点是如何被运用的。这些使用示例都是可以直接编译和运行的。通过这种原理和使用示例结合的写作方式,我们力图将Android系统的实现原理以具体、生动和深刻的形式表达出来。
本书在结合使用情景来阐述Android系统的实现原理的时候,为了做到全面、深入和细致,分析的源代码涉及到了Linux内核层、硬件抽象层(HAL)、运行时库层(Runtime)、应用程序框架层(Application Framework)以及应用程序层(Application)。这样就能使读者很好地去把握Android系统的整体架构,以及理解各个层次所承担的角色。
为了方便阐述Android系统的实现原理,本书将内容划分为初识Android系统、Android专用驱动系统和Android应用程序框架三大篇章。
初识Android系统篇包含三个章节,介绍了源代码的下载、编译和运行,以及Android系统的智能指针和硬件抽象层。在应用程序框架层的Native代码中,大量的使用了智能指针,因此,在分析Android系统的源代码之前,我们需要对它的智能指针有所了解。而学习Android系统的硬件抽象层,能够使得我们迅速掌握Android系统的层次结构。
Android专用驱动系统篇也是包含三个章节,分析了Android系统在Linux内核中的三个专用驱动程序,分别是Logger日志驱动程序、Binder进程间通信驱动程序以及Ashmem匿名共享内存驱动程序。毋容置疑,这三个专用驱动,特别是Binder进程间通信驱动程序,构成了Android系统的坚实基础,学习它们对理解Android系统有非常大的帮助。
Android应用程序框架篇包含了十个章节,从应用程序组件、进程、消息和安装四个角度来系统地分析了Android应用程序的架构。我们知道,移动平台最核心的竞争力是运行在它上面的丰富的、高质量的应用程序,而这些丰富的、高质量的应用程序离不开优秀的应用程序基础设施和架构,因此,本书花了很大的篇幅来介绍Android应用程序的框架。Android应用程序的框架是理解整个Android系统的一个很好的切入点,毕竟系统所做的一切都是为使得运行在它之上的应用程序有一个良好的用户体验,从而可以很好地为用户服务。
本书的内容,初稿自于笔者的CSDN博客——老罗的Android之旅,使用的源代码是Android 2.3的。当本书发布时,Android系统的最新版本已经是4.1。但是,我们仍然坚持使用Android 2.3的源代码来分析Android系统的实现原理,主要是基于以下两个理由。
第一个理由是即使是在本书发布之时,在所有的Android系统版本中,2.3的市场占用率仍然是占据第一,达到67%,遥遥领先于排名第二的4.0,后者的市场占有率为18%。要知道,Android 2.3是2010年12月发布的,它能长期占据着市场占有率第一的位置,足以说明它的广泛性、稳定性和代表性。
第二个理由是Android系统的版本是不断向前进化的。即使今天我们基于最新的4.1的源代码来分布本书,后面也会出现5.0、6.0和7.0等Android系统版本。但是,万变不离其宗,我们希望读者通过阅读本书,第一是可以掌握Android系统的基本实现原理,第二是学会分析Android系统的方法,即掌握分析Android系统的工具以及正确有效地使用这个工具。这样,无论Android系统的版本如何进化,读者都能够自行地学习和掌握它。
最后,本书的顺利出版,要特别感谢广大的网友。感谢你们对CSDN博客——老罗的Android之旅(http://blog.csdn.net/Luoshengyang)的支持和鼓励。可以说,如果没有你们的支持和鼓励,就不会有本书的出版。我们衷心希望能够通过这本书,可以帮助到大家全面、深入和细致地掌握Android系统,共同引领移动互联网新时代!
推荐
|
读书也是这样,全局把握,细节深入。
> 我来回应