Android源碼下載與編譯

设置linux的编译环境
选择源码的分支决定了你机器环境的配置,前面提到32位系统只能编译<2.3.x版本,所以你的机器很重要啊。
1. 安装JDK  由于SUN JDK不再在ubuntu的主要仓库中,为了能够下载它,你需要把合适的仓库加进来。
 
Java 6: for 大于等于2.3版本
$ sudo add-apt-repository"debhttp://archive.canonical.com/ lucid partner" // 修改/etc/apt/sources.list
$ sudo add-apt-repository"debhttp://archive.ubuntu.com/ubuntu hardy main multiverse"
$ sudo add-apt-repository"debhttp://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 -s/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 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 + x ~ /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

Setp 3.从其他镜像获取源代码
   如果要下载最新的源代码,则执行:
  $ repo init -u git:// git.omapzoom.org /platform/manifest
    如果要获取每个tag,譬如2.3.5,则可以执行:
     $ repo init -u git:// git.omapzoom.org /platform/manifest -b android-2.3.5_r1
   如果你不知道具体的tag叫什么名字,那么可以在浏览器访问http://git.omapzoom.org,并点击上面的 /platform/manifest 链接,那么可以看到所有的tag名称.
    执行repo init过程中,可能需要填写一些个人信息,直接填写即可。
    配置好repo后,执行repo sync即可下载你所需要的源代码了。

    如果在最后一步调用repo sync,出现“fatal: '../platform/abi/cpp.git' does not appear to be a git repository”

      1、在存放android系统源代码的目录(也就是执行repo sync命令的目录)下,有个.repo的隐藏目录,用ls -a可以查看的到,进入该目录:cd .repo;

2、打开.repo目录下的manifest.xml文件(命令vim manifest.xml)并找到fetch属性,在我的文件中显示fetch="..",将fetch修改为fetch="git://git.omapzoom.org/",保存并退出;

3、继续repo sync就可以下载了。



第四步,编译
通过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、付费专栏及课程。

余额充值