Android的源码开发可以在MacOS上或Ubuntu系统上,目前不支持在Windows下进行源码开发,在Ubuntu上建立开发环境的步骤如下:
- 建立Linux编译环境
- 安装JDK
- 安装编译必备程序包
- 下载Android源码及Linux内核
注:本书中使用的是针对Android2.3开发环境,并没有使用最新Android版本,原因其一是,Android版本升级比较频繁,其二Android版本的升级对我们学习Android底层没有很大的影响,其三Android随着版本的升级,源码体积和编译时间也在成倍增加会大大降低学习效率,如果读者想下载使用最新Android版本,请查看Android的官方网站:
Android源码开发:http://source.android.com/source/initializing.html
2.2.1建立Ubuntu编译环境
Android的编译环境的最低要求,随着Android版本的升级也发生了变化:
- 对于Gingerbread2.3.x版本及其以上版本,需要安装64位Ubuntu,对于2.3.x以下版本可以使用32位Ubuntu。
注:这只是Android官方给出的建议,在简单修改Android的Makefile后,其实在32位系统上也可以编译2.3.x以后版本。
- Ubuntu也可以安装在虚拟机软件中,对于Android2.3.x编译环境,虚拟机分配内存和交换分区总和最少要2GB,磁盘空间最少10GB,如果要编译多个不同版本Android磁盘空间要求更多。
- 为了能够正确下载和编译Android源码,还需要安装以下程序包:
- Python 2.6 -- 2.7:Python是一个非常易学的面向对象的脚本语言,在Android的编译过程中会使用到该脚本解释器。
- GNU Make 3.81 -- 3.82:Make工具用于管理和编译大型的源码项目,它通过Makefile来指定编译规则。
- JDK6:Android源码中包含大量的Java源码,编译Java源码要使用JDK里的编译工具,对于Gingerbread2.3.x及其以上版本要使用JDK6编译,对于2.3.x以下版本要安装JDK5。
- Git 1.7:Git是Linus Torvalds(也是Linux内核的编写者)开发一个非常优秀的分布式项目版本控制系统,用于大型项目的维护,如Linux内核源码和Android源码都是使用Git来管理的,我们用安装Git来下载Android的源码。
2.2.2 JDK安装
虽然我们可以通过Ubuntu的apt-get install命令下载JDK,但是JDK的源码经常会更新到新版本,我们也可以直接从SUN公司的网站上下载:
http://www.oracle.com/technetwork/java/javase/downloads/index.html
如果Ubuntu安装的是32位版本的,选择Linux x86版本,如果Ubuntu是64位的,那么应该选择Linux x64,如图x-x所示。
下载下来的文件是bin格式的二进制文件,将其拷贝到Ubuntu的Home目录下的android目录中(在本书中,默认Home目录下的android目录为我们的开发目录):
$ cp jdk-6u41-linux-i586.bin ~/android
注:jdk格式为:jdk-版本号更新号-平台名.bin,随着Jdk的更新更新可以不一样,不同的更新号不影响使用。
切换到Home目录下:
$ cd ~/android
添加上可执行权限:
$ chmod a+x jdk-6u41-linux-i586.bin
直接执行安装:
$ sudo ./jdk-6u41-linux-i586.bin
安装完之后,会发现在当前目录下有jdk1.6.0_41的目录,这个目录就是jdk的安装目录,我们要将Jdk添加到环境变量中去。
通过vi编译器打开Home目录下的.bashrc文件,该文件是bash终端的配置文件:
$vi ~/.bashrc
在.bashrc配置文件的最后添加如下代码:
# set jdk PATH export PATH=/home/linux/android/jdk1.6.0_41/bin:$PATH
上述代码是将jdk安装目录下的bin目录添加到PATH环境变量中,当每次启动BASH终端时,都会自动加载PATH变量。
添加完PATH变量后,保存退出vi编译器,通过下面的命令重新加载新配置文件,然后验证PATH环境变量是否设置正确:
$ source~/.bashrc $ java-version java version "1.6.0_41" Java(TM) SE Runtime Environment (build 1.6.0_41-b02) Java HotSpot(TM) Client VM (build 20.14-b01, mixed mode, sharing)
执行javac –version命令,如果打印出Java版本信息,说明我们的Jdk安装完毕。
2.2.2 安装Android编译工具
在编译Android源码里,Ubuntu系统要依赖一些工具包,如:libc6-dev是标准C库,libx11-dev:i386是开发x11界面的库和头文件包,GnuPG工具是用于加密或签名的工具包等。
安装必备工具包:
sudo apt-get install git-core gnupg flex bison gperfbuild-essential \ zip curl libc6-dev libncurses5-dev:i386x11proto-core-dev \ libx11-dev:i386 libreadline6-dev:i386libgl1-mesa-glx:i386 \ libgl1-mesa-dev g++-multilib mingw32 tofrodos \ python-markdown libxml2-utils xsltproc zlib1g-dev:i386
2.2.3 下载Android源码
当Ubuntu编译环境准备好之后,就可以下载Android源码了,Android的源码通过Git来管理,Android的网站上为我们准备好了一个repo脚本,repo是Google用Python脚本写的调用git的一个脚本,主要是用来下载、管理Android项目的软件仓库。我们使用repo脚本可以下载指定版本的Android源码。
在/home/linux/android创建Android源码下载目录:
$ cd /home/linux/android/ $ mkdirandroid_source $ cd android_source
创建repo脚本的保存目录,保存到HOME目录下的bin目录中:
$ mkdir~/bin
将~/bin目录添加到PATH环境变量中,方便运行:
$ PATH=~/bin:$PATH
通过curl工具从Android网站下载repo脚本:
$ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo
给repo脚本添加上可执行权限:
$ chmod a+x ~/bin/repo
初始化repository本地代码仓库,准备访问Android源码仓库:
$ repo init -u https://android.googlesource.com/platform/manifest -b android-2.3.5_r1
注:repo init -u URL 用以在当前目录安装 repository ,会在当前目录创建一个目录 ".repo" -u 参数指定一个URL,从这个URL 中取得repository 的 manifest.xml文件,manifest.xml文件内容是被git管理的仓库的列表,也就是所有Android版本仓库代码信息。用 -b 参数来指定初始化某个Android版本分支。
这个时候,要保证您的Ubuntu能够上网,并且能正常连接到Android服务器,在初始化完repository后,会让你输入gmail邮箱及用户名验证,如图x-x所示。
同步下载Android2.3源码:
$ repo sync
这个过程比较漫长,根据网络环境不同,需要数小时或数十个小时。由于要连接国外服务器下载,可能会中断,我们可以编写如下脚本,来实现断线自动重新下载。
#!/bin/bash PATH=~./bin:$PATH repo init-u https://android.googlesource.com/a/platform/manifest-b android-2.3.5_r1 repo sync while [ $? -ne 0]; do echo“ **Error: sync failed, re-sync again” sleep 5 repo sync done
2.2.4 下载Linux内核源码
Google在开发Android系统的同时,使用qemu开发了一个Android模拟器,这大大降低了开发人员的开发成本,便于Android技术的推广。qemu是一个开源的模拟处理器软件,qemu模拟的是ARM926ej-S的Goldfish处理器,如果开发人员在没有目标开发板的情况下,我们可以使用Goldfish模拟器作为开发对象。
通常Android Kernel内核的代码放在Android源码目录下的kernel目录下:
$ cd /home/linux/android/android_source $ mkdir kernel
从Android的远程源码仓库下载源码:
$git clone http://android.googlesource.com/kernel/goldfish.git
该过程大概需要几十分钟到几小时,等克隆完远程代码后,checkout出来想使用的分支:
$ git checkout remotes/origin/android-goldfish-2.6.29
2.2.4练习
1. 为什么Android的编译环境要安装Jdk?针对不同的Android版本是否对Jdk版本有不同要求?
2. 在安装JDK的时候为什么要设置环境变量?
3. 当执行repo脚本时,提示:Permisson denied的错误信息,这是为什么?
4. git工具是干什么?谁会用到git?
5. 如果要下载新版本的Android源码,如何操作?