Android源码的下载和编译

先把空间的文章,转过来一篇。

在下载和编译Android源码之前,请确保满足以下需求:
1. 系统要求linux或者MAC,在windows下也可以通过虚拟机方式支持编译,但不支持直接windows建议采用Ubuntu。
2. 2.3及以上版本需要64位环境,32位系统上可以编译相对较低的版本<2.3
3. 至少30G以上硬盘空间,建议在100G以上。源代码大概在8.5G.
4. Python 2.6-2.7
5. GNU Make3.81-3.82
6. JDK 6或以上版本
7. Git1.7或以上版本

下面将一步步介绍如何下载源码并进行编译:dfad
第一步,安装ubuntu 12.04
老罗是在VMware下安装linux(
在Ubuntu上下载、编译和安装Android最新源代码  ) ,但我的电脑有些慢,用VMware就更慢了,所以双系统安装Ubuntu。
以下灰色是不要关注:
问同事哥们,现在ubuntu双系统的安装方式很贴心,就像在在windows下安装应用程序样,安装Ubuntu。
1. 下载ubuntu的安装程序 wubi . 别认为是五笔输入法,是安装程序;
2. 直接运行wubi程序,果然很简单,在界面是会提示安装路径,其后点下一步,就会直接下载Ubuntu的安装包,我下载的ubuntu-12.04版本;
3. 下载的时间比较长,大概需要1个小时左右,慢慢等吧.。。。。;
4.  
下载完成之后,就可以进行解压,自动安装,等到重启就可以,开始用了。
5. 确认下系统的版本,system setting --> system --> detail --> over view,靠右面板上有OS type。偶的是64-bit.所以可以编译2.3以上的版本,哈哈。如果你是32-bit,那就只能<2.3.x 啦


开始使用wubi安装,但由于wubi安装最大的问题是空间只有30G,对Android来说小了。所以决定采用光盘直接安装;
1. 在Ubuntu的网站上下载中文版本的ubuntu 64位,写到光盘中;
2. 我选用一个160G的分区,其中linux分区如下,
  根挂载点:/  30G
  /Boot            150M
  Swap            3G
  /Home           余下全部用上
3. 安装之后重启,居然没有引导。解决:
  sudo fdisk -l #查看各分区。
  sudo -i
  mount /dev/sda7 /mnt //挂载根
  mount /dev/sda8 /mnt/boot // 挂载引导 (如果没 /boot 单独分区这步跳过)
  grub-install --root-directory=/mnt/ /dev/sda 
  reboot  
4.输入法
 sudo apt-get install ibus-table-wubi  //五笔
如果ibus消失的话
 killall ibus-daemon
 ibus-daemon -d
  第二步,设置linux的编译环境
选择源码的分支决定了你机器环境的配置,前面提到32位系统只能编译<2.3.x版本,所以你的机器很重要啊。
1. 安装JDK  由于SUN JDK不再在ubuntu的主要仓库中,为了能够下载它,你需要把合适的仓库加进来。
 
Java 6: for 大于等于2.3版本 
$ sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner" // 修改/etc/apt/sources.list
$ 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-java6-jdk
 //安装jdk6
 

Java 5: for 小于2.3版本
$ sudo apt
-get install sun-java5-jdk
 

我用jdk6吧。  
注意:安装过程中,会出现“正在设定 sun-java6-jre"时,就按tab,变红按钮后确定。接受协议时,也是如此。

在jdk包安装完成之后,试下java -version,确保正确安装。

2. 安装ubuntu必要的包(ubuntu 12.04)
  在Ubuntu 12.04上仅尝试支持编译,并不能保证在分支和最新代码上能成功;
  
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
 
安装全部库时libc6-dev:i386错误
$sudo apt-get install linux-libc-dev:i386
$sudo  apt-get install libc6-dev:i386   
再执行前面的更新。
 

$ sudo ln -/usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so
 

3. 配置USB访问(如果先在模拟器上运行,暂不做)
  在GNU/linux系统下,一般用户不能通过defaul的方式,需要配置其驻允许访问。推荐的方法是root权限建一个文件 /etc/udev/rules.d/51-android.rules,然后用下面的代码替换,其中<username>换成被授权访问手机.
# adb protocol on passion (Nexus One)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e12", MODE="0600", OWNER="<username>"
# fastboot protocol on passion (Nexus One)
SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", ATTR{idProduct}=="0fff", MODE="0600", OWNER="<username>"
# adb protocol on crespo/crespo4g (Nexus S)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e22", MODE="0600", OWNER="<username>"
# fastboot protocol on crespo/crespo4g (Nexus S)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e20", MODE="0600", OWNER="<username>"
# adb protocol on stingray/wingray (Xoom)
SUBSYSTEM=="usb", ATTR{idVendor}=="22b8", ATTR{idProduct}=="70a9", MODE="0600", OWNER="<username>"
# fastboot protocol on stingray/wingray (Xoom)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="708c", MODE="0600", OWNER="<username>"
# adb protocol on maguro/toro (Galaxy Nexus)
SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", ATTR{idProduct}=="6860", MODE="0600", OWNER="<username>"
# fastboot protocol on maguro/toro (Galaxy Nexus)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e30", MODE="0600", OWNER="<username>"
# adb protocol on panda (PandaBoard)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d101", MODE="0600", OWNER="<username>"
# fastboot protocol on panda (PandaBoard)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d022", MODE="0600", OWNER="<username>"
# usbboot protocol on panda (PandaBoard)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d00f", MODE="0600", OWNER="<username>"
# usbboot protocol on panda (PandaBoard ES)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d010", MODE="0600", OWNER="<username>"
# adb protocol on grouper/tilapia (Nexus 7)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e42", MODE="0600", OWNER="<username>"
# fastboot protocol on grouper/tilapia (Nexus 7)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e40", MODE="0600", OWNER="<username>"
# adb protocol on manta (Nexus 10)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee2", MODE="0600", OWNER="<username>"
# fastboot protocol on manta (Nexus 10)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee0", MODE="0600", OWNER="<username>"
以上设置在Ubuntu 8.04/10.04上确认没问题,在更高版本上不能保证。

3. 设置Ccache 
安装 
可以选择性的告诉编译器使用Ccache工具,它能够加速rebuild,如果你经常使用"make clean"的话,将非常有用。
sudo apt-get install ccache
 
把下面一句加到.bashrc中。
export USE_CCACHE=1
建议cache大小为50G-100G,在下载源码之前先执行下面的语句。
ccache -M 50G  

第三步,下载Android源码
1. 安装repo 在home目录下建个bin目录.
 

$ mkdir ~/bin
$ PATH=~/bin:$PATH


$ curl  http://git-repo.googlecode.com/files/repo-1.19 > ~/bin/repo 
$ chmod a
+ ~ /bin/ repo

2. 新建一个工作目录Android,用于存放代码
mkdir Android

cd Android
下载全部代码,

$ repo init  - u https : //android.googlesource.com/platform/manifest
下载特定分支

repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1 //下载4.0.1
repo init -u https://android.googlesource.com/platform/manifest -b android-2.3.1_r1 //
repo sync
中间需要输入用户名和邮件地址,自个随便输入一个。
 3. 等待,
如果中间出现死机后,再重启不能进入XWindow,则进入recovery模式后,r
sudo apt-get install xserver-xorg
startx

第四步,编译
通过envsetup.sh脚本初始化环境
$ source build/envsetup.sh
选择编译目标版本,目标有多种类型
$ lunch full-eng 
编译源码,
$ make -j4
编译过程,可能出现若干问题:

1. <命令行>:0:0: 错误: “_FORTIFY_SOURCE”重定义 [-Werror]
修改build/core/combo/HOST_linux-x86.mk 61行,将
HOST_GLOBAL_CFLAGS += -D_FORTIFY_SOURCE=0
修改成
HOST_GLOBAL_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0
2. In file included from external/oprofile/libpp/arrange_profiles.cpp:24:0:
external/oprofile/libpp/format_output.h:94:22: 错误: reference ‘counts’ cannot be declared ‘mutable’ [-fpermissive]
解决办法: 
external/oprofile/libpp/format_output.h 
把: 
mutable counts_t & counts; 
改为: 
counts_t & counts; 

3.external/gtest/src/../include/gtest/internal/gtest-param-util.h:122:11:错误: ‘ptrdiff_t’不是一个类型名
In file included fromexternal/gtest/src/../include/gtest/gtest-param-test.h:157:0,
解决方法:

$vim external/gtest/include/gtest/internal/gtest-param-util.h
#include <cstddef>

4:undefined reference to `pthread_mutexattr_destroy'
host C++: libgtest_host <= external/gtest/src/gtest-all.cc

解决方法:
$vi external/llvm/llvm-host-build.mk
LOCAL_LDLIBS := -lpthread -ldl

5. error: variable ‘ParamName’ set but not used [-Werror=unused-but-set-variable]
frameworks/compile/slang/slang_rs_export_foreach.cpp:247:23: error: variable ‘ParamName’ set but not used [-Werror=unused-but-set-variable]
cc1plus: all warnings being treated as errors
解决方法:
$ vi frameworks/compile/slang/Android.mk 
#local_cflags_for_slang := -Wno-sign-promo -Wall -Wno-unused-parameter -Werror
local_cflags_for_slang := -Wno-sign-promo -Wall -Wno-unused-parameter  

第五步,运行

编译生成的emulator位于~/Android/4.0.1/out/host/linux-x86/bin,在home/.bashrc下加入环境变量:

PATH=$PATH:~/Android/4.0.1/out/host/linux-x86/bin;

export PATH

~/Android$ emulator
是不是看到模拟器起来了。热泪盈眶哈
 
(from luo). 
 
模拟器运行需要四个文件,分别是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时,即:
    USER-NAME@MACHINE-NAME:~/Android$  emulator -kernel ./prebuilt/android-arm/kernel/kernel-qemu -sysdir ./out/target/product/generic -system system.img -data userdata.img -ramdisk ramdisk.img
    到这里,我们就可以在模拟器上运行我们自己编译的Android镜像文件了,是不是很酷呢?但是注意,这里说的Android镜像文件,只是包括system.img、userdata.img和ramdisk.img这三个文件,而Linux Kernel镜像用的是Android为我们预编译好的kernel-qemu镜像。那么,有没有办法使用我们自己编译的Linux Kernel镜像呢?答案上肯定的,这样我们就可以完全DIY自己的Android系统了!我将在下一篇文章描述如果编译自己的Linux.

总结


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值