深入理解andriod系统Word格式文档下载.docx
- 文档编号:8337255
- 上传时间:2023-05-11
- 格式:DOCX
- 页数:71
- 大小:101.93KB
深入理解andriod系统Word格式文档下载.docx
《深入理解andriod系统Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《深入理解andriod系统Word格式文档下载.docx(71页珍藏版)》请在冰点文库上搜索。
《深入理解Android:
卷I》推荐序
近两年来,IT行业的最热点聚焦到了移动互联网上。
PC时代,WINTEL联盟成就了英特尔和微软各自的霸业。
移动互联网时代,谁将上演新的传奇?
新生的Android当年仅用短短一年多的时间就跻身全球智能操作系统的三甲行列。
在北美市场,如今Android已经超过iOS和黑莓系统成为老大!
Android势不可挡,ARM+Android组合的前景一片光明,越来越多的从业者加入了Android行列!
与带给人们良好用户体验的iOS不一样的是,Android是一个开放的系统,其所有代码都是开源的。
因此,对于开发者而言,不仅可以做到知其然,更可以做到知其所以然!
然而,要想知道其所以然,并不是一件简单的事情。
回想当初,我开始接触Android的时候,除了Android源码外,其他资料甚少。
Android是基于Linux的完整操作系统,其代码量让人望而生畏。
可以想象,在没有指导的情况下一头扎进操作系统庞大的代码中是一件让人多么痛苦的事情。
时间过得很快,Android生态链已经得到了充分的发展。
现在市场上的Android资料已经开始泛滥,书籍已经数不胜数。
然而,绝大部分书籍只限于讲解Android应用的开发(拜Android应用API所赐),没有深入到系统级的探讨,极少的所谓提供Android深入指导的资料也只是浅尝辄止。
如果想深入了解Android系统,只有华山一条路:
自己看Android源代码!
正是因为如此,当初凡平告诉我他要系统地整理其深入钻研Android源代码的心得时,我表示了强烈的赞同。
这是一件极少有人做过的事情,这件事情将给已经或即将跨入Android世界的同仁们极大的帮助!
这本书里,作者以代码框架为主线,用循序渐进的方式将框架中的关键点一一剖开,从而给读者一个架构清楚、细节完善的立体展现。
另外,凡平还会用他的幽默给正在啃枯燥代码的您带来不少笑意和轻松。
毫无疑问,如果您想深入了解Android系统,这本书就是您进入Android神秘世界的钥匙。
如果您看准了移动互联网的前景,想深入理解Android,那就让这本书指导您前进吧!
邓必山
2011年6月于北京
卷I》前言
虽然前言位于书的最前面,但往往是最后才完成的。
至今,本书的撰写工作算是基本完成了,在书稿付梓之前,心中却有些许忐忑和不安,因为拙著可能会存在Bug。
为此,我先为书中可能存在的Bug将给大家带来的麻烦致以真诚的歉意。
另外,如果大家发现本书存在纰漏或有必要进一步探讨的地方,请发邮件给我,我会尽快回复。
非常乐意与大家交流。
本书主要内容
全书一共10章,其中一些重要章节中还设置了“拓展思考”部分。
这10章的主要内容是:
第1章介绍了阅读本书所需要做的一些准备工作,包括对Android整个系统架构的认识,以及Android开发环境和源码阅读环境的搭建等。
注意,本书分析的源码是Android2.2。
第2章通过Android源码中的一处实例深入地介绍了JNI技术。
第3章围绕init进程,介绍了如何解析init.rc以启动Zygote和属性服务(propertyservice)的工作原理。
第4章剖析了zygote和system_server进程的工作原理。
本章的拓展思考部分讨论了Andorid的启动速度、虚拟机heapsize的大小调整问题以及“看门狗”的工作原理。
第5章讲解了Android源码中常用的类,如sp、wp、RefBase、Thread类、同步类、Java中的Handler类以及Looper类。
这些类都是Android中最常用和最基本的,只有掌握这些类的知识,才能在分析后续的代码时游刃有余。
第6章以MediaServer为切入点,对Binder进行了较为全面的分析。
本章拓展思考部分讨论了与Binder有关的三个问题,它们分别是Binder和线程的关系、死亡通知以及匿名Service。
笔者希望,通过本章的学习,大家能更深入地认识Binder的本质。
第7章阐述了Audio系统中的三位重要成员AudioTrack、AudioFlinger和AudioPolicyService的工作原理。
本章拓展思考部分分析了AudioFlinger中DuplicatingThread的工作原理,并且和读者一道探讨了单元测试、ALSA、Desktopcheck等问题。
通过对本章的学习,相信读者会对Audio系统有更深的理解。
第8章以Surface系统为主,分析了Activity和Surface的关系、Surface和SurfaceFlinger的关系以及SurfaceFlinger的工作原理。
本章的拓展思考部分分析了Surface系统中数据传输控制对象的工作原理、有关ViewRoot的一些疑问,最后讲解了LayerBuffer的工作流程。
这是全书中难度较大的一章,建议大家反复阅读和思考,这样才能进一步深入理解Surface系统。
第9章分析了Vold和Rild,其中Vold负责Android平台中外部存储设备的管理,而Rild负责与射频通信有关的工作。
本章的拓展思考部分介绍了嵌入式系统中与存储有关的知识,还探讨了Rild和Phone设计优化方面的问题。
在本章的拓展思考部分,笔者提出了几个问题,旨在激发读者深入思考和学习Android的欲望。
本书特色
笔者认为,本书最大的特点在于,较全面、系统、深入地讲解了Android系统中的几大重要组成部分的工作原理,旨在通过直接剖析源代码的方式,引领读者一步步深入于诸如Binder、Zygote、Audio、Surface、Vold、Rild等模块的内部,去理解它们是如何实现的,以及如何工作的。
笔者根据研究Android代码的心得,在本书中尝试性地采用了精简流程、逐个击破的方法进行讲解,希望这样做能帮助读者更快、更准确地把握各模块的工作流程及其本质。
本书大部分章节中都专门撰写了“拓展思路”的内容,希望这部分内容能激发读者对Android代码进行深入研究的热情。
本书面向的读者
(1)Android应用开发工程师
对于Android应用开发工程师而言,本书中关于Binder,以及sp、wp、Handler和Looper等常用类的分析或许能帮助你迅速适应Android平台上的开发工作。
(2)Android系统开发工程师
Android系统开发工程师常常需要深入理解系统的运转过程,而本书所涉及的内容可能正是他们在工作和学习中最想了解的。
那些对具体模块(如Audio系统和Surface系统)感兴趣的读者也可以直接阅读相关章节的内容。
这里有必要提醒一下,要阅读此书,应具有C++的基本知识,因为本书的大部分内容都集中在了Native层。
如何阅读本书
本书是在分析Android源码的基础上展开的,而源码文件所在的路径一般都很长,例如,文件AndroidRuntime.cpp的真实路径就是framework/base/core/jni/AndroidRuntime.cpp。
为了书写方便起见,我们在各章节开头把该章所涉及的源码路径全部都列出来了,而在具体分析源码时,则只列出该源码的文件名。
下面就是一个示例:
[-->
AndroidRuntime.cpp]
//这里是源码分析和一些注释。
如有一些需要特别说明的地方,则会用下面的格式表示:
AndroidRuntime.cpp:
:
特别说明]
特别说明可帮助读者找到源码中的对应位置。
另外,本书在描述类之间的关系以及在函数调用流程上使用了UML的静态类图以及序列图。
UML是一个强大的工具,但它的建模规范过于烦琐,为更简单清晰地描述事情的本质,本书并未完全遵循UML的建模规范。
这里仅举一例,如图1所示:
图1 UML示例图
如上图所示:
画在外部类内部的方框用于表示内部类。
接口和普通类用同一种框图表示。
本书所使用的UML图都比较简单,读者大可不必花费时间专门学习UML。
本书的编写顺序,其实应该是6、5、4、7、8、9、10、2、3、1章,但出于逻辑连贯性的考虑,还是建议读者按本书的顺序阅读。
其中,第2、5、6章分别讲述了JNI、Android常用类以及Binder系统,这些都是基础知识,我们有必要完全掌握。
其他部分的内容都是针对单个模块的,例如Zygote、Audio、Surface、MediaScanner等,读者可各取所需,分别对其进行研究。
致谢
首先要感谢杨福川编辑。
本书最初的内容来自我的博客
其次要感谢我的妻子。
为写成此书,我几乎将周末所有的时间都花在了工作中,而长时间在生活上对妻子不闻不问。
对丈夫呆若木鸡式的冷淡,妻子却给予了最大的宽容。
另外,我的岳父母和我的父母亲都给予了我最无私的帮助,他们都是平凡而伟大的父母亲。
还有我和妻子的亲戚们,他们的宽厚和善良时刻感动着我。
在IT职业的道路上,非常感念前东家中科大洋公司的领导和同事们,他们是邓伟先生、刘运红先生、王宁先生等。
当初,如果没有他们宽容的接纳和细心的指导,现在我不可能成为一名合格的程序员。
非常感谢我现在供职的单位中科创达公司。
在这里工作,我常有这样一种感慨:
不是所有人都能自己开公司创业的,而又有多少人能够有机会和一个优秀的创业公司一起成长、一起发展呢?
创达开明的领导、睿智而富有激情的工作伙伴正是孕育本书的沃土。
公司领导赵鸿飞先生、吴安华女士等人更是给予了我最大的肯定和鼓励。
这里要特别提及的是,我的大学同窗,即为本书作序的邓必山先生。
如果没有他的推荐,凭自己那份简陋、单薄的简历,是根本无法与Android亲密接触的。
另外,他还曾在技术和个人发展上给予过我很多的指导,对此,我将永志不忘!
谢谢那些共享Android知识的网友们!
没有大家前期点滴的奉献,或许我至今还在琢磨着某段代码呢。
最后应感谢的是肯花费时间和精力阅读本书的读者,你们的意见和建议将会是我获得的巨大的精神财富!
邓凡平
卷I》目录
第1章 阅读前的准备工作/1
1.1 系统架构/2
1.1.1 Android系统架构/2
1.1.2 本书的架构/3
1.2 搭建开发环境/4
1.3 工具介绍/8
1.4 本章小结/12
第2章 深入理解JNI/13
2.1 JNI概述/14
2.2 学习JNI的实例:
MediaScanner/15
2.3 Java层的MediaScanner分析/16
2.4 JNI层MediaScanner的分析/17
2.5 本章小结/32
第3章 深入理解init/33
3.1 概述/34
3.2 init分析/34
3.3 本章小结/60
第4章 深入理解zygote/61
4.1 概述/62
4.2 zygote分析/62
4.3 SystemServer分析/74
4.4 zygote的分裂/84
4.5 拓展思考/88
4.6 本章小结/93
第5章 深入理解常见类/95
5.1 概述/96
5.2 以“三板斧”揭秘RefBase、sp和wp/96
5.3 Thread类及常用同步类分析/109
5.4 Looper和Handler类分析/121
5.5 本章小结/129
第6章 深入理解Binder/130
6.1 概述/131
6.2 庖丁解MediaServer/132
6.3 服务总管ServiceManager/152
6.4 MediaPlayerService和它的Client/158
6.5 拓展思考/162
6.6 学以致用/166
6.7 本章小结/172
第7章 深入理解Audio系统/173
7.1 概述/174
7.2 AudioTrack的破解/174
7.3 AudioFlinger的破解/200
7.4 AudioPolicyService的破解/234
7.5 拓展思考/262
7.6 本章小结/272
第8章 深入理解Surface系统/273
8.1 概述/275
8.2 一个Activity的显示/275
8.3 初识Surface/297
8.4 深入分析Surface/310
8.5 SurfaceFlinger分析/353
8.6 拓展思考/377
8.7 本章小结/394
第9章 深入理解Vold和Rild/395
9.1 概述/396
9.2 Vold的原理与机制分析/396
9.3 Rild的原理与机制分析/428
9.4 拓展思考/459
9.5 本章小结/463
第10章 深入理解MediaScanner/464
10.1 概述/465
10.2 android.process.media分析/465
10.3 MediaScanner分析/472
10.4 拓展思考/486
10.5 本章小结/488
第5章深入理解常见类
本章涉及的源代码文件名称及位置
下面是本章分析的源码文件名和它的位置。
RefBase.h(framework/base/include/utils/RefBase.h)
RefBase.cpp(framework/base/libs/utils/RefBase.cpp)
Thread.cpp(framework/base/libs/utils/Thread.cpp)
Thread.h(framework/base/include/utils/Thread.h)
Atomic.h(system/core/include/cutils/Atomic.h)
AndroidRuntime.cpp(framework/base/core/jni/AndroidRuntime.cpp)
Looper.java(framework/base/core/Java/Android/os/Looper.java)
Handler.java(framework/base/core/Java/Android/os/Handler.java)
HandlerThread.java(framework/base/core/Java/Android/os/HandlerThread.java)
5.1概述
初次接触Android源码时,见到最多的一定是sp和wp。
即使你只是沉迷于Java世界的编码,那么Looper和Handler也是避不开的。
本章的目的,就是把经常碰到的这些内容中的“拦路虎”一网打尽,将它们彻底搞懂。
至于弄明白它们有什么好处,就仁者见仁,智者见智了。
个人觉得Looper和Handler相对会更实用一些。
5.2 以“三板斧”揭秘RefBase、sp和wp
RefBase是Android中所有对象的始祖,类似于MFC中的CObject及Java中的Object对象。
在Android中,RefBase结合sp和wp,实现了一套通过引用计数的方法来控制对象生命周期的机制。
就如我们想像的那样,这三者的关系非常暧昧。
初次接触Android源码的人往往会被那个随处可见的sp和wp搞晕了头。
什么是sp和wp呢?
其实,sp并不是我开始所想的smartpointer(C++语言中有这个东西),它真实的意思应该是strongpointer,而wp则是weakpointer的意思。
我认为,Android推出这一套机制可能是模仿Java,因为Java世界中有所谓weakreference之类的东西。
sp和wp的目的,就是为了帮助健忘的程序员回收new出来的内存。
说明 我还是喜欢赤裸裸地管理内存的分配和释放。
不过,目前sp和wp的使用已经深入到Android系统的各个角落,想把它去掉真是不太可能了。
这三者的关系比较复杂,都说程咬金的“三板斧”很厉害,那么我们就借用这三板斧,揭密其间的暧昧关系。
5.2.1 第一板斧——初识影子对象
我们的“三板斧”,其实就是三个例子。
相信这三板斧劈下去,你会很容易理解它们。
例子1]
Cpp代码
1.//类A从RefBase派生,RefBase是万物的始祖。
2.classA:
publicRefBase
3.{
4.//A没有任何自己的功能。
5.}
6.intmain()
7.{
8.A*pA=newA;
9.{
10.//注意我们的sp、wp对象是在{}中创建的,下面的代码先创建sp,然后创建wp。
11.sp<
A>
spA(pA);
12.wp<
wpA(spA);
13.//大括号结束前,先析构wp,再析构sp。
14.}
15.}
//类A从RefBase派生,RefBase是万物的始祖。
classA:
publicRefBase
{
//A没有任何自己的功能。
}
intmain()
A*pA=newA;
{
//注意我们的sp、wp对象是在{}中创建的,下面的代码先创建sp,然后创建wp。
sp<
wp<
//大括号结束前,先析构wp,再析构sp。
}
例子够简单吧?
但也需一步一步分析这斧子是怎么劈下去的。
1.RefBase和它的影子
类A从RefBase中派生。
使用的是RefBase构造函数。
代码如下所示:
RefBase.cpp]
1.RefBase:
RefBase()
2.:
mRefs(newweakref_impl(this))//注意这句话
4.//mRefs是RefBase的成员变量,类型是weakref_impl,我们暂且叫它影子对象。
5.//所以A有一个影子对象。
6.}
RefBase:
RefBase()
:
mRefs(newweakref_impl(this))//注意这句话
//mRefs是RefBase的成员变量,类型是weakref_impl,我们暂且叫它影子对象。
//所以A有一个影子对象。
mRefs是引用计数管理的关键类,需要进一步观察。
它是从RefBase的内部类weakref_type中派生出来的。
先看看它的声明:
1.classRefBase:
weakref_impl:
publicRefBase:
weakref_type
2.//从RefBase的内部类weakref_type派生。
classRefBase:
weakref_type
//从RefBase的内部类weakref_type派生。
由于Android频繁使用C++内部类的方法,所以初次阅读Android代码时可能会有点不太习惯,C++的内部类和Java的内部类相似,但有一点不同,即它需要一个显式的成员指向外部类对象,而Java的内部类对象有一个隐式的成员指向外部类对象的。
说明 内部类在C++中的学名叫nestedclass(内嵌类)。
RefBase.cpp:
weakref_imple构造]
1.weakref_impl(RefBase*base)
mStrong(INITIAL_STRONG_VALUE)//强引用计数,初始值为0x1000000。
3.,mWeak(0)//弱引用计数,初始值为0。
4.,mBase(base)//该影子对象所指向的实际对象。
5.,mFlags(0)
6.,mStrongRefs(NULL)
7.,mWeakRefs(NULL)
8.,mTrackEnabled(!
!
DEBUG_REFS_ENABLED_BY_DEFAULT)
9.,mRetain(false)
10.{
11.}
weak
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 深入 理解 andriod 系统