android源码

1.1.4 Android 系统开发(移植)和应用开发

通过前面的学习,我们了解到         Android 是一个庞大且完善的系统,我们可以基于 Android 来进行哪些开发工作?每一种开发工作又有什么不同?不同的开发工作需要掌握的技术有什 么差异?学完本小节的内容你就会知道应该如何利用 Android 来开发自己所需要的产品。 因为 Android 是一个开源的操作系统,所以可以选择的开发方式主要有以下两种:

Android 系统开发(移植)

Android 应用开发

1 Android 系统开发(移植)

Android   系统开发(移植)属于底层的开发工作,主要针对 Android  系统本身进行完善和 将其移植到其他的硬件平台,因此需要掌握 Android 系统构架中的 Linux 内核层和系统运行库 层,如图 1-15 所示。

Android 系统开发主要涉及 Libraries Android Runtime 这两部分内容,一般就是在本地编 C/C++ 代码,然后通过 JNI 向上层提供调用接口,主要是为应用开发提供服务等工作。

 
无论是系统开发还是系统移植,都是由底层直接操作 Android 的源代码,因此在开发之前, 我们首先就需要准备 Android 的源码。下一节将向大家详细介绍如何获取和编译 Andorid 的源 码,以及 Android 源码的结构
2 Android 应用开发
Android 应用开发主要是根据 Android 系统所提供的 API 来完成各种应用程序的编写,所 使用的 API 属于 Android 的应用框架层,如图 1-16 所示。如果 Android 系统没有提供某些 API 那么只能通过在 Android 系统底层编写 C/C++ 代码来开发这些 API 并向 Android 应用框架层 提供接口。但是笔者不建议这样做,因为这很可能会导致你的应用程序与其他 Android 系统 不兼容。
1.2  获取和编译 Android 的源码
这一节我们将从零开始讲解如何取得并编译 Android 的源码及其常用工具。在这个过程中, 你可以和本书一起准备好更加深入学习 Android 所必需的环境和工具,同时也能对 Android 码的结构有一个整体的认识。
1.2.1  环境配置
由于我们需要对 Android 系统进行开发(移植),所以就必须下载 Android 的源代码。如果 只是查看源代码,在线浏览即可,因为:第一, Android 的源代码庞大,下载需要很长的时间; 第二,官方所支持的 Android 源代码下载系统仅为 Linux Mac OS (当然,在 Windows 下也 能下载,但是建议大家还是在 Linux 下下载)。这里我们将以 Ubuntu 10.04 为例,为大家详细 介绍如何获取和编译 Android 的源代码。 我们从 Android 源码的官方网站( http://source.android.com )取得的关于配置需求的信息如下: 磁盘                需要 6GB 以上剩余空间
Linux 系统            Ubuntu 6.06 以上版本
Git 工具              Git 1.5.4 以上版本
Java 环境             JDK 5.0 update12 以上版本
Python                                   Python 2.4 以上版本
依赖的 deb 包         flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-                                                dev build-essential zip curl
调试工具             valgrind
首先,准备好所需要的 Linux 操作系统以及磁盘空间。由于 Ubuntu10.04 系统自带的源里 找不到 JDK1.5 的安装包,因此我们要做的第一件事是增加两个软件源(如果你能找到 SDK1.5 的安装包则不需要),如下:

deb http://tw.archive.ubuntu.com/ubuntu/  jaunty main restricted universe multiverse

deb-src http://tw.archive.ubuntu.com/ubuntu/ jaunty main restricted universe multiverse

然后,开始准备下载和编译 Android 源码的环境:

1 )安装 JDK1.5 ,在终端执行命令如下:

$ sudo apt-get install sun-java5-jdk

2 )安装开发过程中需要的一些开发包,在终端执行以下命令:

$ sudo apt-get install git-core gnupg valgrind flex bison gperf libsdl-dev libesd0-dev

libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev

到这里,你已经准备好了获取 Android 源码所需要的环境,下面将开始获取 Android 源码。 1.2.2  获取 Android 源码
上一节已经准备好了    Android   源码开发所需的环境(请确保你所准备的环境无误),这一 节将从 Android 源码服务器获取 Android 源码。由于 Android 的源码非常庞大,所以需要分为 两部分来获取,分别是 Android 源码和 Android 内核( Android Linux Kernel )。 1 .获取 Android 源码的步骤 如果要获取 Android 的完整源码,则需要按照如下步骤操作: 1 )在用户目录下新建一个文件夹用来存放我们的 Android 目录,在终端执行如下命令:

mkdir Android

cd Android

mkdir bin

cd bin

curl http://android.git.kernel.org/repo > repo

稍等片刻即可完成,如图 1-17 所示。

 
        1-17  新建 Android 目录并初始化 repo

2 )建立存放 Android 源代码的目录 source ,并初始化版本,在终端执行如下命令:

sudo chmod a+x repo

cd

cd Android

mkdir source

cd source

../bin/repo    init -u 

git://android.git.kernel.org/platform/manifest.git

这次需要等的时间可能会稍微长一点,如图 1-18 所示。

 
3 )之后要求输入用户名和邮箱地址,可随机输入。如果你需要向 Google 递交 Bug ,那么    Google    1-19  “ repo initialized in / home/yarin/Android” ,则表示初始化完毕,可以开始下载了。
 
             1-19  输入账户信息
注意   在显示初始化完成时,出现了一个路径,其中包含一个 yarin 字符,熟 Linux 的朋友可能已经明白为什么了,但这里还是说明一下。笔者在编写本书 时,所使用的 Linux 系统的用户名为 yarin ,而且所建立的用于存放 Android 源码的目录也在用户目录中,以后还会多次出现,所以我们就不再详细解释了。
4 )在终端执行如下命令,开始下载,如图 1-20 所示。
../bin/repo sync
 
    图 1-20  开始下载 Android 源码  
注意    以上操作下载的是全部的源码,完全下载需要很长的时间。你也可以在
../bin/repo init -u git://android.git.kernel.org/platform/manifest.git
之后加入参数来指定下载某一部分源码。请参见在第二步之后出现的帮助信息 (图 1-18 )。下载过程中可能会出现连接超时或者服务器繁忙的错误。 下载完成之后,你就得到了完整的 Android 源码。前面说过需要分为两部分来下载,并且 这两部分是可同时下载,彼此不会受到任何影响。因此,为了节约时间,我们马上开始下载第 二部分源码。
2 .下载 Android 内核
在下载之前,我们先来看看 Android 内核属于哪一部分。首先,打开 Android 的开源工程 官方网站( http://android.git.kernel.org/ ), Android 内核主要包括了如图 1-21 所示的内容,这部 分内容在我们使用 “../bin/repo syn” 下载的时候并不会被一起下载。如果你不需要对    Android 内核进行修改和移植,可以不需要这部分内容,可以从 Android 模拟器中提取这部分内容的镜 像。但是,本书需要关注这部分内容,并会对它进行详细分析,所以需要下载它。

下载 Android 内核的具体步骤如下:

首先,进入上面我们创建的存放 Android 源码的目录,新建一个存放 Android 内核的目录 “kernel” ,并进入该目录,在终端执行如下命令,开始下载,如图 1-22 所示。 git clone git://android.git.kernel.org/kernel/common.git

 
               1-22  下载 Android 内核
下载 Android 内核时间会比下载 Android 源码的时间短很多。需要注意的是, Android 内核 的下载不能被中断,而 Android 源码支持断点下载。下一小节将为大家介绍编译的全过程。 下载完成之后在存放 Android 源码的目录中也许看不到任何内容,不必担心,那是因为下 载的文件是隐藏的,你需要显示隐藏文件才能看见。下载完成之后,你可以在终端通过 du -sk du –sm 命令检测文件夹的大小,以确保全部下载完成。如果你按本书的方式进行全部下载, 那么总大小会接近 4GB 左右。另外,还需要编译和开发,所以请确保磁盘空间大于 10GB
1.2.3  编译 Android 的源码及其工具包
功夫不负有心人!终于下载完了,下面我们就开始编译。接下来的内容并不难,但是需要 十分仔细(比如:不能多一个空格,也不能少某个步骤),否则编译过程中就可能有意想不到 惊喜 降临到你身上。当然,你也不必紧张,只要按照下面的步骤一步一步操作,你自己 编译的 Android 系统最后肯定能够运行成功。
1 .编译 Android 源码
只要确保源码下载是完整的,编译过程中一般不会出错。笔者编译过很多次,都没有遇到 意外情况,因为 Android 文件系统已经自带了经过优化的交叉编译工具,并且为所有的源码都 提供了经过验证的 makefile ,所以系统的整体编译相对简单。首先需要从终端进入存放源码的 目录,然后在终端输入如下命令,如图 1-23 所示。
 
在官方发布的版本中,基本功能都已经包含在 makefile 中。如果需要增加其他功能,可以 build/target/product/ 路径下修改相应的 .mk 文件。比如,如果要增加中文的输入法,可以按照 下面的步骤进行:
cd /home/yarin/Android/source/build/target/product/ gedit generic.mk
打开这个文件后,在 PRODUCT_PACKAGES 中加入 PinyinIME ,然后保存并退出。这样, 在整体编译的时候就会把中文输入法也编译进系统中。 编译的时间一般不会比下载的时间长,大约 2 3 小时就能完成。在默认情况下,编译完 成之后,会在 /home/yarin/Android/source 目录下生成一个 out 文件夹,生成的所有文件都放在 该文件夹下,如果你想更改生成文件的目录,请参考 ./build/buildspec.mk.default    文件中的说明 和选项(虽然很简单,但是笔者还是不建议大家去更改)。编译完成之后会在   out/target/ product/generic/ 目录下生成一些 .img 镜像文件,比如 system.img userdata.img ramdisk.img 等, 我们暂时不去测试生成的这些文件是否有效,因为稍后还需要编译 SDK 和其他工具,然后在 模拟器上加载这些文件,这样才能测试其是否有效。
2 .编译 Android 内核
我们在编译 Android 源码时并不会自动编译 Android 内核,因此需要手动来编译这部分内 容,下面是编译内核的完整步骤。其实,操作与编译 Linux 内核一样,如果你非常熟悉,可以 跳过这部分内容。
1 )确定内核版本
进入存放 Android 源码目录下的 kernel 目录,输入如下命令,查看 kernel/common.git 的默 认主分支(本书所使用的源码显示为 * android-2.6.35 )。
git branch
然后,输入如下命令,显示所有 head 分支。
git branch -a
 

输入如下命令,选择当前最新的版本(本书选择了 android-goldfish-2.6.35 ),其中 goldfish Android 的模拟器模拟的 CPU

git checkout -b android-goldfish-2.6.35 

origin/android-goldfish-2.6.35

此时,再次输入 “git branch” 命令,将显示我们所选择的最新分支,表示我们目前工作在 这个被选择的分支上。

2 )设定环境变量

在编译    Android  内核时,需要使用交叉编译器。我们所下载的      Android  代码树中有一个 prebuilt  文件夹,它包含了我们编译内核所需的交叉编译工具。因此,我们将其设置到环境变 量中去,以方便使用。打开用户目录下的 .bashrc 文件,在后面添加如下代码:

export 

PATH=$PATH:~/Android/source/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin

export ARCH=arm

保存并退出,通过如下命令在用户目录下进行更新。因为有可能会因为添加之后没有及时 更新而在编译时提示错误,如找不到交叉编译工具目录等(如果加入了环境变量仍在编译时提 示找不到,可以尝试多更新几次)。

source ~/.bashrc

3 )设定交叉编译参数

在编译之前,我们还需要设定编译时所使用的交叉编译参数。具体步骤如下: 首先,打开 kernel 目录下的 makefile 文件,把 CROSS_COMPILE 指向 Android 源码提供 prebuilt 中的 arm-eabi 编译器,如图 1-24 所示。

 
编译完成之后,会在 “kernel/arch/arm/boot/” 目录下生成名为 zImage 的文件;稍后再运行 系统时,就可以不使用 Android SDK 为我们提供的镜像文件,而加载该镜像以及上一节编译的 系统镜像。既然要测试,就需要 SDK ,所以我们一下步将编译 SDK
3 .编译 SDK
要测试以上所编译的镜像和使用 SDK 进行应用开发,就需要编译 SDK (当然,如果你不 想编译,也可以直接到官方网站下载 SDK ,本书所使用的全部是通过源码编译出来的工具)。 由于编译 Android 源码和内核时并不会自动编译 SDK ,因此下面我们就来手动编译 SDK
注意   如果需要,建议先编译 ADT 和单独模块,因为在编译 ADT 和单独模块时会 清除编译 SDK 所生成的目录。 SDK 的编译其实很简单,基本上不用配置,直接进入存放 Android 源码的目录,使用如下 命令即可,如图 1-27 所示。
$ make PRODUCT-sdk-sdk

编译时间稍长,编译后生成的       SDK  存放在    out/host/linux-x86/sdk/ 目录下。此目录下有

android-sdk_eng.xxx_linux-x86.zip     android-sdk_eng.xxx_linux-x86  两个目录, android-sdk_ eng.xxx_linux-x86 就是我们需要使用的 SDK 。建议大家将 SDK 备份,因为我们马上会讲到的 单独模块的编译可能会清除 SDK 目录。

4 .编译单独模块

Android  允许我们对应用程序进行单独编译,但是编译后需要重新生成      system.img ,下面 就来学习如何单独编译应用程序。 首先,需要在源码存放目录中执行如下命令,注意: “.” 后面有空格。

$ . build/envsetup.sh

完成之后就会多出以下命令,你可以加上 -help 查看其用法。

- croot:   Changes directory to the top of the tree.

- m:       Makes from the top of the tree.

- mm:      Builds all of the modules in the current directory.

- mmm:     Builds all of the modules in the supplied directories.

- cgrep:   Greps on all local C/C++ files.

- jgrep:   Greps on all local Java files.

- resgrep: Greps on all local res/*.xml files.

- godir:   Go to the directory containing a file.

然后,可以使用 mmm 来编译指定目录的模块。比如,我们要编译联系人应用,可以输入 如下命令:

$ mmm packages/apps/Contacts/

编完之后生成两个文件:

out/target/product/generic/data/app/ContactsTests.apk

out/target/product/generic/system/app/Contacts.apk

最后,在运行模拟器之前,我们可以使用如下命令来重新生成 system.img (即系统镜像)。

$ make snod

5 .编译 ADT

编译 ADT 的目的是使用 Eclipse 来开发应用程序,如果你不想编译,可以在 Android 官方 网站下载,或者直接在线更新。这里,我们主要是告诉大家如何使用源码来编译 ADT

1 )配置环境

要编译 ADT ,首先应该确保系统中安装了 Eclipse 。如果没有安装,那么在编译 ADT 时会 下载安装(但这需要取得 root 权限,否则无法安装,也就无法编译);如果需要自己手动下载并 安装 Eclipse ,建议下载 Eclipse3.4.0 RCP 版本,因为自动下载安装时,下载的是 Eclipse3.4.0 RCP 如果高于这个版本,编译过程中可能会出现找不到某些 jar 文件的情况,使得编译无法继续。编 ADT 的过程很简单,但是经常会因为环境的准备不够充分而出错。所以,笔者建议大家下载官方的 ADT 或者让 ADT 编译过程自己下载合适的 Eclipse 版本,以减少错误的发生。

安装好 Eclipse 之后需要设置 ECLIPSE_HOME 的环境变量,否则编译程序会认为你没有 Eclipse ,然后又帮你重新下载,我们不希望出现这样的情况。比如,笔者将 Eclipsse 安装在 “~/Develop/eclipse-android_src/eclipse-RCP-3.4-linux-gtk” 目录中,就在 .bashrc 文件中加入如下 代码(如果不知道如何添加环境变量,请查看 “Android kernel                  编译 章节的环境配置,这里 我们修改的当然是用户的环境变量,同样也可以修改整个系统的环境变量)。

export 

ECLIPSE_HOME=$PATH:~/Develop/eclipse-android_src/eclipse-RCP-3.4-linux-gtk

2 )编译 ADT

准备好环境之后,要编译 ADT ,进入 Android 源码存放目录,在终端输入如下命令即可, 结果如图 1-28 所示。其中 “/home/yarin/Android/source/adt” 即我们存放编译的 ADT 的目录。

sdk/eclipse/scripts/build_server.sh /home/yarin/Android/source/adt

 
             1-28  编译 ADT
编译完成之后,就会在我们指定的存放 ADT 的目录下找到生成的 ADT ,然后就可以使用 ADT 搭建应用开发环境。 现在我们就已经编译了 Android 源码和所有需要使用的工具包,那么下面将测试我们的编 译是否成功,即运行编译的 Android 系统。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值