1.1 Android全源码开发环境
Android 2.3版本以后谷歌官方推荐在64位Linux系统上编译其源代码,推荐的编译平台是Ubuntu LTS 10.04/12.04。
1.1.1 PC配置建议
Android源码包很大,源码至少3.5GB以上,包含git版本信息约增加一倍空间,编译输出的out目录10GB以上,因此交叉编译的代码量是相当大的。有人曾用DELL Latitude E5410(i3机型)Ubuntu实体机(非虚拟机)做首次编译,整整花了10个小时。所谓“工欲善其事必先利其器”,推荐使用高配置主机,例如:
CPU:Intel i7-4770;
内存:16GB DDR3-1600;
硬盘:500GB以上。
1.1.2 Ubuntu系统安装
Ubuntu的常见安装方法有:
1)使用光盘安装最简单,将刻录有ubuntu-12.04LTS-AMD64.iso的光盘插入光驱,重新启动机器,按照Ubuntu提示安装即可。
如果不方便刻录光盘,可以采用制作USB系统盘的方式安装。
2)使用iso硬盘安装,适合Windows 7/Ubuntu双系统。预先对硬盘分区,为Ubuntu预留的总分区空间应该在60GB以上,安装easybcd启动管理工具,将ubuntu-12.04LTS-AMD64.iso中casper目录下的vmlinuz和initrd.lz两个文件解压到C盘根目录,启动easybcd,添加一个NeoGrub条目,配置启动项目如下:
title Install Ubuntu
root (hd0,0)
kernel (hd0,0)/vmlinuz boot=casper
iso-scan/filename=/ubuntu-13.04-desktop-i386.iso ro quiet splash
locale=zh_CN.UTF-8
initrd (hd0,0)/initrd.lz
重新启动机器,选择Ubuntu启动项,就进入安装界面,按照提示完成安装。
3)通过Vmware或VirtualBox软件,将Ubuntu安装到虚拟机里,这种方法会降低Ubuntu的性能,但是优点是可同时运行Windows和Ubuntu两种操作系统,适合机器配置比较高的用户。
为方便开发,Ubuntu系统安装好后一般还需要配置SSH和Samba服务,以便通过其他终端(比如安装有Windows系统的笔记本电脑)来控制系统以及访问系统中的文件。
1.1.3 Ubuntu下Android编译环境搭建
Ubuntu系统安装完毕后,需要更新和安装Android编译环境需要的系统工具包,以及配置JDK等。
(1)安装sun-java6-jdk包
由于版权问题,Ubuntu社区不再对sun-java6-jdk提供支持,用户需要从Oracle官方网站下载安装包jdk-6u45-linux-x64.bin。
安装过程:
$ chmod u+x jdk-6u45-linux-x64.bin
$ ./jdk-6u45-linux-x64.bin
$ sudo mv jdk1.6.0_45 /opt
$sudo update-alternatives --install "/usr/bin/java"
"java" "/opt/jdk1.6.0_45/bin/java" 1
$sudo update-alternatives --install "/usr/bin/javac"
"javac" "/opt/jdk1.6.0_45/bin/javac" 1
$sudo update-alternatives --install "/usr/lib/mozilla/plugins/libjavaplugin.so"
"mozilla-javaplugin.so" "/opt/jdk1.6.0_45/jre/lib/amd64/libnpjp2.so" 1
$ sudo update-alternatives --install "/usr/bin/javaws" "javaws"
"/opt/jdk1.6.0_45/bin/javaws"
选择默认的JDK版本(sun-java6-jdk):
$ sudo update-alternatives --config java
$ sudo update-alternatives --config javac
设置环境变量:
export JAVA_HOME=/opt/jdk1.6.0_45/
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) 安装依赖包
$ sudo apt-get install git gnupg flex bison gperf build-essential \
zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev \
libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 \
libgl1-mesa-dev g++-multilib mingw32 tofrodos \
python-markdown libxml2-utils xsltproc zlib1g-dev:i386
$ sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1
/usr/lib/i386-linux-gnu/libGL.so
至此,环境搭建完成。
如果读者使用其他的Linux 发行版搭建编译环境,可进入Android官方网站http://source.android.com/source/initializing.html参考环境搭建方法。
1.1.4 工作目录设置
Android源码大约占用8.5GB的硬盘空间,至少需要30GB可用空间完成编译。我们假定下载到用户的HOME目录下,因此/home目录所在分区剩余空间不能少于30GB。
1.1.5 源代码下载
Android的官方源码放在Google git服务器上,通过Google提供的repo脚本同步到本地。步骤如下:
$ mkdir ~/bin
$ PATH=~/bin:$PATH
$ curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
$ mkdir $HOME/android
$ cd $HOME/android
$ repo init -u https://android.googlesource.com/platform/manifest -b android-4.2_r1
$ repo sync
以上步骤,先通过curl下载repo脚本,再通过repo脚本下载Android源码,在repo init时可以指定分支,比如本次是 android-4.2_r1,说明要下载android 4.2 release 1的源码。如果网络不好,repo sync花的时间非常长,而且经常中断,可以用如下简单脚本来sync代码:
repo sync
while [ $? -ne 0 ]
do
repo sync
done
此外,也可以通过git命令实现单个git库下载。需要在repo init产生.repo目录后,按照.repo/manifest.xml中的工程描述来逐个下载:
$git clone https://android-review.googlesource.com/build
$git clone https://android-review.googlesource.com/abi/cpp
......
下载源码耗时很长,比较痛苦,可以在下载时建立本地镜像,方便下次同步代码:
$ mkdir -p /usr/local/aosp/mirror
$ cd /usr/local/aosp/mirror
$ repo init -u https://android.googlesource.com/mirror/manifest --mirror
$ repo sync
这样在本机/usr/local/aosp/mirror建立了源码树,下次同步源码时就不用在网络上下载了,而只需:
$ mkdir -p /usr/local/aosp/master
$ cd /usr/local/aosp/master
$ repo init -u /usr/local/aosp/mirror/platform/manifest.git
$ repo sync
1.1.6 整体编译Android源代码
编译步骤如下:
$ cd $HOME/android/android-4.2_r1 //进入源码目录
$ source build/envsetup.sh //初始化环境变量
$ lunch aosp_arm-eng //选择目标开发板
$ make -j8 //编译
命令中source和launch两步的目的在于配置环境变量,如果不开新的终端,source和launch 只运行一次就可以了。编译参数-j8的作用是启动多核并行编译,可显著提高编译速度。-jn中的n取决于CPU的核心数,一般设置为“CPU核心数 * 2”。如果没有运行launch,会提示用户选择编译目标,每一个编译目标格式是BUILD-BUILDTYPE,其中BUILD是产品名称,BUILDTYPE是编译类型。常见的BUILD如下:
aosp_arm:模拟器,包含所有语言、apps、输入法。
aosp_maguro:maguro设备,可运行在Galaxy Nexus GSM/HSPA+上。
aosp_panda:panda设备,运行在PandaBoard设备上。
常见的BUILDTYPE如下:
user:最终用户机,无root,限制访问。
userdebug:调试测试机有root权限,有调试工具。
eng:工程机,带有全部调试符号。
编译输出在out/target/product/xx/system/,其中xx代表某产品,比如generic表示模拟器,maguro代表Galaxy nexus.system/app是所有apk目录,lib是so库的目录。与WebKit浏览器关联的Browser.apk和libwebcore.so就分别在这两个目录。
带调试符号的so库输出在out/target/product/xx/symbol/system/lib/,调试native 代码(比如WebKit)时,就会用到这些带有符号的.so文件。
1.1.7 单个模块按需编译
编译单个模块,可以在Android源码主目录“make 模块名”编译,比如编译Browser模块:
$ make -j8 Browser
模块名可以是多个。也可以进到模块目录,用mm命令编译。mm是source build/envsetup.sh定义的bash函数:
$ cd packages/apps/Browser
$ mm
如果要查看编译中make实际做了什么事情,要加上showcommands参数:
$ mm showcommands
1.1.8 编译生成本地Android SDK
进入Android源码目录,设置环境,运行make生成sdk:
make sdk
上述命令生成文件out/host/linux-x86/sdk/android-sdk_eng.xxxx_linux-x86.zip。在Android源码编译成功的基础上重新编译带自己API的android.jar需要进行以下几步操作:
添加自己源代码:在Android源码frameworks/base目录下新建一个文件夹保存代码,如tv,以包的形式命名添加文件所在的路径,如/tv/java/android/tv,并将相应的包的名称定义在目录内Java文件的头部。
修改makefile文件。
庑薷腷uild/core/pathmap.mk文件,在FRAMEWORKS_BASE_SUBDIRS变量后添加tv,代码如下(makefile文件中的语句以Tab键空格开头):
FRAMEWORKS_BASE_SUBDIRS := \
$(addsuffix /java,\
core\
graphics\
location\
media\
opengl\
sax\
telephony\
wifi\
vpn\
keystore\
tv\
)
庑薷膄rameworks/base/Android.mk文件,在packages_to_document变量后添加自己源代码的包名称,如android/tv,结果如下(makefile文件中的语句以Tab键空格开头):
packages_to_document := \
android \
javax/microedition/khronos android/tv
在Ubuntu命令行终端使用如下命令进行编译:
make clean
make update-api
make PRODUCT-sdk-sdk
最后一行也可以用如下两个命令代替:
make –j4 sdk
android.jar文件所在的目录为:/out/target/common/obj/PACKAGING/android_jar_interme-diates/android.jar,并在/out/target/common/obj/JAVA_LIBRARIES/android_stubs_current_inter-me diates/src目录下重新以package形式组织所有生成到android.jar中的源代码。
SDK所在目录为out/host/linux-x86/sdk/,生成的SDK文件目录和压缩包为:android-sdk_eng.xxx_linux-x86.zip(xxx为自己Android源码所在的根目录文件名)。