tips:阅读该知识应具有C++的基本知识,因为本书的大部分内容都集中在了Native层。 本书是在分析Android源码的基础上展开的,而源码文件所在的路径一般都很长,例如, 文件AndroidRuntime.cpp的真实路径就是framework/base/core/jni/AndroidRuntime.cpp 本书的编写顺序,是6、5、4、7、8、9、10、2、3、1章,但出于逻辑连贯性的考虑,还是建议读者按本书的顺序阅读。其中,第2、5、6章分别讲述了JNI、Android常用类 ,以及Binder系统,这些都是基础知识,我们有必要完全掌握。其他部分的内容都是针对单个模块的,例如Zygote、Audio、Surface、MediaScanner等,读者可各取所需,分别对其进行研究该书是上册,全书一共10章,这10章的主要内容是: 第1章 介绍了阅读本书所需要做的一些准备工作,包括对Android整个系统架构的认识,以 及Android开发环境和源码阅读环境的搭建等。注意,本书分析的源码是Android2.2。 第2章 通过Android源码中的一处实例深入地介绍了JNI技术。 第3章 围绕init进程,介绍了如何解析init.rc以启动Zygote和属性服务(property service)的工作原理。 第4章 剖析了zygote和system_server进程的工作原理。本章的拓展思考部分讨论了Andorid的 启动速度、虚拟机heapsize的大小调整问题以及“看门狗”的工作原理。 第5章 讲解了Android源码中常用的类,如sp、wp、RefBase、Thread类、同步类、Java中的 Handler类以及Looper类。这些类都是Android中最常用和最基本的,只有掌握这些类的知识, 才能在分析后续的代码时游刃有余。 第6章 以MediaServer为切入点,对Binder进行了较为全面的分析。本章拓展思考部分讨论 了与Binder有关的三个问题,它们分别是Binder和线程的关系、死亡通知以及匿名Service。 第7章 阐述了Audio系统中的三位重要成员AudioTrack、AudioFlinger和AudioPolicyService 的工作原理。本章拓展思考部分分析了AudioFlinger中DuplicatingThread的工作原理,并且和 读者一道探讨了单元测试、ALSA、Desktop check等问题。 第8章 以Surface系统为主,分析了Activity和Surface的关系、Surface和SurfaceFlinger的关系 以及SurfaceFlinger的工作原理。本章的拓展思考部分分析了Surface系统中数据传输控制对象 的工作原理、有关ViewRoot的一些疑问,最后讲解了LayerBuffer的工作流程。这是全书中难度较大的一章,建议大家反复阅读和思考,这样才能进一步深入理解Surface系统。 第9章 分析了Vold和Rild,其中Vold负责Android平台中外部存储设备的管理,而Rild负责 与射频通信有关的工作。本章的拓展思考部分介绍了嵌入式系统中与存储有关的知识,还探 讨了Rild和Phone设计优化方面的问题。 第10章 分析了多媒体系统中MediaScanner的工作原理。
Android系统搭建出了一个java世界,他的运转依赖于另一个被Google极力隐藏的Native世界。
Java虽具有与平台无关的特性,但Java和具体平台之间的隔离却是由JNI层来实现的。Java 是通过JNI层调用Linux OS中的系统调用来完成对应的功能的,例如创建一个文件或一个 Socket等。 除了Java世界外,还有一个核心的Native世界,它为整个系统高效和平稳地运行提供了强 有力的支持。一般而言,Java世界经由JNI层通过IPC方式与Native世界交互,而Android平台 上最为神秘的IPC方法就是Binder了,第6章将详细分析Binder。除此之外,Socket也是常用的 IPC方式。将软件源地址设置成了http://mirror.bjtu.edu.cn/ubuntu。
2.下载Android源码下面开始下载Android源码,工序比较简单,可一气呵成。 apt-get install git-core curl#先下载这两个工具 mkdir-p/develop/download-froyo#在根目录下建立develop和download-froyo两个目录 cd~/develop/download-froyo#进入这个目录 curl http://Android.git.kernel.org/repo>./repo#从源码网站下载repo脚本,该脚本是Google 为了方便源码下载而提供的,通过该脚本可下载整套源码。 chmod a+x repo#设置该脚本为可执行 ./repo init-u git://Android.git.kernel.org/platform/manifest.git-b froyo#初始化git库 ./repo sync#下载源码,大小约为2GB,如果网速快,估计也得要2个多小时。
./jdk-1_5_0_22-linux-i586.bin#执行这个文件
这个命令的功能其实就是解压,解压后的结果在/develop/jdk1.5.0_22目录中。现在有了 JDK,再按照下面的步骤部署它即可: (1)在~/.bashrc文件的末尾添加以下几句话: export JAVA_HOME=/develop/jdk1.5.0_22#设置为刚才解压的目录
export JRE_HOME=JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
(2)重新登录系统,这样JDK资源就能被正确找到了。 如果只知道目标模块的名称,则应使用make模块名的方式来编译目标模块。例如,如果要 编译libmedia,则直接使用make libmedia即可。另外,初次编译时也要采用这种方法。 如果不知道目标模块的名称,但知道目标模块所处的目录,则可使用mmm或mm命令来编 译。当然,初次编译还必须使用make命令,以后的编译就可使用mmm或mm了,这样会节约 不少时间。 注意 一般的编译方式都使用增量编译,即只编译发生变化的目标文件,但有时则需重新 编译所有目标文件,那么就可使用make命令的-B选项。例如make-B模块名,或者mm-B、 mmm-B。在mm和mmm内部,也是调用make命令的,而make的-B选项将强制编译所有目标文 件
3.本书各模块的编译目标 本书各模块的编译目标如表1-1所示,这里仅列出几个有代表性的模块:
假设make framework,那么编译完的结果则如图1-6所示