Android源码编译(2.3.7_r1 5.1.1_r14) - clarkehe/Android GitHub Wiki
编译环境
操作系统
源码是交叉编译,要选择编译的平台,现在只支持Ubuntu和Mac系统,Windows系统不支持。可能在Windows系统下编译,要配置的东西比较多,官方也没有给出指引。根据官网描述,编译不同版本的源码,要注意两个方面:操作系统版本、是否要64位系统。
考虑到方便,建议还是使用Ubuntu系统,用虚拟机安装指定版本。我是编译2.3.7_r1和5.1.1_r14这两个分支的源码,下载的是Ubuntu 12.04 64位版本镜像,安装在虚拟机上。
还有一个坑,要提前说下,就是为下载源码准备的磁盘空间一定要足够大,特别是下载4.0+的源码;再加上编译占用的空间,至少要做准备200GB左右的空间。我开始只准备了50G的空间,就去下载4.4的代码,空间占满了,代码还没下载完,只能改成下载2.3.7的代码,后面又编译了5.1.1的代码。
Java
Java的配置要注意是官方Jdk还是OpenJdk,另外还要注意版本,详细看官方描述。
编译2.3.6要使用官方Jdk1.6,到Oracle官网下载bin文件。下载文件jdk-6u45-linux-x64.bin放到/usr目录,在命令行下执行bin文件,就会解压到jdk1.6.0_45目录。 在命令行配置(本质就是创建符号链接,在不同版本java之间切换):
sudo update-alternatives --install /usr/bin/java java /usr/jdk1.6.0_45/bin/java 300
sudo update-alternatives --install /usr/bin/javac javac /usr/jdk1.6.0_45/bin/javac 300
sudo update-alternatives --config java
sudo update-alternatives --config javac
网上有资料说要,修改文件/etc/profile,加入下面的配置,实际没有必要。update-alternatives会在/usr/bin目录下创建到java符号链接,/usr/bin也默认已经加到PATH路径了,$JAVA_HOME/bin再加到PATH路径是多余的。装了多个版本的java时,加了下面的配置还有副作用。
export JAVA_HOME=/usr/jdk1.6.0_45
export PATH=$PATH:$JAVA_HOME/bin
编译5.1.1则需要openJdk1.7,这个很简单,用命令行安装就可以了。
sudo apt-get install openjdk-7-jdk
安装完,再用update-alternatives配置下当前的java版本。
sudo update-alternatives --config java
sudo update-alternatives --config javac
依赖组件
依赖组件看按照官网描述,看官网描述,要安装下面的组件。
$ 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
这里有个大坑。安装libgl1-mesa-glx:i386,会提示版本不兼容之类,建议安装libgl1-mesa-dri:i386。安装libgl1-mesa-dri:i386后,会导致ubuntu不能正常启动,卡在启动界面。(解决方案参考:http://bbs.chipspark.com/forum.php?mod=viewthread&tid=7958 )
建议不要安装libgl1-mesa-glx:i386,也不要安装libgl1-mesa-dri:i386。
gcc g++
Ubuntu12.04自带的gcc、g++版本是4.6,代码会编译不过。要使用4.4版本,安装命令如下(在/usr/bin目录):
sudo apt-get install gcc-4.4 g++-4.4
sudo mv gcc gcc.bak
sudo mv g++ g++.bak
sudo ln -s gcc gcc-4.4
sudo ln -s g++ g++-4.4
下载源码
下载源码,参考官方网描述,选择好分支,用repo同步就可以了。
这里重点说下代理配置的问题,没代理,组件无法下载安装,代码也下载不了。
在命令行(终端),通过export http_proxy=“http://xxx.com:8080/” 设置http协议代理。但每次都要设置,比较麻烦,可以保存到配置文件。
打开文件
sudo gedit /etc/enviroment
加入配置
export http_proxy="http://xxx.com:8080/"
export https_proxy="http://xxx.com:8080/"
export HTTP_PROXY="http://xxx.com:8080/"
export HTTPS_PROXY="http://xxx.com:8080/"
apt-get install安装组件也要配置代理。
打开文件
sudo gedit /etc/apt/apt.conf
加入配置(注意行尾有个分号)
Acquire::http::proxy "http://xxx.com:8080/";
Acquire::https::proxy "http://xxx.com:8080/";
编译问题
问题: /usr/bin/ld: cannot find -lz collect2: ld returned 1 exit status
解决: sudo apt-get install libz-dev
问题:(编译2.3.7):MediaScanner.cpp中有几处const字符串转换编译报错
解决: 修改源码(大概有4、5处)
问题: multilib没有安装
解决: sudo apt-get install g++-4.4-multilib
看网上有人在编译时遇到了其他的一些问题,可自行google参考。
运行镜像
编译2.3.7,lunch选择的build type是模拟器,选择的选项是generic(不能选emulator,会编译不过),generic编译出来就是模拟器的镜像文件。编译完成后,在命令行运行:emulator,模拟器就会运行,加载镜像。(emulator所在路径,在lunch的时候已经加到PATH路径了。)
我运行emulator的时候报错了,参考(http://stackoverflow.com/questions/4841908/sdl-init-failure-reason-is-no-available-video-device) 安装了必要组件,就正常的。
编译5.1.1_r14,则是针对Nexu 5真机。在编译前,要先下载Nexus 5对应5.1.1版本的二进制文件,就是一个脚本文件,放在源码根目录执行,脚本会在vendor目录复制一些文件(so及一些配置文件)。lunch选择的budid type是Nexus 5(序号是14),接着用make -j4进行编译。编译完成后,在out的子目录得到system.img、boot.img等镜像文件,用fastboot将这些文件刷入Nexus 5真机。
相对工厂镜像包(factory image),源码编译出来的只是大部分的镜像文件,像bootloader和radio的镜像,还是要从工厂镜像包中提取。可以先刷入完整的工厂镜像,再刷入源码编译出来的镜像文件。
编译部分模块
首先需要在android源码根目录执行 . build/envsetup.sh(应该也要lunch选择build type),再使用这三个命令:
- m:编译所有的模块
- mm:编译当前目录下的模块,当前目录下要有Android.mk文件
- mmm:编译指定路径下的模块,指定路径下要有Android.mk文件
假设我要编译android下的libjpeg模块,当前目录为源码根目录,方法如下:
1、. build/envsetup.sh
2、mmm external/jpeg/
或者 :
1、. build/envsetup.sh
2、cd external/jpeg
3、mm
详细可参考:http://www.cnblogs.com/myitm/archive/2011/12/05/2276977.html