一、源码编译前的准备工作
1. 从window中拷贝Android源码和jdk到ubuntu
Android源码为:android4.4_src.7z
jdk为:jdk-6u45-linux-i586.bin
(1) 在/home/kavin下创建install目录
(2) 把android源码和jdk复制到/home/kavin/install目录下
(3) 解压android4.4.7z到install目录
(4) 解压rar文件需要用到7z解压工具,如果没有需要安装
$ sudo apt-get install p7zip
//解压到当前目录的android4.4_src中
$ 7za x android4.4_src.7z -o./android4.4_src
2. 安装JDK, 官方要求编译4.4源码需要JDK1.6
1). jdk下载地址:Oracle官网下载地址(需要注册账号):http://download.oracle.com/otn/java/jdk/6u45-b06/jdk-6u45-linux-i586.bin
2). 拷贝jdk-6u45-linux-i586.bin安装包到/home/kavin/install目录下。
cd /home/kavin/install
3). 安装jdk
$ sudo ./jdk-6u45-linux-i586.bin
3). 配置环境变量.
修改系统环境变量文件,使用gedit打开环境变量配置文件
$ sudo gedit /etc/profile
添加在打开的文件中添加如下代码
export JAVA_HOME=/home/kavin/install/jdk1.6.0_45
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
如果想立即生效,执行下面语句
$ source /etc/profile
5). 查看jdk安装是否成功.
$ java -version
能看到下面提示表示安装成功了
kavin@kavin-VirtualBox:~/install$ java -version
java version “1.6.0_45”
Java(TM) SE Runtime Environment (build 1.6.0_45-b06)
Java HotSpot(TM) Server VM (build 20.45-b01, mixed mode)
查看JAVA_HOME变量的值
$ echo $JAVA_HOME
3. 安装其他编译时依赖的软件.
下面就开始安装编译依赖的软件, 同样, 在终端中以行为单位依次输入以下命令:
sudo apt-get install gnupg
sudo apt-get install flex
sudo apt-get install bison
sudo apt-get install gperf
sudo apt-get install zip
sudo apt-get install curl
sudo apt-get install build-essential
sudo apt-get install libesd0-dev
sudo apt-get install libwxgtk2.6-dev
sudo apt-get install libsdl-dev
sudo apt-get install lsb-core
sudo apt-get install lib32z1-dev
sudo apt-get install gcc-4.4
sudo apt-get install g++-4.4
sudo apt-get install g++-4.4-multilib
sudo apt-get install lib32ncurses5-dev
优化编译环境(可选)
虽然是可选但是我也设置了
设置的ccache
您可以选择告诉编译使用的ccache编译工具。CCACHE充当可以用来加速的重建一个编译器缓存。如果你使用这个作品非常好make clean时候,或者如果您经常不同版本的产品之间进行切换。
把下面的你.bashrc:
export USE_CCACHE=1
默认缓存将存储在~/.ccache。如果你的home目录是NFS或某些其他非本地文件系统,你将要在指定的目录中.bashrc的文件,以及:
//我设置的是export CCACHE_DIR=/home/kavin/install/ccache
//前提是你先创建ccache文件夹。
export CCACHE_DIR=<path-to-your-cache-directory>
把上面的两行加到~/.bashrc文件的最后:
sudo gedit ~/.bashrc
(其实我的JAVA_HOME也是配置在这里的)
建议的缓存大小为50-100GB。您将需要运行下面的命令,一旦你下载的源代码:
prebuilts/misc/linux-x86/ccache/ccache -M 50G
在Mac OS中,应更换linux-x86有darwin-x86:
prebuilts/misc/darwin-x86/ccache/ccache -M 50G
当构建冰淇淋三明治(4.0.x的)或以上,以及ccache是在不同的位置:
prebuilt/linux-x86/ccache/ccache -M 50G
该设置被存储在CCACHE_DIR和持续存在。
二、开始编译
开始编译
进入到2.3源码所在目录
$ cd ~/install/android4.4_src
编译整个源码
//-j4 表示开四个线程编译 (开启的线程数一般为内核的两倍,我的pc是双核的,如果你不知道电脑内核 直接 make 就好了)
$ make -j4
三、编译过程及问题
说明:编译Android源码非常耗时(我的耗时不算停下来的时间6小时左右),并且编译时会有各种错误导致编译终止,但百度一下都能找到解决方法,修改后重新编译即可。(这里我把我编译过程中出现的问题总结了一下,请参考最下面报错汇总)
四、编译结果
编译完成后是这样子的
源码编译成功后,所有结果都生成在/out目录下:
/out/host/: 存放开发工具, 如:emulator,adb,aapt 等。
/out/target/common/: 主要存放 Java 应用代码和 Java 库。
/out/target/product/generic/: 此目录下生成如下三个img镜像文件
ramdisk.img: 在启动时将被Linux 内核挂载为只读分区,它包含了 /init 文件和一些配置文件。它用来挂载其他系统镜像并启动 init 进程。
system.img: 包含了 Android OS 的系统文件,共享库,可执行文件以及预置的应用程序,将被挂载为根分区。
userdata.img: 将被挂载为/data,包含了应用程序相关的数据以及和用户相关的数据。
五、编译源代码中的某一个应用或模块:
在完成了一次源码编译后,可以单独对某一个应用或模块进行编译,以下表示修改了短信应用后,只编译短信这个应用:
进入android源码根目录,初始化环境(加载build目录下的envsetup.sh文件)
$ . build/envsetup.sh
mmm 编译指定目录下的模块, 会将该模块依赖的所有模块也一起编译
$ mmm packages/apps/Mms
六、启动模拟器
1、配置环境
修改系统环境变量文件,使用gedit打开环境变量配置文件
$ sudo gedit /etc/profile
添加在打开的文件中添加如下代码并保存
export ANDROID_PRODUCT_OUT_BIN=/home/kavin/install/android4.4_src/out/host/linux-x86/bin
export ANDROID_PRODUCT_OUT=/home/kavin/install/android4.4_src/out/target/product/generic
export ANDROID_SWT=/home/kavin/install/android4.4_src/out/host/linux-x86/framework/x86_64
改完后不要忘了加载配置
$ source /etc/profile
2、启动模拟器 (能开起来就算搞定了)
$ emulator
七、下面是编译中报错汇总
1、
Copy xml: out/target/product/generic/system/etc/apns-conf.xml
/bin/bash: xmllint: command not found
make: *** [out/target/product/generic/system/etc/apns-conf.xml] Error 127
解决方法:
安装xmllint : sudo apt-get install libxml2-utils
2.
OSError: [Errno 2] No such file or directory
make: *** [out/host/linux-x86/obj/SHARED_LIBRARIES/libbcc_intermediates/BuildInfo.cpp] 错误 1
解决方法:
$ sudo apt-get install Git
$ sudo apt-get install git-core
3.
这是我遇到最棘手的一个问题:
collect2: error: ld returned 1 exit status
make: *** [out/target/product/generic/obj/SHARED_LIBRARIES/libwebviewchromium_intermediates/LINKED/libwebviewchromium.so] 错误 1
解决方法:
参考:http://jileniao.net/ubunt-add-swap-to-build-libwebviewchromium.html
我按照上面博客设置了4G的swap可以还是没有解决,当时真是快奔溃了;
害我从头又来了一边,还是挂在这里了,搞了好久最终我翻墙到了android官网看到了这么一段原话:
A Linux or Mac OS system.
It is also possible to build Android in a virtual machine on unsupported systems such as Windows.
If you are running Linux in a virtual machine,
you need at least 16GB of RAM/swap and 100GB or more of disk space in order to build the Android tree.
See disk size requirements below.
大概意思是:如果你的linux是运行在虚拟机上,你至少需要16G的内存或者swap交换分区和至少100G硬盘空间
1).# dd if=/dev/zero of=/opt/swap bs=1024 count=17000000
(count的值等于1024 x 你想要的文件大小, 4096000是4G,17000000是17G)
2).# mkswap /opt/swap
(把这个文件变成swap文件)
3).# swapon /opt/swap
(启用这个swap文件)
4).为了使每次开机时都能正常使用swap文件,所以这里需要把swap文件增加到fstab文件中
# sudo vi /etc/fstab (当然这样更方便修改 sudo gedit /etc/fstab)
在最后一行增加如下内容
/opt/swap swap swap defaults 0 0
4.0
OSError: [Errno 2] No such file or directory
make: *** [out/target/product/generic/obj/GYP/shared_intermediates/templates/org/chromium/base/ActivityState.java]
解决方法:
$ sudo apt-get install g++-4.4
$ sudo ln -s /usr/bin/g++-4.4 /usr/bin/g++
这个问题主要是gcc和g++ 版本不同 且g++链接文件出错导致
问题4.1
make: * [out/host/linux-x86/obj/STATIC_LIBRARIES/liboprofile_pp_intermediates/arrange_profiles.o] Error 1
解决方法:
使用gcc4.4版本进行编译. Ubuntu 11.10的gcc版本是4.6,版本太高,编译Android时出错,要把gcc版本改为4.4, 4.5的版本.进入/usr/bin目录
cd /usr/bin
再执行
ls -l gcc*
输出
lrwxrwxrwx 1 root root 7 2011-10-29 09:11 gcc -> gcc-4.6
-rwxr-xr-x 1 root root 224544 2011-10-06 05:47 gcc-4.4
-rwxr-xr-x 1 root root 302104 2011-09-17 05:43 gcc-4.6
发现gcc 链接到gcc-4.6, 执行以下命令,将它改为链接到gcc-4.4 :
sudo mv gcc gcc.bak
sudo ln -s gcc-4.4 gcc
同理
ls -l g++*
lrwxrwxrwx 1 root root 7 2011-08-14 15:17 g++ -> g++-4.6
-rwxr-xr-x 1 root root 228640 2011-10-06 05:45 g++-4.4
-rwxr-xr-x 1 root root 306200 2011-09-17 05:39 g++-4.6
需要将g链接改为g-4.4:
sudo mv g++ g++.bak
sudo ln -s g++-4.4 g++
再查看gcc和g++版本号:
gcc -v
g++ -v
均显示gcc version 4.4 ,说明gcc 4.4安装成功。
5.
/bin/bash: xmllint: 未找到命令
make: * [out/target/product/generic/system/etc/apns-conf.xml] 错误 127
make: * 正在等待未完成的任务….
解决方法:
根据提示 安装上对应的工具
$ sudo apt-get install libxml2-utils
6.
emulator: WARNING: system partition size adjusted to match image file (550 MB > 200 MB)
解决方法:
是警告我直接忽略了。也能开起来