Ubuntu12.04下编译android源码4.0.3
来源:互联网 发布:linux 复制文件夹 编辑:程序博客网 时间:2024/05/18 02:11
1、初始化编译环境
软件需求:
Python2.5-2.7,可以http://www.python.org/download/下载(Ubuntu12.04自带)。
JDK6:编译Gingerbread或更新版本;JDK5:编译Froyo或更早版本。可以到http://java.sun.com/javase/downloads/下载,或通过Ubuntu软件中心下载更方便。
Git1.7或更新版本,可以到http://git-scm.com/download下载,或直接在终端下sudo apt-get install git下载即可。
安装JDK
安装JAVA6:
找到一个可用的sun-java6-jdk源:
$ sudo gedit /etc/apt/sources.list #root权限使用gedit编辑sources.list内容
文档末尾复制粘帖以下内容,然后保存并关闭文件:
deb http://run.hit.edu.cn/ubuntu/ jaunty main restricted universe multiverse
deb-src http://run.hit.edu.cn/ubuntu/ jaunty main restricted universe multiverse
deb http://run.hit.edu.cn/ubuntu/ jaunty-updates main restricted universe multiverse
deb-src http://run.hit.edu.cn/ubuntu/ jaunty-updates main restricted universe multiverse
deb http://run.hit.edu.cn/ubuntu/ jaunty-backports main restricted universe multiverse
deb-src http://run.hit.edu.cn/ubuntu/ jaunty-backports main restricted universe multiverse
deb http://run.hit.edu.cn/ubuntu/ jaunty-security main restricted universe multiverse
deb-src http://run.hit.edu.cn/ubuntu/ jaunty-security main restricted universe multiverse
2.更新源内容并安装sun-java6-jdk
$ sudo apt-get update #更新源及可用软件包内容
$ sudo apt-get install sun-java6-jdk #安装sun-java5-jdk,过程中需要阅读许可并键入“y”同意
安装编译所需的软件包:
1
$
sudo
ln
-s /usr/lib/i386-linux-gnu/libX11.so.6 /usr/lib/i386-linux-gnu/libX11.so
2
3
$
sudo
apt-get
install
git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev libc6-dev libncurses5-dev x11proto-core-dev libx11-dev libreadline6-dev libgl1-mesa-dev tofrodos python-markdown libxml2-utils xsltproc
配置USB访问权限
在GNU/Linux系统下(特别是Ubuntu系统下),默认配置下普通用户不能直接访问USB设备,需要对系统进行一些配置。
以超级用户创建新配置文件/etc/udev/rules.d/51-android.rules,并将以下内容拷贝到新配置文件中:
01
# adb protocol on passion (Nexus One)
02
SUBSYSTEM==
"usb"
, ATTR{idVendor}==
"18d1"
, ATTR{idProduct}==
"4e12"
, MODE=
"0600"
, OWNER=
"<username>"
03
# fastboot protocol on passion (Nexus One)
04
SUBSYSTEM==
"usb"
, ATTR{idVendor}==
"0bb4"
, ATTR{idProduct}==
"0fff"
, MODE=
"0600"
, OWNER=
"<username>"
05
# adb protocol on crespo/crespo4g (Nexus S)
06
SUBSYSTEM==
"usb"
, ATTR{idVendor}==
"18d1"
, ATTR{idProduct}==
"4e22"
, MODE=
"0600"
, OWNER=
"<username>"
07
# fastboot protocol on crespo/crespo4g (Nexus S)
08
SUBSYSTEM==
"usb"
, ATTR{idVendor}==
"18d1"
, ATTR{idProduct}==
"4e20"
, MODE=
"0600"
, OWNER=
"<username>"
09
# adb protocol on stingray/wingray (Xoom)
10
SUBSYSTEM==
"usb"
, ATTR{idVendor}==
"22b8"
, ATTR{idProduct}==
"70a9"
, MODE=
"0600"
, OWNER=
"<username>"
11
# fastboot protocol on stingray/wingray (Xoom)
12
SUBSYSTEM==
"usb"
, ATTR{idVendor}==
"18d1"
, ATTR{idProduct}==
"708c"
, MODE=
"0600"
, OWNER=
"<username>"
13
# adb protocol on maguro/toro (Galaxy Nexus)
14
SUBSYSTEM==
"usb"
, ATTR{idVendor}==
"04e8"
, ATTR{idProduct}==
"6860"
, MODE=
"0600"
, OWNER=
"<username>"
15
# fastboot protocol on maguro/toro (Galaxy Nexus)
16
SUBSYSTEM==
"usb"
, ATTR{idVendor}==
"18d1"
, ATTR{idProduct}==
"4e30"
, MODE=
"0600"
, OWNER=
"<username>"
17
# adb protocol on panda (PandaBoard)
18
SUBSYSTEM==
"usb"
, ATTR{idVendor}==
"0451"
, ATTR{idProduct}==
"d101"
, MODE=
"0600"
, OWNER=
"<username>"
19
# fastboot protocol on panda (PandaBoard)
20
SUBSYSTEM==
"usb"
, ATTR{idVendor}==
"0451"
, ATTR{idProduct}==
"d022"
, MODE=
"0600"
, OWNER=
"<username>"
并且将以上内容中的
1
“<username>”
修改为用户名,如修改为”Taskiller”。
2、配置ccache
ccache(“compiler cache”的缩写)是一个编译器缓存,该工具会高速缓存编译生成的信息,并在编译的特定部分使用高速缓存的信息, 比如头文件,这样就节省了通常使用cpp解析这些信息所需要的时间。如果您编译清单2中的文件,假定foobar.h中包含对其他头文件的引用,ccache会用那个文件的 cpp-parsed版本来取代include声明。ccache只是将最终的文本拷贝到文件中,使得它可以立即被编译,而不是真正去读取、理解并解释其内容。
这一步是可选的。我在编译的时候没有配置ccache,最后的编译时间用了尼玛至少六个小时以上,虽然目前我还没有尝试过配置ccache后的编译速度,这里还是建议读者配置一下,以节省编译时间,不要像我这么悲催。配置方法如下:
打开用户目录下的.bashrc,将下面语句添加到文件后面并保存退出:
1
export
USE_CCACHE=1
默认情况下cache(缓存)会保存在~/.ccache目录下,如果主目录位于NFS或其他非本地文件系统上,也要将下面语句添加到.bashrc中,之后保存并退出:
1
export
CCACHE_DIR=<path-to-your-cache-directory>
将
1
<path-to-your-cache-directory>修改为cache目录的位置。
推荐的cache目录大小为50-100GB,在命令行执行以下命令:
1
prebuilt/linux-x86/ccache/ccache -M 50G
该设置会保存到CCACHE_DIR中,且该命令是长效的,不会因系统重启而失效。
3、换用gcc与g++的较低版本
Ubuntu11.10自带的gcc与g++版本为4.6,用该版本编译android时会遇到一些错误,如:
1
host Prebuilt: monkeyrunner (out/host/linux-x86/obj/EXECUTABLES/monkeyrunner_intermediates/monkeyrunner)
2
host C++: obbtool <= frameworks/base/tools/obbtool/Main.cpp
3
<命令行>:0:0: 错误: “_FORTIFY_SOURCE”重定义 [-Werror]
4
<built-
in
>:0:0: 附注: 这是先前定义的位置
5
cc1plus:所有的警告都被当作是错误
网上有文章说修改build/core/combo/HOST_linux-x86.mk文件,将
1
HOST_GLOBAL_CFLAGS += -D_FORTIFY_SOURCE=0
修改成
1
HOST_GLOBAL_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0
这种方法虽然能解决该问题,但也会引出新的问题,还要继续不断的修改,很麻烦,而且也会破坏android源码的原生状态。但是如果使用4.4版本的gcc与g++,则不会出现这些错误,方法如下:
通过gcc -v命令可以发现gcc库在/usr/lib/gcc/i686-linux-gnu目录下,该目录下有当前系统支持的各种版本gcc库 。在安装gcc 4.4前该目录下是没有4.4目录的,安装gcc 4.4后该目录下就会多出4.4这个目录,且该4.4目录下有各种相应库文件。
ubuntu 32bit系统下安装gcc 4.4的最好方法是仅用以下两条命令,不需要其它命令,否则编译时可能会出错。
1
$
sudo
apt-get
install
gcc-4.4
2
$
sudo
apt-get
install
g++-4.4
装完后进入到/usr/bin目录下
1
$
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,方法如下:
1
$
sudo
mv
gcc gcc.bak
2
$
sudo
ln
-s gcc-4.4 gcc
同理,对g++也做同样的修改:
1
$
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:
1
$
sudo
mv
g++ g++.bak
2
$
sudo
ln
-s g++-4.4 g++
再查看gcc和g++版本号:
gcc -v
g++ -v
均显示gcc version 4.4.6 ,说明gcc 4.4安装成功。
提示bits/predefs.h:没有那个文件或目录 错误的
输入sudo apt-get install gcc-multilib 即可
g++ selected multilib '32' not installed
sudo apt-get install g++-4.4-multilib
SDL_syswm.h:55: 致命错误
sudo apt-get install libx11-dev
/usr/bin/ld: cannot find -lz
sudo apt-get install lib32z1-dev
4、接下来便是对android源码进行编译
进入到源码目录,本人的目录为/home/tasiller/android/source。用envsetup.sh脚本初始化安装环境。可用以下代码:
1
$
source
build/envsetup.sh
或
1
$. build/envsetup.sh
注意.后面有一个空格。
之后,选择要编译的目标:
1
$lunch full-eng
之后便是用make命令编译源码了:
1
$
make
-j4
这里-j4表示用四个线程编译,4表示线程数,读者可根据自己机器的情况设置(如机器为单CPU双核处理器,可设置为-j2或-j4,即该数为CPU内核总数或内核总数的2倍。)
之后就是漫长的等待了。。。
编译完成后,可以在源码目录的out/target/product/generic/目录下看到编译好的ramdisk.img、system.img和userdata.img了。
- Ubuntu12.04下编译android源码4.0.3
- Ubuntu12.04下的Android 源码编译
- ubuntu12.04 编译android源码4.0.4
- ubuntu12.04编译android源码
- Ubuntu12.04编译Android源码
- Ubuntu12.04环境下的android源码编译
- Ubuntu12.04下搭建android源码编译环境全
- ubuntu12.04安装android源码编译环境
- 基于ubuntu12.04 编译Android 7.0源码
- Android—Ubuntu12.0.4下编译android2.3.7系统源码
- 在Android上实现SPI通信之(1)------在Ubuntu12.04环境下编译android源码
- 基于ubuntu12.04下下载android源码
- ubuntu12.04下下载android内核源码
- Ubuntu12.04下的 Android 源码下载
- Ubuntu12.04下的 Android 源码下载
- Ubuntu12.04.4 64bit下下载和编译Android源码4.0.1
- ubuntu12.04(64位)下编译android4.1.1源码过程
- Ubuntu12.04下编译和下载Android4.0.3源码
- 从URL加载图像
- 位图排序
- c 常量 const
- 尾递归
- JPopupButton
- Ubuntu12.04下编译android源码4.0.3
- ubuntu 下安装adobe flash player及出现的浏览器崩溃问题
- 用APPT解析Android应用程序包
- java连接各个数据库驱动名大全 (2012-08-01 11:10:47)
- 如何实现图片的自动缩放
- java synchronized多线程
- SQL Server优化的方法<三>
- MyEclipse 配置优化
- GObject Tutorial Part 1