选择源码的分支决定了你机器环境的配置,前面提到32位系统只能编译<2.3.x版本,所以你的机器很重要啊。
1. 安装JDK 由于SUN JDK不再在ubuntu的主要仓库中,为了能够下载它,你需要把合适的仓库加进来。
Java 6: for 大于等于2.3版本
$ sudo add-apt-repository"debhttp://archive.canonical.com/ lucid partner" //
修改/etc/apt/sources.list
$ sudo add-apt-repository"debhttp://archive.ubuntu.com/ubuntu hardy main multiverse"
$ sudo add-apt-repository"debhttp://archive.ubuntu.com/ubuntu hardy-updates main multiverse"
$ sudo apt-get update //更新所有软件包
$ sudo apt-get install sun-java6-jdk
//安装jdk6Java 5: for 小于2.3版本
$ sudo apt-get install sun-java5-jdk
我用jdk6吧。
注意:安装过程中,会出现“正在设定 sun-java6-jre"时,就按tab,变红按钮后确定。接受协议时,也是如此。
在jdk包安装完成之后,试下java -version,确保正确安装。
2. 安装ubuntu必要的包(ubuntu 12.04)
在Ubuntu 12.04上仅尝试支持编译,并不能保证在分支和最新代码上能成功;
$
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
安装全部库时libc6-dev:i386错误
$sudo apt-get install linux-libc-dev:i386
$sudo apt-get install libc6-dev:i386
再执行前面的更新。
$ sudo ln -s/usr/lib/i386-linux-gnu/mesa/libGL.so.1/usr/lib/i386-linux-gnu/libGL.so
3. 配置USB访问(如果先在模拟器上运行,暂不做)
在GNU/linux系统下,一般用户不能通过defaul的方式,需要配置其驻允许访问。推荐的方法是root权限建一个文件
/etc/udev/rules.d/51-android.rules,然后用下面的代码替换,其中<username>换成被授权访问手机.
# adb protocol on passion (Nexus One)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e12", MODE="0600", OWNER="<username>"
# fastboot protocol on manta (Nexus 10)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee0", MODE="0600", OWNER="<username>"
以上设置在Ubuntu 8.04/10.04上确认没问题,在更高版本上不能保证。
3. 设置Ccache
安装
可以选择性的告诉编译器使用Ccache工具,它能够加速rebuild,如果你经常使用"make clean"的话,将非常有用。
sudo apt-get install ccache
把下面一句加到.bashrc中。
export USE_CCACHE=1
建议cache大小为50G-100G,在下载源码之前先执行下面的语句。
ccache -M 50G
第三步,下载Android源码
1. 安装repo 在home目录下建个bin目录.
$ mkdir ~/bin
$ PATH=~/bin:$PATH
$ curl http://git-repo.googlecode.com/files/repo-1.19 > ~/bin/repo
$ chmod a + x ~ /bin/ repo
2. 新建一个工作目录Android,用于存放代码
mkdir Android
cd Android
下载全部代码,
下载特定分支
repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1 //下载4.0.1
repo init -u https://android.googlesource.com/platform/manifest -b android-2.3.1_r1 //
repo sync
中间需要输入用户名和邮件地址,自个随便输入一个。
3. 等待,
如果中间出现死机后,再重启不能进入XWindow,则进入recovery模式后,r
sudo apt-get install xserver-xorg
startx
如果在最后一步调用repo sync,出现“fatal: '../platform/abi/cpp.git' does not appear to be a git repository”
1、在存放android系统源代码的目录(也就是执行repo sync命令的目录)下,有个.repo的隐藏目录,用ls -a可以查看的到,进入该目录:cd .repo;
2、打开.repo目录下的manifest.xml文件(命令vim manifest.xml)并找到fetch属性,在我的文件中显示fetch="..",将fetch修改为fetch="git://git.omapzoom.org/",保存并退出;
3、继续repo sync就可以下载了。
第四步,编译
通过envsetup.sh脚本初始化环境
$ source build/envsetup.sh
选择编译目标版本,目标有多种类型
$ lunch full-eng
编译源码,
$ make -j4
编译过程,可能出现若干问题:
1.<命令行>:0:0: 错误: “_FORTIFY_SOURCE”重定义 [-Werror]
修改build/core/combo/HOST_linux-x86.mk 61行,将
HOST_GLOBAL_CFLAGS += -D_FORTIFY_SOURCE=0
修改成
HOST_GLOBAL_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0
2. In file included from external/oprofile/libpp/arrange_profiles.cpp:24:0:
external/oprofile/libpp/format_output.h:94:22: 错误: reference ‘counts’ cannot be declared ‘mutable’ [-fpermissive]
解决办法:
external/oprofile/libpp/format_output.h
把:
mutable counts_t & counts;
改为:
counts_t & counts;
3.external/gtest/src/../include/gtest/internal/gtest-param-util.h:122:11:错误: ‘ptrdiff_t’不是一个类型名
In file included fromexternal/gtest/src/../include/gtest/gtest-param-test.h:157:0,
解决方法:
#include <cstddef>
4:undefined reference to `pthread_mutexattr_destroy'
host C++: libgtest_host <= external/gtest/src/gtest-all.cc
解决方法:
$vi external/llvm/llvm-host-build.mk
LOCAL_LDLIBS := -lpthread -ldl
5. error: variable ‘ParamName’ set but not used [-Werror=unused-but-set-variable]
frameworks/compile/slang/slang_rs_export_foreach.cpp:247:23: error: variable ‘ParamName’ set but not used [-Werror=unused-but-set-variable]
cc1plus: all warnings being treated as errors
解决方法:
$ vi frameworks/compile/slang/Android.mk
#local_cflags_for_slang := -Wno-sign-promo -Wall -Wno-unused-parameter -Werror
local_cflags_for_slang := -Wno-sign-promo -Wall -Wno-unused-parameter
第五步,运行
编译生成的emulator位于~/Android/4.0.1/out/host/linux-x86/bin,在home/.bashrc下加入环境变量:
PATH=$PATH:~/Android/4.0.1/out/host/linux-x86/bin;
export PATH
$ ~/Android$ emulator
是不是看到模拟器起来了。热泪盈眶哈
(from luo).
模拟器运行需要四个文件,分别是Linux Kernel镜像zImage和Android镜像文件system.img、userdata.img和ramdisk.img。执行emulator命令时,如果不带任何参数,则Linux Kernel镜像默认使用~/Android/prebuilt/android-arm/kernel目录下的kernel-qemu文件,而Android镜像文件则默认使用ANDROID_PRODUCT_OUT目录下的system.img、userdata.img和ramdisk.img,也就是我们刚刚编译出来的镜像问题。
总结