Android内核剖析


--

Android内核剖析 

柯元旦 编著

ISBN 978-7-121-14398-4  

20119月出版

定价:79.90

16

616

内容简介:

本书内容分别从基础、内核、系统、编译以及硬件驱动几个方面对Android内核相关知识进行深入剖析,详细分析了Android内核的内部机制,包括窗口管理系统、Activity管理系统、输入法框架、编译系统等,为Android内核定制以及高级应用程序开发提供技术参考。

本书适合于所有Android相关的工程师以及产品经理。

内核剖析乍一听起来挺吓唬人的,但这个词语存在两个问题,第一个是什么才能称为内核?另一个是才有能力或者有机会写一本内核剖析的书?

本书之所以在前言中提出这个问题,就是为了不吓唬大家,并给大家一种信心,相信自己有能力理解本书的内容。

首先来回答第一个问题,什么才能称为内核?大家都知道,Linux内核的本质包含了线程调度、内存管理及输入/输出管理,那么请问Windows操作系统的内核是什么呢?我们常说,苹果的操作系统Mac OS X的内核是基于UNIX的,那么可以说Mac OS的内核是UNIX吗?

如果仅从线程调度、内存管理,以及输入/输出的角度来区分WindowsMac OS系统的话,能很明显地感觉到缺少点什么,那就是图形用户接口(GUI),AndroidWindowsMac 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处理器等,不过,仅过了两年时间,又去从事互联网产品的设计,并开始使用JavaC++PHPJavaScriptErlang等不同语言进行软件开发,在使用各种语言时,我常常思考这些语言与底层系统的关系,并从编译原理的角度来理解每一种语言,从而能够理解不同语言的运行环境和操作系统的关系。

直到Android的诞生,我当时对Android的描述是,这是一个把嵌入式系统和互联网应用集合在一起的一个技术。幸运的是这些我都还算熟悉,因此就开始了Android的开发,最开始的时候仅仅是应用程序的开发,虽然也常常考虑Android底层的问题,但由于没有源码,所以也就没有仔细研究,后来发现,这也是一件好事,因为如果不熟悉上层的开发接口,则很难理解内核的一些概念。

后来,应用层积累得差不多了,源码也开放了,于是我就迫不及待地开始了内核之旅,所有的分析都是基于源码的阅读和测试,中间的过程的确是辛苦的,包括在UbuntuMac OS上建立编译环境、思考Android中的异步调度架构、平衡工作和学习的时间等,早上坐地铁也常常看Google groups中关于Android的各种问答。不过,每当你明白一个大的架构的关键之处时,也是一件很开心的事情。

谈及以上履历的目的在于启发正在读大学的朋友,一名电子工程师一定要理论、硬件、软件及梦想同时具备,不要把自己区分为硬件工程师软件工程师,我们可以称自己为电子工程师或者梦想家。另外,学习一定要循序渐进,如果你还不了解微机原理,那么就不要学习C语言,如果你还不了解数字电路,那么就不要学习微机原理,上层的软件开发需要对底层基础知识的理解,只有这样才能成为一名创造者,并设计出卓越的产品。

多么希望我们中国的大学生在不久的将来也能创造出像GoogleMicrosoftFacebook这样著名的企业。

内容介绍

本书内容分为五大部分,分别如下:

1部分,基础篇。因为Android内核研究必须基于Unix-Like的主机系统上,常见的有UbuntuMac 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的开发,令人惊讶的是iOSAndroid开发框架是如此相似。Object-C语言和Java语言的语法虽然差别较大,但其思想却很相似,包括单继承、动态性、内存回收机制等。iOSAndroidFramework也惊人相似,比如都使用sqlite进行数据存储,也使用Preference进行参数存储;视图系统的API接口也类似的地方,都可以使用OpengGL进行界面绘制。当然,iOSAndroid视图系统还是有一定的差别,比如iOS中每一个View对象都有两个Layer,从而可以方便地使用OpenGL绘制任何一个View对象,而Android却只有一个,所以Android的动画效果没有iOS那样灵活。遗憾的是iOS不是开源的,因此,我们没有机会去了解iOS内部的详细机制,不过既然iOSAndroid有这么多相似的地方,那么就可以通过了解Android的内核机制去思考iOS的一些特性。

第五类,想要编写一个GUI子系统的学生。Android虽然更多地用于手机产品,但其内部的GUI子系统的实现却是一种通用的思路,因此,可以完全抛开Android的系统特性,而仅仅去研究其GUI子系统的实现思路,有了这种思路就可以使用各种语言设计自己想要的GUI子系统。

欢迎朋友们与我进行进一步的交流,我的E-mailyuandanke@gmail.com

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/broadview/archive/2011/09/23/2186439.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/263184.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Bitmap的秘密

为什么80%的码农都做不了架构师?>>> 之前已经参加过几次QCon峰会,不过今年QCon 2014 上海峰会对我来说比较特别,不再只是一名听众,而是第一次登台演讲。感觉的确不太一样,一来是身份从听众变成了讲师&…

POJ 2018 Best Cow Fences (二分答案构造新权值 or 斜率优化)

$ POJ~2018~Best~Cow~ Fences $(二分答案构造新权值) $ solution: $ 题目大意: 给定正整数数列 $ A $ ,求一个平均数最大的长度不小于 $ L $ 的子段 这道题首先我们如果没有长度限制,直接扫一遍数组即可而有了长度限制…

hdu 2531 Catch him

Catch him Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 124 Accepted Submission(s): 49 Problem Description在美式足球中,四分卫负责指挥整只球队的进攻战术和跑位,以及给接球员传球…

POJ 3889 Fractal Streets(逼近模拟)

$ POJ~3889~Fractal~Streets $(模拟) $ solution: $ 这是一道淳朴的模拟题,最近发现这种题目总是可以用逼近法,就再来练练手吧。 首先对于每个编号我们可以用逼近法求出它在各个图上是处于左上,右上,左下&a…

我,只关心接口

我们去饭店吃饭,坐下。然后叫:服务员!好,服务员来了。你会说:倒茶。或说:点菜。是吧。你不会说:来,我们讨论一下什么是面向对象吧。这是为什么呢?很简单,对你…

POJ 2054 Color a Tree (贪心)

$ POJ~2054~Color~a~Tree $ $ solution: $ 我们先从题中抽取信息,因为每个点的费用和染色的次数有关,所以我们可以很自然的想到先给权值大的节点染色。但是题目还说每个节点染色前它的父亲节点也必须被染色,这就有了很多的后效性。 暂时没有办…

使用Null Object设计模式[转]

在ESFramework的设计实现中,很多地方都用到了Null Object设计模式。Null Object模式的含义在于,提供一个对象给指定的类型,用以代替这个对象为空的情况。 Null Object提供了“什么也不做”的行为,隐藏来自它的合作者的细节。对于如何理解和应…

angular input使用输入框filter格式化日期

最近使用angular日期选取器。只需要把所选的输出迄今input输入框,根据默认的假设,显示是在时间的形式的时间戳。不符合规定。需要格成一个特定的公式格公式。但input上ng-model不能直接对用于filter。因此内容需要一种方法来在这里显示格式化。 网上寻找…

CH0805 防线 (二分值域,前缀和,特殊性质)

$ CH~0805~ $ 防线 (二分值域,前缀和,特殊性质) $ solution: $ 注意博主所给题面的输出和原题有些不同 这道题当时想了很久很久,就是想不到怎么写。果然还是太 $ vegetable $ 了。首先我们可以肯定的是,我们不能暴力枚举&#xff…

基于Layui实现的树形菜单页面

基于Layui实现的树形菜单页面具体方法实现方法一:针对Layui模板的前后端统一更新1. 删除2. 添加3. 后端方法二:基于Dtree实现的纯前端树形增删改文中的组件地址具体方法实现 实现树形菜单,本文将给出两种实现方式。 针对Layui前端模板EasyW…

POJ 1723 Soldiers (中位数)

$ POJ~1723~Soldiers $ (中位数) $ solution: $ 这道题说难也不算太难,但是当时自己想的很矛盾。所以还是列一篇题解。 这道题首先比较容易看出来的就是:行和列是两个分开的问题,而且行的移动就是一个仓库选址的板子,直接求中位数…

(一)Windows环境下汇编编程读书笔记

看了一节关于80x86系列处理器简史,不知道云里和雾里,什么晶体管啊,什么什么之类的不知道云里和雾里,看了讲什么都不知道啊! 转载于:https://www.cnblogs.com/Nuxgod/articles/692990.html

Docker知识点总结及其命令的使用

DockerDocker简介Docker与Tomcat有什么区别?Docker与虚拟机有什么区别?Docker的基本组成Docker的联合文件系统Docker基本命令Docker中的几个重要组件一、容器数据卷二、Dockerfile三、Docker网络虚拟机共享网络的三种方式Docker共享网络的四种方式Docker…

主题:Spring注解入门(转载)

原文链接:http://www.iteye.com/topic/295348 1. 使用Spring注解来注入属性 1.1. 使用注解以前我们是怎样注入属性的 类的实现: Java代码 public class UserManagerImpl implements UserManager { private UserDao userDao; public void …

XDJM的情意比山高,比海深!!

又是兄弟姐妹们帮我提前过的生日,我们这帮人从SC出来后还没好好聚过,乘这个机会把大家约了出来。星期五整整一天都很快乐,特别是我,NANA,小乔期待着晚上的聚餐,期待着金贸的蛋糕,嘿嘿。。他们好…

最大子矩阵和

最大子矩阵和 $ n^3 $ 算法 $ solution: $ 首先我们不难想到枚举上下左右边界,然后两层循环统计权值和,复杂度 $ O(n^6) $ 。这个我们用前缀和可以省去后面的循环,将复杂度降成 $ O(n^4) $ 。然后我们考虑不枚举上下左右四个边界,…

Springfox-swagger使用详解

Springfox-swagger使用详解什么是Swagger?Swagger的具体使用一、导入依赖二、建立Swagger配置类三、通过Swagger测试接口引用什么是Swagger? 是一个开源的API Doc的框架可以将我们的Controller中的API方法以文档的形式展现,并支持为其添加注…

Android中调用系统已安装的播放器来播放网络流媒体视频

2019独角兽企业重金招聘Python工程师标准>>> 实现思路比较简单几行代码就可以搞定,在界面放一个Button或者带有播放图标的imageview,点击事件中调用本地播放器来播放。 Uri uri Uri.parse("http://218.200.69.66:8302/upload/Media/20…

WireShark详解

WireShark详解Wireshark介绍Wireshark使用一、基础数据说明二、指定数据包过滤Wireshark安装Wireshark介绍 Wireshark是一款可以运行在多平台的网络抓包工具,可以嗅探通过本机网卡的各类网络包,并对它们的协议,源、目标地址等多种数据进行解…

多图上传 - Web Uploader

http://fex.baidu.com/webuploader/ 官方DEMO,我都不想说了,各种问题。参考ShuaiBi文章 http://www.cnblogs.com/ismars/p/4176912.html 用了bootstrap 代码百度网盘地址:http://pan.baidu.com/s/1pJkj9wf 自己参照改改就好了。 //所有文件上…