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,一经查实,立即删除!

相关文章

QQ,MSN,SKYPE等在线状态代码

QQ在线咨询代码,MSN在线代码,雅虎通在线代码,贸易通在线代码 即时通讯如雅虎通,腾讯QQ,微软MSN,AOL ICQ,goolge TALK,阿里巴巴 贸易通,淘宝旺旺等大大方便了我们的沟通和工作,在web2.0的时代,在你的网站网页上添加雅虎通,腾讯QQ,微软MSN,AOL ICQ,goolge TALK,阿里巴巴 贸易通,淘…

Bitmap的秘密

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

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

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

LeetCode—剑指 Offer 59 - I、59 - II

剑指 Offer 59 - I. 滑动窗口的最大值、59 - II. 队列的最大值 题目描述: [59 - I] 给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。 [59 - II] 请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_…

在WinForm中实现省市级联的效果

在WinForm通过连接数据库来实现省市级联的效果首先,在数据库中创建两个表,省份表(Province)和城市表(City),两个表之间需建立外键约束,主键是省份Id, 外键是城市表中的省份Id,从而建立起省份和城市之间的从属关系。示例代码&#…

.net常用的方法

//用javascript判断是否去那个页面Response.Write("<script language\"javascript\" type\"text/javascript\">");Response.Write("if(confirm(是否去那个页面。)){ document.URLLookContent.aspx}");Response.Write("<…

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在美式足球中&#xff0c;四分卫负责指挥整只球队的进攻战术和跑位&#xff0c;以及给接球员传球…

AE 模板 天使之城

http://p2p.uying.com/html/20061206/20491895751.stmhttp://www.yxdmt.net/bbs/dispbbs.asp?boardid17&ID1716 转载于:https://www.cnblogs.com/jackcovey/archive/2007/02/05/640858.html

POJ 3889 Fractal Streets(逼近模拟)

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

LeetCode—剑指 Offer 37、38

剑指 Offer 37. 序列化二叉树、38. 字符串的排列 题目描述&#xff1a; [37] 请实现两个函数&#xff0c;分别用来序列化和反序列化二叉树。 你需要设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑&#xff0c;你只需要保证一个二叉…

linux:将job放在后台执行的方法

本文转自http://www.ibm.com/developerworks/cn/linux/l-cn-nohup/ 我自己在工作需要远程连到公司的开发机&#xff0c;在开发机上运行程序时&#xff0c;一旦退出终端就会导致运行的程序被终止&#xff0c;该如何解决呢&#xff1f; 答案就是让程序在后台运行&#xff0c;不受…

GMapbook中文版上线

详细信息及下载地址http://blog.gmap2.net/gmapbook_release/测试地址http://www.gmap2.net/guestbook/转载于:https://www.cnblogs.com/ejk/archive/2007/02/16/651678.html

$2019$ 暑期刷题记录 $2$(基本算法专题)

$ 2019 $ 暑期刷题记录 $ 2 $ &#xff08;基本算法专题&#xff09; $ by~~wch $ $ BZOJ~1958~Strange~Towers~of~Hanoi $ &#xff08;动态规划&#xff0c;递推&#xff09; 题目大意&#xff1a; 求有 $ n $ 个盘子和 $ 4 $ 座塔的汉诺塔问题。 $ solotion: $ 首先需要参考…

LeetCode—<动态规划专项>剑指 Offer 19、49、60

剑指 Offer 19. 正则表达式匹配、49. 丑数、60. n个骰子的点数 题目描述&#xff1a; [19] 请实现一个函数用来匹配包含’. ‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符&#xff0c;而’表示它前面的字符可以出现任意次&#xff08;含0次&#xff09;。在本题中…

java并发编程-Executor框架

http://www.iteye.com/topic/366591 一、创建线程池 Executors类&#xff0c;提供了一系列工厂方法用于创先线程池&#xff0c;返回的线程池都实现了ExecutorService接口。 public static ExecutorService newFixedThreadPool(int nThreads) 创建固定数目线程的线程池。 public…

我,只关心接口

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

java实现颜色Color对象和16进制之间的转换

package com.tsxs.test;import java.awt.Color;public class TestColor {public static void main(String[] args) {System.out.println(toHexFromColor(Color.BLUE));System.out.println(toColorFromString(toHexFromColor(Color.BLUE)));}/*** Color对象转换成字符串* param …

POJ 2054 Color a Tree (贪心)

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

LeetCode—剑指 Offer 51. 数组中的逆序对

剑指 Offer 51. 数组中的逆序对 题目描述&#xff1a; [51] 在数组中的两个数字&#xff0c;如果前面一个数字大于后面的数字&#xff0c;则这两个数字组成一个逆序对。输入一个数组&#xff0c;求出这个数组中的逆序对的总数。 考察重点&#xff1a; 第51题归并排序实现。在…

Callable与Future的介绍

Callable与Future的介绍Callable与 Future 两功能是Java在后续版本中为了适应多并法才加入的&#xff0c;Callable是类似于Runnable的接口&#xff0c;实现Callable接口的类和实现Runnable的类都是可被其他线程执行的任务。 Callable的接口定义如下&#xff1b; public interfa…