Android4.4源码编译总结

本文详细介绍了在Ubuntu系统中编译Android 4.4源码的全过程,包括源码准备、JDK1.6安装、环境变量配置、依赖软件安装、ccache优化、编译步骤、编译问题与解决方案,以及如何启动模拟器。通过这个指南,读者可以了解完整的Android源码编译流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、源码编译前的准备工作

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 你想要的文件大小, 40960004G,1700000017G)
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)
解决方法:
是警告我直接忽略了。也能开起来

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值