1、下载Android4.03源代码

   我是从Windows上打包下载的,一共9个多G。 因为在Ubuntu下下载不方便,在Windows下可以使用迅雷下载。 很快的 400多K的速度。

   下载地址: http://d.zhu.im/Android/latest-android-4.0.3_r1.tar.bz2

   下载完成后,复制到Unbuntu下,并解压。

   tar xvfj latest-android-4.0.3_r1.tar.bz2

   然后删除下载文件,以节省空间(如果你有足够的空间,可以不用删除)

2、准备编译环境

   编译环境要保证你的硬盘有足够的容量。 至少应该要有35G左右的空闲空间。

   因为源码解压后可能会有15G左右。

   编译后可能会产生15G左右文件

   安装JDK

     在Ubuntu下安装JDK比较简单,可以在软件中心直接搜索安装,也可以按以下方法安装:

   安装JAVA6:

     sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"

     sudo apt-get update

     sudo apt-get install sun-java6-jdk

   安装JAVA5: 

     sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu hardy main multiverse"

     sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu hardy-updates main multiverse"

     sudo apt-get update

     sudo apt-get install sun-java5-jdk

   如果不能安装sun-java6-jdk

     sudo add-apt-repository ppa:sun-java-community-team/sun-java6

     sudo apt-get update

     sudo apt-get install sun-java6-jdk

   配置USB访问权限

   在GNU/Linux系统下(特别是Ubuntu系统下),默认配置下普通用户不能直接访问USB设备,需要对系统进行一些配置。

   以超级用户创建新配置文件/etc/udev/rules.d/51-android.rules,并将以下内容拷贝到新配置文件中: 

 
  
  1. # adb protocol on passion (Nexus One) 
  2. SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e12", MODE="0600", OWNER="<username>" 
  3. # fastboot protocol on passion (Nexus One) 
  4. SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", ATTR{idProduct}=="0fff", MODE="0600", OWNER="<username>" 
  5. # adb protocol on crespo/crespo4g (Nexus S) 
  6. SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e22", MODE="0600", OWNER="<username>" 
  7. # fastboot protocol on crespo/crespo4g (Nexus S) 
  8. SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e20", MODE="0600", OWNER="<username>" 
  9. # 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>" 

并且将以上内容中的<username>,修改为用户名,如修改为”ryan”。 

3、安装编译需要的依赖包

   最好两个都执行一下。确认所有包都安装到  

 
  
  1. 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 lib64z1-dev libc6-dev-amd64 g++-multilib lib64stdc++6 

 

1sudo 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

 换用gcc与g++的较低版本

 
  
  1. sudo apt-get install gcc-4.4 
  2. sudo apt-get install g++-4.4 
  3. cd /usr/bin 
  4. sudo mv gcc gcc.bak 
  5. sudo ln -s gcc-4.4 gcc 
  6. sudo mv g++ g++.bak 
  7. sudo ln -s g++-4.4 g++ 

      再查看gcc和g++版本号:

      gcc -v

      g++ -v

      均显示gcc version 4.4.6 ,说明gcc 4.4安装成功。

 由于编译时会使用到关于Open GL的函数库,所以请安装

      参考:http://cheng-min-i-taiwan.blogspot.com/2012/05/ubuntu-1204-64bit-android-ics.html (×××访问)

      或执行以下命令

 
  
  1. sudo apt-get install libgl1-mesa-dev:i386 
  2. sudo ln -s /lib/i386-linux-gnu/libGL.so /lib/i386-linux-gnu/libGL.so.1 
  3. sudo cp -rf /usr/lib/i386-linux-gnu/mesa /usr/lib32 
  4. cd  /usr/lib32/mesa  
  5. sudo vi ld.so.conf 
  6. 將 
  7. /usr/lib/i386-linux-gnu/mesa 
  8. 改成 
  9. /usr/lib32/mesa 
  10. sudo ldconfig 
  11. cd /usr/lib32 
  12. sudo ln -s mesa/libGL.so.1 libGL.so 
  13. sudo apt-get install libgl1-mesa-dev 

   安装时可能会发生错误,解决办法:

       如果不能安装build-essential

       Package 'build-essential' has no installation candidate

       root@ubuntu:/home/ryan# sudo apt-get update && sudo aptitude install build-essential

       sudo apt-get install aptitude

       libc6-dev-amd64 The following packages have unmet dependencies

       sudo apt-get install python-software-properties

       不能安装sun-java6-jdk

       sudo add-apt-repository ppa:sun-java-community-team/sun-java6

       sudo apt-get update

       sudo apt-get install sun-java6-jdk

       g++: selected multilib '32' not installed

       sudo apt-get install g++-4.4-multilib

       Ubuntu 12.04 64Bit 版本編譯 Android ICS原始碼錯誤解決方法

       http://cheng-min-i-taiwan.blogspot.com/2012/05/ubuntu-1204-64bit-android-ics.html

4、执行编译,获得系统镜像

 
  
  1. 进入Android源码主目录执行 
  2.  
  3. source build/envsetup.sh 
  4.  
  5. lunch full-eng 
  6.  
  7. make -j4 

这里-j4表示用四个线程编译,4表示线程数,读者可根据自己机器的情况设置(如机器为单CPU双核处理器,可设置为-j2或-j4,即该数为CPU内核总数或内核总数的2倍。)

之后就是漫长的等待了。。。

编译完成后,可以在源码目录的out/target/product/generic/目录下看到编译好的ramdisk.img、system.img和userdata.img了。 

5、运行模拟器。

 
  
  1. export PATH=$PATH:/home/ryan/android4.0-source/android-4.0.3_r1/out/host/linux-x86/bin 
  2. export ANDROID_PRODUCT_OUT=/home/ryan/android4.0-source/android-4.0.3_r1/out/target/product/generic 
  3. cd /home/ryan/android4.0-source/android-4.0.3_r1/out/target/product/generic 
  4. chmod -R 777 * 
  5. emulator -system system.img -data userdata.img -ramdisk ramdisk.img -kernel /home/ryan/android4.0-source/android-4.0.3_r1/prebuilt/android-arm/kernel/kernel-qemu-armv7 

模拟器运行需要四个文件,分别是Linux Kernel镜像zImage和Android镜像文件system.img、userdata.img和ramdisk.img。执行emulator命令时,如果不带任何参数,则Linux Kernel镜像默认使用~/Android/prebuilt/android-arm/kernel目录下的kernel-qemu文件,而Android镜像文件则默认使用ANDROID_PRODUCT_OUT目录下的system.img、userdata.img和ramdisk.img,也就是我们刚刚编译出来的镜像问题。

当然,我们也可以以指定的镜像文件来运行模拟器,即运行emulator时,即:

emulator -system system.img -data userdata.img -ramdisk ramdisk.img -kernel /home/ryan/android4.0-source/android-4.0.3_r1/prebuilt/android-arm/kernel/kernel-qemu-armv7 

到这里,我们就可以在模拟器上运行我们自己编译的Android镜像文件了,是不是很酷呢?但是注意,这里说的Android镜像文件,只是包括system.img、userdata.img和ramdisk.img这三个文件,而Linux Kernel镜像用的是Android为我们预编译好的kernel-qemu镜像。那么,有没有办法使用我们自己编译的Linux Kernel镜像呢?答案上肯定的,这样我们就可以完全DIY自己的Android系统了!我将在下一篇文章描述如果编译自己的Linux Kernel镜像,敬请期待~