Android源码下载与编译全过程

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/,然后对其进行解压

  $ cd /home/nfs/

      $ tar xzvf imx-android-r9.tar.gz

      $ cd imx-android-r9/code

$ tar xzvf r9.tar.gz

 提示:我这里是以/home/nfs目录为以后工作目录的根目录

3.                      解压交叉编译工具链,配置好环境变量

进入tool目录下,解压对于的交叉编译工具链,并设置好环境变量

$ cd imx-android-r9/tool
       $ tar xzvf gcc-4.1.2-glibc-2.5-nptl-3.tar.gz 
     $ export ARCH=arm
 
$ 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-
$ 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源码

 $ cd ~
    $ mkdir myandroid
    $ cd myandroid
$ curl http://android.git.kernel.org/repo > ./repo
最新下载地址已改:
curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo
$ chmod a+x ./repo
$ ./repo init -u git://android.git.kernel.org/platform/manifest.git -b froyo
    $ cp/home/nfs/imx-android-r9/code/r9/default.xml .repo/manifests/default.xml 
  $ ./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内核要单独下载.

$ cd myandroid
$ 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个小时左右

特别提示:在下载源码的过程中,一定要保持网络稳定,不能断网,如果断网里就前功尽弃,一切工作就要从头开始(如果网络不好,最好不要在下载源码是去开网页,如果不小心死机了,又要从新开始来)。整个源代码的目录分布如下

 给源码的打上补丁包

以上的下载的源码只是一个通用的源码,具体到特定硬件开发板上还要有针对性的修改。好在这里飞思卡尔官方带了对应的补丁可以帮助我们完成这个工作。

$ cd ~/myandroid
       $ . /home/nfs/imx-android-r9/code/r9/and_patch.sh
       $ c_patch /home/nfs/imx-android-r9/code/r9 imx_r9

编译完毕后出现

******************************************************
    Success: Now you can build android code for FSL i.MX platform
    *****************************************************

说明打包成功。

提示:这个打打补丁包操作大概要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 $CROSS_COMPILE
    确保环境变量都设置好了

$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对应的文件系统)

$ cd ~/myandroid
$ make PRODUCT-imx51_bbg-eng 2>&1 | tee build_imx51_bbg_android.log
为了编译能够让Uboot识别的文件系统还要做以下的操作
/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
这样就会产生如下的提示

编译后产生的文件系统在~/myandroid/device/fsl/product这个目录下。

提示:

1.   这个编译需要的磁盘空间很大,起初我给虚拟机分配12G的空间,没有想到编译到不到50%,就因为磁盘空间不足而出错自动退出,同时因为android的源码备份到windows平台出现严重的错误,无论是采用文件共享还是FTP转移文件都出现错误,仔细分析,文件之间的链接关系在复制时出错。这样我只能重新安装Ubuntu,给Ubuntu分配80G的磁盘空间(有朋友分配80G的空间编译成功的经验),然后重新从零开始重复以前的工作。

2.   这个过程编译时间很漫长,我编译了两天才编译成功。

猜你喜欢

转载自blog.csdn.net/fengliang191/article/details/40679793