Android源码编译全过程
摘要:本文是根据自己亲手编译源码过程所总结的一个开发笔记(包括编译流程,可能遇到的错误,以及错误解决的办法等),首先介绍了基于Ubuntu9.10的编译环境的建立,再次介绍了整个源码的获取方式,最后讲解了源码的编译过程(包括源码的打包处理,u-boot的编译,Linux的kernel的编译,android文件系统的编译)。本文各个操作的开发环境是基于VMware7.10虚拟机的Ubuntu9.10环境。当然不同的版本的Linux可能操作过程有点差异,所遇到的错误可能不同,但是各个操作思想是一致的。
编译环境的建立
1. 首先安装好Vmware7.10,然后再在VMware7.10 上安装一个Ubuntu9.10,做好各种配置,如windows和Linux文件共享的目录配置,FTP服务器的配置,以便在windows和Linux相互传送和共享文件。
2. 安装android编译所必须的软件包
a)Git 1.5.4 or newer and the GNU PrivacyGuard.
即安装一个git-core gnupg
b)JDK 5.0, update 12 or higher.Java 6 isnot supported, because of incompatibilities with @Override.
即要安装一个Java5 而不是Java6。我们安装一个sun-java5-jdk
错误提醒:android官方支持是Java5(即java 1.5) 而不是Java6(即Java1.6) 虽然现在Java桌面开发的主流是Java6。如果默认安装就是Java6,编译时程序文件系统是出现一大堆错误,而不能通过。因此我们安装时要指定sun-java5-jdk来安装。
c) flex, bison, gperf, libsdl-dev, libesd0-dev,libwxgtk2.6-dev (optional), build-essential, zip, curl.安装以上编译必要工具。
错误提醒:在我的Ubuntu9.10中,安装libsdl-dev时得不到对应的包,因为Ubuntu9.10已经升级成libsdl1.2-dev。
总的操作命令为:
$ sudo apt-get install git-core gnupg sun-java5-jdk flex bisongperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curllibncurses5-dev zlib1g-dev
以上下载过程一般是3~4个小时
d) You might also want Valgrind, a tool thatwill help you find memory leaks, stack corruption, array bounds overflows, etc.
安装valgrind ,这个小插件很大,下载过程一般是一两个小时
操作命令为:
$ sudo apt-get install valgrind
e)Intrepid( 8.10) users may need a newer version of libreadline:
$ sudo apt-get install lib32readline5-dev
操作提示: 该步骤只是基于低版本的Ubuntu8.10,我们的Ubuntu9.10没有必要安装这个插件
以上软件包的下载安装所要花费的时间很长,一般是一天的时间。我的网速很慢,整天都没有关机,到第二天早上才下载完毕。
在这个安装过程中,也因为一些错误被卡在卡住一段时间了:
1.在下载安装 sun-java5-jdk ,系统提示找不到该软件包。
即找不到该源。更新Ubuntu的源,即sudoapt-get update 命令一下,还是解决不了,苦苦挣扎一天,后来在一个老外的博客上找到一个解决方法:
错误原因:Ubuntu9.10的下载源文件默认没有包括sun-java5-jdk的源。因此我们必须手动添加新的源
解决方法:
打开/etc/apt/sources.list文件,而后在文件最后添加两个源。
deb http:// ubuntu.srt.cn/ubuntu/jaunty multiverse
deb http:// ubuntu.srt.cn//ubuntu/jaunty-updates multiverse
保存后,然后更新一下
sudoapt-get update
之后再安装:
sudoapt-get install sun-java5-jdk问题得到解决
2.安装libsdl-dev,时得不到对应的包,系统自动安装一个libsdl1.2-dev,刚开始很疑惑,以为出了错,后来反复重拾几遍还是一个的结果。通过查找资料分析,分析libsdl1.2-dev是libsdl-dev另一个版本而已,不会存在问题
源码的获取
1. 首先下载飞思卡尔imx51的补丁包和相应的源代码。下载网站http://www.freescale.com/imx
注意:从该网站下载一个包,并不是真正的源码,它这是为一个frescale源码补丁包以及它对于的编译器和下载工具,真正的源码还得到Google的官方网站下自己去下载
2. 把下载的freescale源代补丁码,从windows共享文件夹拷贝到/home/nfs/,然后对其进行解压
代码语言:javascript复制 $ cd /home/nfs/
$ tar xzvf imx-android-r9.tar.gz
$ cd imx-android-r9/code
$ tar xzvf r9.tar.gz
提示:我这里是以/home/nfs目录为以后工作目录的根目录
3. 解压交叉编译工具链,配置好环境变量
进入tool目录下,解压对于的交叉编译工具链,并设置好环境变量
代码语言:javascript复制$ cd imx-android-r9/tool
代码语言:javascript复制 $ tar xzvf gcc-4.1.2-glibc-2.5-nptl-3.tar.gz
代码语言:javascript复制 $ export ARCH=arm
代码语言:javascript复制
代码语言:javascript复制$ export CROSS_COMPILE=/home/nfs/imx-android-r9/tool/gcc-4.1.2-glibc-2.5-nptl-3/arm-none-linux-gnueabi/bin/arm-none-linux-gnueabi-
代码语言:javascript复制$ export PATH=/home/nfs/imx-android-r9/tool/gcc-4.1.2-glibc-2.5-nptl-3/arm-none-linux-gnueabi/bin:$PATH
小技巧
echo PATH 可以查看环境变量是否设置正确,以免出错时再回头解决
4. 获取android源码
代码语言:javascript复制 $ cd ~
代码语言:javascript复制 $ mkdir myandroid
代码语言:javascript复制 $ cd myandroid
代码语言:javascript复制$ curl http://android.git.kernel.org/repo > ./repo
代码语言:javascript复制最新下载地址已改:
代码语言:javascript复制curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo
代码语言:javascript复制$ chmod a x ./repo
代码语言:javascript复制$ ./repo init -u git://android.git.kernel.org/platform/manifest.git -b froyo
代码语言:javascript复制 $ cp/home/nfs/imx-android-r9/code/r9/default.xml .repo/manifests/default.xml
代码语言:javascript复制 $ ./repo sync
注意:repo 命令使用时要注意你所repo所在目录,如果repo不是在根目录下,如:在/home/nfs/bin/下,所有的repo为该加上全路径名 ./home/nfs/bin/repo
如果按安装官方文档所设的路径
1.Make sure you have a~/bindirectory in your home directory, and check tobe sure that this bin directory is in your path: cd ~ mkdir bin echo PATH
2.Download thereposcript and make sure it is executable: $ curl http://android.git.kernel.org/repo >~/bin/repo
$ chmod a x ~/bin/repo
此时repo就在/home/nfs/bin/下
同步代码
1.Create an empty directory to hold your working files: mkdir mydroid cd mydroid
2.Run "repo init" to bring down the latestversion of Repo with all its most recent bug fixes. You must specify a URL forthe manifest: $ repo init -u git://android.git.kernel.org/platform/manifest.git
3.If youwould like to check out a branch other than "master", specify it with-b, like: $ repo init -ugit://android.git.kernel.org/platform/manifest.git -b cupcake
$repo sync
注意 :我刚开始也采用官方版本的做法,就是出错,提示信息是找不到repo这个命令,被卡住了很久,后来终于想到,没有设置环境变量,可能是官方自己已经设置好环境变量,所以操作起来就没有错误,在这里我为了懒得把repo添加到环境变量里面去了,就直接采用全路径目录名,把所有的./rep改成./home/nfs/bin/repo,果然问题得到解决。
这个下载android源码同步过程很长,至少是7到8个小时,我是机子一夜没有关,第二早上才同步完
5. 下载Linux内核
因为android是基于Linux内核的,因此要下载一个Linux内核,注意前面一步是下载android相关的代码。是不包括Linux内核的,Linux内核要单独下载.
代码语言:javascript复制$ cd myandroid
代码语言:javascript复制$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-2.6.31.y.git kernel_imx
这个过程大概1个小时左右
6. 下载bootloader
在嵌入式系统还要一个引导的启动代码就是bootloader,我们选择u-boot来引导。
cd myandroid/bootable/bootloader git clone git://git.denx.de/u-boot.git uboot-imx
这个过程大概是1个小时左右
特别提示:在下载源码的过程中,一定要保持网络稳定,不能断网,如果断网里就前功尽弃,一切工作就要从头开始(如果网络不好,最好不要在下载源码是去开网页,如果不小心死机了,又要从新开始来)。整个源代码的目录分布如下
给源码的打上补丁包
以上的下载的源码只是一个通用的源码,具体到特定硬件开发板上还要有针对性的修改。好在这里飞思卡尔官方带了对应的补丁可以帮助我们完成这个工作。
代码语言:javascript复制$ cd ~/myandroid
代码语言:javascript复制 $ . /home/nfs/imx-android-r9/code/r9/and_patch.sh
代码语言:javascript复制 $ c_patch /home/nfs/imx-android-r9/code/r9 imx_r9
编译完毕后出现
代码语言:javascript复制******************************************************
代码语言:javascript复制 Success: Now you can build android code for FSL i.MX platform
代码语言:javascript复制 *****************************************************
说明打包成功。
提示:这个打打补丁包操作大概要2到3分钟左右。
Build uboot(编译Uboot)
cd ~/myandroid/bootable/bootloader/uboot-imx make distclean make mx51_bbg_android_config make
这个过程首先要确保编译的环境变量设置的正确性,否则就会出错。如果没有建立好编译环境就要回到前面的编译环境的建立方法。
如果编译成功的话就可以在当前目录下产生U-boot.bin.不过u-boot.bin,在文件开始的有1M的padding,例如它的第一个执行指令是在1KB的位置。,如果你想去产生没有padding的镜像,我们必须进行以下的操作
sudo ddif=./u-boot.bin of=./u-boot-no-padding.bin bs=1024 skip=1 sudo sync 这样就在当前目录下产生u-boot-no-padding.bin文件
通常在SD卡中使用u-boot-no-padding.bin 镜像
Build Kernel Image(编译内核镜像)
export PATH=~/myandroid/bootable/bootloader/uboot-imx/tools:PATH cd ~/myandroid/kernel_imx echo ARCH && echo
make imx5_android_defconfig make uImage
这个过程大概要4~5分钟,如果编译成功,将会在~/myandroid/kernel_imx/arch/arm/boot/产生一个uImage镜像
为了去产生一个能不Uboot加载的zImage,
$ cd ~/myandroid/kernel_imx/arch/arm/boot
$ ~/myandroid/bootable/bootloader/uboot-imx/tools/mkimage -A arm-O linux -T kernel -C none -a 0x90008000 -e 0x90008000 -n "Android LinuxKernel" -d ./zImage ./uImage
最后在~/myandroid/kernel_imx/arch/arm/boot/产生一个zImage镜像
Build Android image (编译android镜像)
在对所有的源码进行打补丁处理后,对Uboot和Linux内核镜像编译后,才能android镜像(即android对应的文件系统)
代码语言:javascript复制$ cd ~/myandroid
代码语言:javascript复制$ make PRODUCT-imx51_bbg-eng 2>&1 | tee build_imx51_bbg_android.log
代码语言:javascript复制为了编译能够让Uboot识别的文件系统还要做以下的操作
代码语言:javascript复制/home/nfs/myandroid/bootable/bootloader/uboot-imx/tools/mkimage -A arm -O linux -T ramdisk -C none -a 0x90308000 -n "Android Root Filesystem" -d ./ramdisk.img ./uramdisk.img
代码语言:javascript复制这样就会产生如下的提示