因为《深刻理解Android 卷一》和《深刻理解Android卷二》再也不出版,而知识的传播不该该由于纸质媒介的问题而中断,因此我将在OSC博客中全文转发这两本书的所有内容。 html
本章主要内容 java
Android是Google公司推出的一款手机开发平台。该平台自己是基于Linux内核的,图1-1展现了这个系统的架构: linux
图1-1 Android系统架构 android
从上图中能够看出,Android系统大致可分为四层,从下往上依次是: git
从上面的介绍可看出,Android最大的特色之一,恐怕就是搭建了一个被广大Java开发者热捧的Java世界了。但该世界并非空中楼阁,它的运转依赖另外一个被Google极力隐藏的Native世界。两个世界的交互关系可用图1-2来表示: 编程
图1-2 Java世界和Native世界交互 ubuntu
从上图可知: bash
本书所分析的模块也将遵循Android系统架构,如图1-3所示: 架构
图1-3 本书的架构图 oracle
从上图可知,本书所分析的各个模块除未涉及Kernel外,其余三层均有所涉足,它们分别是:
本节,将介绍如何搭建Android源码开发环境。
首先,须要一个Linux系统,我本人推荐安装Ubuntu10.04(32位版本)。读者可从网上下载该版本的系统。Windows用户可以使用VMWare或VirtualBox做为虚拟机,来安装Ubuntu10.04。我本人推荐VMWare,由于它的功能太强大了!
若是要使用VMWare,那么在安装完Ubuntu以后,必定要把VMWare Tools也安装上,由于这个工具会提供不少很是实用的功能。这里还有一个小建议,若是Linux系统只是我的使用,则建议用root帐户登陆系统。在工做中,曾发现不少用非root帐户登陆的同事成天都在sudo,输入密码,这样作就浪费了很多零碎的时间片。
假设读者已经安装好了Ubuntu 10.04(32位版本),而且以root帐户登陆到系统上了,接下来的工做是:
Android源码采用Git①作版本管理工具,这个工具由Linux之父LinusTorvalds采用纯C开发。关于Git为何使用C语言开发的问题,还引起了一场关于C和C++孰好孰坏的大讨论,不过Linus Torvalds显然没树起“居庙堂之高,则忧其民”的形象。对于普通码农而言,用最合适的工具、最实用的办法来完成好工做才是最重要的。因此C、C++、Java、Python等都仅仅是工具而已。
下面介绍如何下载源码。
下载Android源码前,有些下载工具须要从Ubuntu软件源上下载。能够为Ubuntu系统指定一个软件源。有些软件源上有这些工具,有些却没有,并且各个软件源的下载速度也不一样,因此应首先找到一个合适的软件源。Ubuntu软件源的设置界面如图1-3所示:
图1-3 Ubuntu软件源设置
从上图中可发现,将软件源地址设置成了http://mirror.bjtu.edu.cn/ubuntu。每一个人可根据本身的状况选择合适的软件源。
下面开始下载Android源码,工序比较简单,可一鼓作气。
下载完后,该目录中的内容如图1-4所示:
图1-4 源码下载结果
注意,Kernel的代码必需要单独下载,下载方法以下:
git clone git://android.git.kernel.org/kernel/common.gitkernel
Froyo的编译依赖JDK1.5,因此首先要作的就是下载JDK1.5。下载网址是http://www.oracle.com/technetwork/java/javase/downloads/index-jdk5-jsp-142662.html。下载获得的文件为jdk-1_5_0_22-linux-i586.bin。把它放到一个目录中,好比我本人,就将它放在了/develop中,而后在这个目录中执行:
./jdk-1_5_0_22-linux-i586.bin #执行这个文件
这个命令其实就是解压,解压后的结果在/develop/jdk1.5.0_22目录中。现有了JDK,再按照下面的步骤部署它便可:
exportJAVA_HOME=/develop/jdk1.5.0_22 #设置为刚才解压的目录
exportJRE_HOME=JAVA_HOME/jre
exportCLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
exportPATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
Android的编译有本身的一套规则,主要利用的就是mk文件。网上有太多关于它的解说了,这里再也不赘述,只简单介绍其编译工序:
进入源码目录(以个人开发环境为例),也就是 cd /develop/download_froyo
执行完上面几个步骤后,就能够编译系统了。Android平台提供了三个命令用于编译,它们分别是make、mmm和mm,这三个命令的使用方法及其优劣以下:
从使用的角度来看,我本人有以下建议:
通常的编译方式都使用增量编译,即只编译发生变化的目标文件。但有时则需从新编译全部目标文件,那么就可以使用make命令的-B选项。例如 make –B 模块名,或者mm –B、mmm –B 。mm和mmm内部,也是调用make命令的,而make的-B选项将强制编译全部目标文件。
Android的编译工序比较简单,难点主要在Android.mk文件的编写。读者可上网搜索与此相关的学习资料。
本书各模块的编译目标如表1-1所示,这里仅列出几个有表明性的模块:
表1-1 本书各模块编译目标
目标模块 |
make命令 |
mmm命令 |
init |
make init |
mmm system/core/init |
zygote |
make app_process |
mmm frameworks/base/cmds/app_process |
system_server |
make services |
mmm frameworks/base/services/java |
RefBase等 |
make libutils |
mmm frameworks/base/libs/utils |
Looper等 |
make framework |
mmm frameworks/base |
AudioTrack |
make libmedia |
mmm frameworks/base/media/libmedia |
AudioFlinger |
make libaudioflinger |
mmm frameworks/base/libs/audioflinger |
AudioPolicyService |
make libaudiopolicy |
mmm hardware/msm7k/libaudio-qsd8k (示例) |
SurfaceFlinger |
make libsurfaceflinger |
mmm frameworks/base/libs/surfaceflinger |
Vold |
make vold |
mmm system/vold/ |
Rild |
make rild |
mmm hardware/ril/rild/ |
MediaProvider |
make MediaProvider |
mmm packages/providers/MediaProvider |
Phone |
make Phone |
mmm packages/apps/Phone/ |
假设make framework,那么编译完的结果则如图1-5所示:
图1-5 make framework的结果
从上图可看出,make命令编译了framework-res.apk以及framework.jar两个模块。它们编译的结果在out/target/product/generic/system/framework下。读者利用adb 命令把这两个文件push到手机的system/framework目录,便可替换旧的文件。如想测试这个新模块,则须要先杀掉全部使用该模块的进程,进程重启后会从新加载模块,这时就能使用新的文件了。例如,想测试刚修改的libaudioflinger模块,adb push上去后,先杀掉mediaserver进程,由于libaudioflinger库目前只有该进程使用。当mediaserver重启后,就会加载新push上来的libaudioflinger库了。
系统服务被杀掉后通常都会自动重启(由init控制,在第三章中可见到)。
本节介绍Android开发和源码研究过程当中两件比较实用的工具。
Source Insight是阅读源码的必备工具,是一个Windows下的软件,在Linux平台上可经过wine安装。这里,就不讲述如何安装Source Insight了,相信读者都会。下面介绍一下在Source Insight使用上的小技巧。
使用Source Insight时,须要新建一个源码工程,经过菜单项Project→New Project,可指定源码的目录。在工做中发现,不少同事常一股脑把Android全部源代码都加到工程中,从而致使了Source Insight运行速度很是慢。实际上,只须要将当前分析的源码目录加到工程便可。例如,新建一个Source Insight工程后,只把源码/framework/base目录加进去了。另外,当一个目录下的源码分析完后,能够经过Project→Add and Remove Project Files选项把无须再分析的目录从工程中去掉。如图1-6所示:
图1-6 添加或删除工程中的目录
从图中的框线咱们能够发现:
通常首先把framework/base下的目录加到工程,之后若有须要,再把其余目录加进来。
Source Insight默认的字体比较小,看着很费眼。怎么办?
选择工具栏上Options→Document options菜单,弹出Document Options对话框,其中左上部分有个Screen Fonts,而后会弹出一个字体对话框,在那里可选择大字体,例如四号,五号字体等。如图1-7所示:
图1-7 字体调节
工程创建好后,须经过Project→Rebuild Project选项来解析源码。另外,在研究源码时经常会只记得源码文件名,而不记得是在哪一个目录下。不要紧,Source Insight支持在源码中快速定位文件。使用方法如图1-8所示:
图1-8 快速定位文件
使用方法是:
Busybox,号称Linux平台上的“瑞士军刀”,它提供了不少经常使用的工具,例如grep、find等。这些工具在标准Linux上都有,但Android系统却去掉了其中的大多数工具。这致使了咱们在调试程序、研究Android系统时寸步难行,因此就须要在手机上安装Busybox。
咱们可从下面这个网站中下载已编译好的Busybox,如图1-9所示:
http://www.busybox.net/downloads/binaries/1.18.4/
图1-9 Busybox下载
注意该网站已经根据不一样平台编译好了对应的Busybox,咱们可根据本身手机的状况下载对应的文件。例如HTC G7的CPU支持armv7l,因此我下载了最接近的busybox-armv6l。
小知识:arm v7表示的是ARM指令集为v7,目前ARM Cortex-A8/A9系列的CPU支持该指令集。
下载完busybox后,需将它push到手机上。如:
adb push busybox /system/xbin #为了不冲突,我push到了/system/xbin目录下了。
cd /system/xbin #进入对应目录
chmod 755 busybox #更改busybox权限为可执行
busybox –-install #安装busybox
grep #执行busybox提供的grep命令,或者busybox xxx执行xxx命令也行
Busybox安装完了,如执行busybox命令,就会打印如图1-10的输出。
图1-10 busybox提供的工具
从上图中可看出,busybox提供了很多的工具,这样,咱们在研究Android系统时就如虎添翼了。
给手机安装busybox须有root权限,为学好Android,你们最好仍是购买那种能被破解的手机吧。
本章对Android系统、源码搭建、研究工具等作了部分介绍,相信读者如今已经是火烧眉毛,跃跃欲试了吧?立刻开始咱们的源码征程!
① 若是你对Git不熟或者是对此很感兴趣,建议阅读《Git权威指南》(机械工业出版社,2011.7月出版,蒋鑫 著),这是目前最全面、最深刻的一本Git著做。