知名网站制作服务,为什么要选择高端网站定制,中世纪变装小说wordpress,免费交友软件本章主要内容本章简单介绍Android系统架构、编译环境的搭建以及一些工具的使用。1.1 系统架构
1.1.1 Android系统架构
Android是Google公司推出的一款手机开发平台。该平台本身是基于Linux内核的#xff0c;图1-1展示了这个系统的架构#xff1a;图1-1 Android系统架构
从…本章主要内容本章简单介绍Android系统架构、编译环境的搭建以及一些工具的使用。1.1 系统架构
1.1.1 Android系统架构
Android是Google公司推出的一款手机开发平台。该平台本身是基于Linux内核的图1-1展示了这个系统的架构图1-1 Android系统架构
从上图中可以看出Android系统大体可分为四层从下往上依次是Linux内核层目前Android2.2代号为Froyo基于Linux内核2.6版本。Libraries层这一层提供动态库也叫共享库、Android运行时库、Dalvik虚拟机等。从编程语言上来说这一层大部分都是用C或C写的所以也可以简单地把它看成是Native层。Libraries层之上是Framework层这一层大部分用Java语言编写。它是Android平台上Java世界的基石。Framework层之上就是Applications层了和用户直接交互的就是这些应用程序它们都是用Java开发的。从上面的介绍可看出Android最大的特点之一恐怕就是搭建了一个被广大Java开发者热捧的Java世界了。但该世界并不是空中楼阁它的运转依赖另一个被Google极力隐藏的Native世界。两个世界的交互关系可用图1-2来表示图1-2 Java世界和Native世界交互
从上图可知Java虽具有和平台无关的特性但Java和具体平台之间的隔离却是由JNI层来做到的。Java是通过JNI层调用Linux OS中的系统调用来完成对应的功能的。例如创建一个文件、创建一个Socket等。除了Java世界外还有一个核心的Native世界它为整个系统高效和平稳的运行提供了强有力的支持。一般而言Java世界经由JNI层通过IPC方式和Native世界交互。而Android平台上最为神秘的IPC方法就是Binder了。在第六章将详细介绍Binder。除此之外Socket也是常用的IPC方式。这些内容在后面的代码分析中都会见到。1.1.2 本书的架构
本书所分析的模块也将遵循Android系统架构如图1-3所示图1-3 本书的架构图
从上图可知本书所分析的各个模块除未涉及Kernel外其他三层均有所涉足它们分别是Native层包括init、Audio系统包括AudioTrack、AudioFlinger和AudioPolicyService、Surface系统包括Surface和SurfaceFlinger、常用类包括RefBase、sp、wp等、Vold和Rild。Java Framework层包括Zygote、System_server以及Java中的常用类包括Handler、Looper等。Java Application层包括MediaProvider和Phone。1.2 搭建开发环境
本节将介绍如何搭建Android源码开发环境。
首先需要一个Linux系统我本人推荐安装Ubuntu10.0432位版本。读者可从网上下载该版本的系统。Windows用户可使用VMWare或VirtualBox作为虚拟机来安装Ubuntu10.04。我本人推荐VMWare因为它的功能太强大了
如果要使用VMWare那么在安装完Ubuntu之后一定要把VMWare Tools也安装上因为这个工具会提供很多非常实用的功能。这里还有一个小建议如果Linux系统只是个人使用则建议用root账户登录系统。在工作中曾发现很多用非root账户登录的同事整天都在sudo输入密码这样做就浪费了不少零碎的时间片。假设读者已经安装好了Ubuntu 10.0432位版本并且以root账户登录到系统上了接下来的工作是
1.2.1 下载源码
Android源码采用Git①做版本管理工具这个工具由Linux之父LinusTorvalds采用纯C开发。关于Git为什么使用C语言开发的问题还引发了一场关于C和C孰好孰坏的大讨论不过Linus Torvalds显然没树起“居庙堂之高则忧其民”的形象。对于普通码农而言用最合适的工具、最实用的办法来完成好工作才是最重要的。所以C、C、Java、Python等都仅仅是工具而已。
下面介绍如何下载源码。
1. 设置软件源
下载Android源码前有些下载工具需要从Ubuntu软件源上下载。可以为Ubuntu系统指定一个软件源。有些软件源上有这些工具有些却没有而且各个软件源的下载速度也不同所以应首先找到一个合适的软件源。Ubuntu软件源的设置界面如图1-3所示图1-3 Ubuntu软件源设置
从上图中可发现将软件源地址设置成了http://mirror.bjtu.edu.cn/ubuntu。每个人可根据自己的情况选择合适的软件源。
2. 下载Android源码
下面开始下载Android源码工序比较简单可一气呵成。apt-get install git-core curl #先下载这两个工具mkdir –p ~/android/froyo #在登录用户的目录下新建android和froyo两个目录cd ~/android/froyo #进入这个目录curl http://Android.git.kernel.org/repo ./repo #从源码网站下载repo脚本该脚本是Google为了方便源码下载而提供的。通过该脚本可下载整套源码。chmod ax repo #设置该脚本为可执行 ./repo init -u git://Android.git.kernel.org/platform/manifest.git –bfroyo #初始化git库 ./repo sync #下载源码大小为2个多GB网速快估计得要2个多小时。下载完后该目录中的内容如图1-4所示图1-4 源码下载结果
注意Kernel的代码必须要单独下载下载方法如下
git clone git://android.git.kernel.org/kernel/common.gitkernel
1.2.2 编译源码
1. 部署JDK
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再按照下面的步骤部署它即可在~/.bashrc文件的末尾添加以下几句话exportJAVA_HOME/develop/jdk1.5.0_22 #设置为刚才解压的目录
exportJRE_HOMEJAVA_HOME/jre
exportCLASSPATH$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
exportPATH$JAVA_HOME/bin:$JRE_HOME/bin:$PATH重新登录系统这样JDK资源就能被正确找到了。2. 编译源码
Android的编译有自己的一套规则主要利用的就是mk文件。网上有太多关于它的解说了这里不再赘述只简单介绍其编译工序
进入源码目录以我的开发环境为例也就是 cd /develop/download_froyo执行 . build/envsetup.sh这个脚本用来设置Android的编译环境。执行choosecombo命令这个命令用来选择编译目标如目标硬件平台、eng还是user等。一般而言手机厂商会设置自己特有的编译选项。执行完上面几个步骤后就可以编译系统了。Android平台提供了三个命令用于编译它们分别是make、mmm和mm这三个命令的使用方法及其优劣如下make不带任何参数它用于编译整个系统时间较长我本人不推荐这种做法除非读者想编译整个系统。make MediaProvider 下面几个例子都以编译MediaProvider为例。这种方式对应于单个模块编译。它的优点是会把该模块依赖的其他模块也一起编译。例如 make libmedia就会把libmedia依赖的库全编译好。其缺点也很明显它需要搜索整个源码来定义MediaProvider模块所使用的Android.mk文件并且还要判断该模块所依赖的其他模块是否有修改。整体编译时间较长。mmm packages/providers/MediaProvider 该命令将编译指定目录下的目标模块而不编译它所依赖的模块。所以如果读者是初次编译采用这种方式编译一个模块往往会报错。错误的原因是因为它依赖的模块没有被编译。mm 这种方式需要先cdpackages/providers/MediaProvider目录然后mm。该命令会编译当前目录下的模块。它和mmm一样只编译目标模块。mm和mmm命令编译的速度都很快。从使用的角度来看我本人有如下建议如果只知道目标模块名则应使用make 模块名的方式来编译目标模块。例如编译libmedia则直接使用make libmedia即可。另外初次编译时也要采用这种方法。如果不知道目标模块名而知道目标模块所处的目录则可使用mmm或mm命令来编译。当然初次编译还必须使用make命令。而以后的编译就可使用mmm或mm了这样会节约不少时间。一般的编译方式都使用增量编译即只编译发生变化的目标文件。但有时则需重新编译所有目标文件那么就可使用make命令的-B选项。例如 make –B 模块名或者mm –B、mmm –B 。mm和mmm内部也是调用make命令的而make的-B选项将强制编译所有目标文件。Android的编译工序比较简单难点主要在Android.mk文件的编写。读者可上网搜索与此相关的学习资料。
3本书各模块的编译目标
本书各模块的编译目标如表1-1所示这里仅列出几个有代表性的模块
表1-1 本书各模块编译目标
目标模块make命令mmm命令initmake initmmm system/core/initzygotemake app_processmmm frameworks/base/cmds/app_processsystem_servermake servicesmmm frameworks/base/services/javaRefBase等make libutilsmmm frameworks/base/libs/utilsLooper等make frameworkmmm frameworks/baseAudioTrackmake libmediammm frameworks/base/media/libmediaAudioFlingermake libaudioflingermmm frameworks/base/libs/audioflingerAudioPolicyServicemake libaudiopolicymmm hardware/msm7k/libaudio-qsd8k (示例)SurfaceFlingermake libsurfaceflingermmm frameworks/base/libs/surfaceflingerVoldmake voldmmm system/vold/Rildmake rildmmm hardware/ril/rild/MediaProvidermake MediaProvidermmm packages/providers/MediaProviderPhonemake Phonemmm 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控制在第三章中可见到。1.3 工具介绍
本节介绍Android开发和源码研究过程中两件比较实用的工具。
1.3.1 Source Insight介绍
Source Insight是阅读源码的必备工具是一个Windows下的软件在Linux平台上可通过wine安装。这里就不讲述如何安装Source Insight了相信读者都会。下面介绍一下在Source Insight使用上的小技巧。
1. Source Insight工作减负
使用Source Insight时需要新建一个源码工程通过菜单项Project→New Project可指定源码的目录。在工作中发现很多同事常一股脑把Android所有源代码都加到工程中从而导致了Source Insight运行速度非常慢。实际上只需要将当前分析的源码目录加到工程即可。例如新建一个Source Insight工程后只把源码/framework/base目录加进去了。另外当一个目录下的源码分析完后可以通过Project→Add and Remove Project Files选项把无须再分析的目录从工程中去掉。如图1-6所示图1-6 添加或删除工程中的目录
从图中的框线我们可以发现Source Insight支持动态添加或删除目录。通过这种方式可极大减少Source Insight的工作负担。一般首先把framework/base下的目录加到工程以后如有需要再把其他目录加进来。2. 调节字体
Source Insight默认的字体比较小看着很费眼。怎么办
选择工具栏上Options→Document options菜单弹出Document Options对话框其中左上部分有个Screen Fonts然后会弹出一个字体对话框在那里可选择大字体例如四号五号字体等。如图1-7所示图1-7 字体调节
3. 快速定位文件
工程建立好后须通过Project→Rebuild Project选项来解析源码。另外在研究源码时常常会只记得源码文件名而不记得是在哪个目录下。没关系Source Insight支持在源码中快速定位文件。使用方法如图1-8所示图1-8 快速定位文件
使用方法是先选择图1-8中左下角的那个按钮。然后在左上角那个输入框中输入源码文件名例如app_process。然后结果栏中就会把对应文件列出。1.3.3 Busybox的使用
Busybox号称Linux平台上的“瑞士军刀”它提供了很多常用的工具例如grep、find等。这些工具在标准Linux上都有但Android系统却去掉了其中的大多数工具。这导致了我们在调试程序、研究Android系统时步履维艰所以就需要在手机上安装Busybox。
1. 下载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支持该指令集。2. 安装和使用Busybox
下载完busybox后需将它push到手机上。如
adb push busybox /system/xbin #为了避免冲突我push到了/system/xbin目录下了。cd /system/xbin #进入对应目录chmod 755 busybox #更改busybox权限为可执行busybox –-install #安装busyboxgrep #执行busybox提供的grep命令或者busybox xxx执行xxx命令也行Busybox安装完了如执行busybox命令就会打印如图1-10的输出。图1-10 busybox提供的工具
从上图中可看出busybox提供了不少的工具这样我们在研究Android系统时就如虎添翼了。
给手机安装busybox须有root权限为学好Android大家最好还是购买那种能被破解的手机吧。1.4 本章小结
本章对Android系统、源码搭建、研究工具等做了部分介绍相信读者现在已是迫不及待跃跃欲试了吧马上开始我们的源码征程