安卓系统源码编译系列(一)——下载安卓系统源码教程

  • A+
所属分类:学习教程 实用技巧

最近需要编译安卓系统,咨询了一个编译过安卓系统的朋友,说是下载源码就得下载两天,于是做好了长期抗战的准备,开始了下载安卓源码的旅程。在刚开始下载时,可以参照的内容只有官方教程,于是跟着官方教程一步一步走,遇到问题就百度谷歌,结果发现自己因为经验不足走了很多弯路,写下这篇教程是为了让以后打算下载安卓源码的朋友提供一些建议和思路。本篇教程会不断更新,力求弥补其他教程的不足并覆盖所有问题,希望大家看完本教程后可以一次性下载成功!

同时,也欢迎大家将遇到的问题以及解决方案告诉我,一起完善这个教程。

滴水穿石

安卓系统源码编译系列(一)——下载安卓系统源码教程

最近需要编译安卓系统,咨询了一个编译过安卓系统的朋友,说是下载源码就得下载两天,于是做好了长期抗战的准备,开始了下载安卓源码的旅程。在刚开始下载时,可以参照的内容只有官方教程,于是跟着官方教程一步一步走,遇到问题就百度谷歌,结果发现自己因为经验不足走了很多弯路,写下这篇教程是为了让以后打算下载安卓源码的朋友提供一些建议和思路。本篇教程会不断更新,力求弥补其他教程的不足并覆盖所有问题,希望大家看完本教程后可以一次性下载成功!

同时,也欢迎大家将遇到的问题以及解决方案告诉我,一起完善这个教程。

配置虚拟机

首先是搭建下载源码的环境,官方推荐是使用64位的Ubuntu,版本是12.04。如果使用Mac OSX的话,编译的时候还需要解决大小写问题,所以建议使用Ubuntu系统。另外由于之后还要编译源码,进行各种配置,所以建议配置一个虚拟机。本人使用的是Mac OSX Mountain Lion 10.8.5系统,VMware 5.03,使用的Ubuntu镜像是ubuntu-12.04-desktop-amd64.iso。

安装完VMware之后,下载好Ubuntu之后就可以开始配置虚拟机了,由于之后还要编译安卓系统,建议大家配置虚拟机磁盘空间为200G,内存为2G(建议是2G以上,本人曾经用1G结果各种问题)。

注意:

1.VMware默认为动态分配磁盘空间,所以不一定在创建的时候就要有200G的磁盘空间,但由于之后编译安卓源码需要一百多个G(具体等我编译完会告诉大家),所以请大家预留足够的空间。

2.虽然VMware支持动态增加磁盘空间,但请一次性分配200G,避免之后空间不够用。本人第一次下载源码的时候就只分配了20G,结果下载到一半提示空间不足。关闭虚拟机扩展磁盘空间之后,开机就再也无法进入系统了,只能通过新建虚拟机再挂载的形式恢复数据,所以请大家谨记。

3.由于下载或者编译源码中间可能会与外部系统有交互,方便起见,建议大家安装VMware Tools,可以自由复制以及进行文件共享。

配置下载源码环境

接下来是配置下载源码的环境,先看看官方网站上的要求:

  • Python 2.6 -- 2.7, which you can download from python.org.
  • GNU Make 3.81 -- 3.82, which you can download from gnu.org,
  • JDK 6 if you wish to build Gingerbread or newer; JDK 5 for Froyo or older. You can download both fromjava.sun.com.
  • Git 1.7 or newer. You can find it at git-scm.com.

Python、GNU Make都是Ubuntu12.04自带的,而且版本都符合要求,所以不用管。下面就需要安装JDK,官网提供的步骤是:

$ sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"
$ sudo apt-get update
$ sudo apt-get install sun-java6-jdk

但是按照该步骤可能会报错如下:

Package sun-java6-jdk is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source
E: Package sun-java6-jdk has no installation candidate

网上给出了两种解决办法,第一种是:

sudo add-apt-repository ppa:ferramroberto/java
sudo apt-get update
sudo apt-get install sun-java6-jdk

第二种是:

1. 在终端输入:sudo gedit /ect/apt/sources.list文件
2. 在sources.list最后添加一行
deb http://us.archive.ubuntu.com/ubuntu/ hardy multiverse
3. 保存关闭gedit
4. 运行 sudo apt-get update
5. 再次运行sudo apt-get install sun-java6-jdk。

但很不幸的是,以上两种方法对本人都无效,所以无奈之下,只得手动 下载jdk进行安装。如果大家的情况和我一样,建议手动安装,安装步骤可以参见 这篇文章。安装完JDK后,再安装Git:

sudo apt-get install git

最后配置一下其他必需的包:

$ 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
$ sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so

官网上教程中的Configuring USB Access好像用不着,Setting up ccache和Using a separate output directory都是编译的时候用的。

安装下载源码的工具

由于安卓的源码很大而且很多,所以需要用到一个下载工具repo,可以直接按照官网的步骤:

$ mkdir ~/bin
$ PATH=~/bin:$PATH
$ curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo

安装完下载工具之后,可以创建一个存放源码的目录,这里用WORKING_DIRECTORY代替:

$ mkdir WORKING_DIRECTORY
$ cd WORKING_DIRECTORY

下载源码

现在万事俱备,只欠东风了。我们即将开始下载安卓系统源码。首先可以在这里选择要下载的安卓版本,例如本人选的是android-4.3_r2.3。

根据官网的说明,如果下载最新版本可以直接输入:

$ repo init -u https://android.googlesource.com/platform/manifest

指定版本可以输入:

$ repo init -u https://android.googlesource.com/platform/manifest -b android-4.3_r2.3

这个过程中会提示你输入名字和邮箱,名字随意,邮箱建议输入gmail的邮箱。最后执行:

$ repo sync

即可开始下载。需要说明的是,repo支持断点续传,如果中间下载中断了或者出错了,可以再次执行repo sync来继续下载。

但是先不要急,由于下载过程还会遇到各种各样的问题,所以请大家稍安勿躁,再做一些准备工作,首先我们需要创建一个自动下载脚本,确保出错了之后会自动执行repo sync,可以省掉我们很多重复劳动。脚本如下:

#!/bin/bash    
echo "======start repo sync======"    
../bin/repo sync    
while [ $? == 1 ]; do    
echo "======sync failed, re-sync again======"    
sleep 3    
../bin/repo sync    
done    

将以上脚本放入一个sh文件中(例如dw.sh),在终端中cd到该脚本的目录下,运行以下命令即可:

sudo sh ./dw.sh

需要注意的是,这个脚本并不能解决下载中间卡住的问题,如果在一个地方卡住超过10分钟以上,建议ctrl+z停掉以后重新运行脚本。本人就曾经第二天早上起来发现还卡在前天晚上的位置。

接下来,我们需要再增加一个验证。由于访问都是匿名的,为了防止连接过多,谷歌对同一个ip的访问次数进行了限制。

用浏览器登录https://android.googlesource.com/new-password,输入谷歌账号,点击允许访问,会进入一个信息页面,里面可以得到类似以下内容:

machine android.googlesource.com login git-jacky.rg4.net password 1/dkRiGEvvC8o8Pgg-GsM2AbMNS_32-U0Pf0_VWkYogIA   
machine android-review.googlesource.com login git-jacky.rg4.net password 1/dkRiGEvvC8o8Pgg-GsM2AbMNS_32-U0Pf0_VWkYogIA

在~(/home/username/.netrc)目录下创建一个.netrc文件,将以上两行内容粘贴进去,保存。

repo init的时候地址需要加上/a

repo init -u https://android.googlesource.com/a/platform/manifest

需要注意的是,这两行内容每次登录有可能得到的不一样,但似乎不会有差别。

下载输出说明

下面对下载过程中终端的输出做一个说明,由于安卓源码是由很多个子工程组成的,repo会依此对各个工程调用命令下载。每次终端输出Fetching project则说明开始一个工程的下载,后面跟的是该工程的名称。每下载完几个工程,终端会输出Fetching projects则说明已经下载完成若干工程,后面跟的是当前进度,如92%(334/362)说明总共有362个工程,目前下载到334个,进度是92%。中间如果出现error: The requested URL returned error: 403 while accessing https://...,则说明下载该工程时服务器没有响应,不会有什么影响,只要下次同步的时候该工程不出错就行。最后下载完成会同步整个工程目录,出现以下两行内容时,则说明下载成功。

Fetching projects: 100% (362/362), done.  
Syncing work tree: 100% (362/362), done. 

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: