-- |
Android内核剖析
柯元旦 编著
ISBN 978-7-121-14398-4
2011年9月出版
定价:79.90元
16开
616页
内容简介:
本书内容分别从基础、内核、系统、编译以及硬件驱动几个方面对Android内核相关知识进行深入剖析,详细分析了Android内核的内部机制,包括窗口管理系统、Activity管理系统、输入法框架、编译系统等,为Android内核定制以及高级应用程序开发提供技术参考。
本书适合于所有Android相关的工程师以及产品经理。
前 言
“内核剖析”乍一听起来挺吓唬人的,但这个词语存在两个问题,第一个是什么才能称为内核?另一个是“谁”才有能力或者有机会写一本“内核剖析”的书?
本书之所以在前言中提出这个问题,就是为了不吓唬大家,并给大家一种信心,相信自己有能力理解本书的内容。
首先来回答第一个问题,什么才能称为内核?大家都知道,Linux内核的本质包含了线程调度、内存管理及输入/输出管理,那么请问Windows操作系统的内核是什么呢?我们常说,苹果的操作系统Mac OS X的内核是基于UNIX的,那么可以说Mac OS的内核是UNIX吗?
如果仅从线程调度、内存管理,以及输入/输出的角度来区分Windows和Mac OS系统的话,能很明显地感觉到缺少点什么,那就是图形用户接口(GUI),Android、Windows、Mac OS三者的操作方式完全不同,因此,对于图形操作系统而言,本人倾向于将GUI也划归到内核的范畴,这也就是为什么本书使用“内核”作为标题的原因。本书所谓的“内核剖析”的核心也正在于Android所设计的GUI框架的内部原理。Android操作系统是基于Linux实现的,本书并不是去剖析Linux。
下面再来回答第二个问题,即“谁”才有能力或者有机会写一本“内核剖析”的书?如果有人告诉你,一个非微软公司的技术人员写了一本Windows操作系统内核剖析的书,你信吗?反正我不信,原因是,没有阅读过Windows内核源码的人是不可能写出这样的书的,幸运的是Android的源码是开放的。可是源码开放就一定能写这样一本书吗?
在本书截稿时,我未曾见过一本真正分析Android内核的书,大多数书籍都是关于Android SDK应用开发的。在过去的工作经历中,常常遇到一些同事,由于对Android内核不了解,导致在应用程序开发时遇到一些无法解决的问题。遗憾的是,IT类优秀书籍本来就很少,中文原创的更少,Android领域的几乎没有,本人之前也写过一本《Android程序设计》,坦白地讲,当我对Android内核彻底剖析后,觉得那本书有“误人子弟”的成分。因此,我才决定要将自己对Android的理解分享给更多的读者。
那么,我有可能写出一本真正的“内核剖析”的书吗?
我2003年毕业于西安电子科技大学通信工程学院,毕业后与两名同学一起创业,当时我们的目标是做一个“心情播放器”,其本质是一个彩屏多媒体掌上设备,当初想把它做成一个能够根据人的心情自动播放音乐的设备,不谈产品,仅从技术的角度来讲,我们基于美国德州仪器(TI)公司的一款DSP处理器完成了“心情播放器”的设计,包括软件和硬件,该软件系统包括支持最多16个线程的多线程管理、内存管理、FAT16文件系统、GUI子系统,以及一套标准应用程序开发框架、桌面程序等,在这里要再次感谢同宿舍的陈静军同学,他是我到目前为止见过的写代码最优秀的人,在这个项目中,静军设计了这个操作系统的内核及GUI子系统,而我设计了硬件主板、驱动、系统开发框架等,说到这里,如果静军来写一本内核剖析的书,肯定会比我写得更好,在当初设计操作系统前,由于静军还没有加入到我们团队,我才花时间研究了嵌入式操作系统,并设计了一些简单的接口,而当静军加入后,这些工作就由他完成了,因此,从严格意义上讲,我并没有实际编写过操作系统内核代码,只不过从硬件、驱动、系统等不同层面设计了一个系统框架而已。
在这个项目中,一切只是从一颗处理器入手,没有基于任何代码,所有底层代码都是我们编写的,包括汇编和C语言程序设计,因此,在这个过程中,我彻底了解了C语言如何被编译成汇编代码,以及特定处理器如何影响上层的C程序。
当然,这个故事是以失败而告终的,后来我继续从事嵌入式产品设计,包括使用TI高性能DSP处理器、x86处理器,ARM处理器等,不过,仅过了两年时间,又去从事互联网产品的设计,并开始使用Java、C++、PHP、JavaScript、Erlang等不同语言进行软件开发,在使用各种语言时,我常常思考这些语言与底层系统的关系,并从编译原理的角度来理解每一种语言,从而能够理解不同语言的运行环境和操作系统的关系。
直到Android的诞生,我当时对Android的描述是,这是一个把嵌入式系统和互联网应用集合在一起的一个技术。幸运的是这些我都还算熟悉,因此就开始了Android的开发,最开始的时候仅仅是应用程序的开发,虽然也常常考虑Android底层的问题,但由于没有源码,所以也就没有仔细研究,后来发现,这也是一件好事,因为如果不熟悉上层的开发接口,则很难理解内核的一些概念。
后来,应用层积累得差不多了,源码也开放了,于是我就迫不及待地开始了内核之旅,所有的分析都是基于源码的阅读和测试,中间的过程的确是辛苦的,包括在Ubuntu及Mac OS上建立编译环境、思考Android中的异步调度架构、平衡工作和学习的时间等,早上坐地铁也常常看Google groups中关于Android的各种问答。不过,每当你明白一个大的架构的关键之处时,也是一件很开心的事情。
谈及以上履历的目的在于启发正在读大学的朋友,一名电子工程师一定要理论、硬件、软件及梦想同时具备,不要把自己区分为“硬件工程师”、“软件工程师”,我们可以称自己为电子工程师或者“梦想家”。另外,学习一定要循序渐进,如果你还不了解微机原理,那么就不要学习C语言,如果你还不了解数字电路,那么就不要学习微机原理,上层的软件开发需要对底层基础知识的理解,只有这样才能成为一名创造者,并设计出卓越的产品。
多么希望我们中国的大学生在不久的将来也能创造出像Google、Microsoft、Facebook这样著名的企业。
内容介绍
本书内容分为五大部分,分别如下:
第1部分,基础篇。因为Android内核研究必须基于Unix-Like的主机系统上,常见的有Ubuntu和Mac OS X,因此,该部分介绍Linux的一些基础知识,以及在Linux上管理源码的工具git。
第2部分,内核篇。Android内核的核心就是一套GUI系统。该部分主要包含视图的内部工作机制及视图管理器(Window Manager Service)和Activity管理器(Activity Manager Service)的内部工作机制。
第3部分,系统篇。内核不等于操作系统,Android是一个操作系统,因此,除了内核之外,还必须定义一套系统架构,比如应用程序的格式定义,以及应用程序如何被安装和卸载、输入法框架等,有时候这部分内容也叫做外壳(Shell)。
第4部分,编译篇。Android相关的源码据说超过1000万行,这套源码由众多的子项目组成,因此,联合编译这些子项目就是一个复杂的问题。Android源码中定义了一套编译框架,该框架可以方便地编译不同类型的子项目,比如一个动态链接库项目、Jar包项目等。了解该套编译架构后,就可以自由地在源码中添加需要的子项目,并控制系统中已有子项目的编译过程。
第5部分,硬件驱动篇。Android目前最成功的产品当然就是智能手机,但同时由于Android开源的特点,也就可以应用于其他一些特定的产品,比如玩具、学习机、税控机、门禁系统等,因此,该部分介绍了一款硬件开源的Android开发板卡。本来,该部分内容还包括OpenGL框架、多媒体框架及Android硬件抽象层(HAL)三方面内容,但由于出版时间原因,暂未包含,本书下一版将包含这些内容。
读者对象
本书适合于五类读者。
第一类,开发过Android应用程序的工程师。如果你刚开始接触Android,那么这本书可能会很难理解,建议去Android官方网站用两周的时间学习基本的Android应用程序开发,或者去看本人早期创作的《Android程序设计》一书,但要带着怀疑的态度去读。
第二类,Android技术相关的产品经理。对于产品经理而言,了解项目的技术难度及技术可行性,将有助于制定产品开发时间表。虽然产品经理不需要详细了解技术如何实现,但起码应该知道产品技术的复杂度。
第三类,有扎实的开发经验,却未曾接触过Android的开发人员。系统框架的表面尽管各有千秋,但其内涵却不会差别太大,对于有扎实开发经验的朋友而言,只需要重新了解一下Android中的新概念,就能快速地将这些新概念与已有的知识融合起来,这样,便可以节省大量的时间。
第四类,正在基于iOS开发的工程师。本人最近正在研究iOS的开发,令人惊讶的是iOS和Android开发框架是如此相似。Object-C语言和Java语言的语法虽然差别较大,但其思想却很相似,包括单继承、动态性、内存回收机制等。iOS和Android的Framework也惊人相似,比如都使用sqlite进行数据存储,也使用Preference进行参数存储;视图系统的API接口也类似的地方,都可以使用OpengGL进行界面绘制。当然,iOS和Android视图系统还是有一定的差别,比如iOS中每一个View对象都有两个Layer,从而可以方便地使用OpenGL绘制任何一个View对象,而Android却只有一个,所以Android的动画效果没有iOS那样灵活。遗憾的是iOS不是开源的,因此,我们没有机会去了解iOS内部的详细机制,不过既然iOS和Android有这么多相似的地方,那么就可以通过了解Android的内核机制去思考iOS的一些特性。
第五类,想要编写一个GUI子系统的学生。Android虽然更多地用于手机产品,但其内部的GUI子系统的实现却是一种通用的思路,因此,可以完全抛开Android的系统特性,而仅仅去研究其GUI子系统的实现思路,有了这种思路就可以使用各种语言设计自己想要的GUI子系统。
欢迎朋友们与我进行进一步的交流,我的E-mail是yuandanke@gmail.com。
作 者