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

article/2025/8/24 19:25:35

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

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


配置虚拟机

首先是搭建下载源码的环境,官方推荐是使用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结果各种问题),CPU核数为2核(核数多的话之后的编译速度会快很多)。

注意:

1.VMware默认为动态分配磁盘空间,所以不一定在创建的时候就要有200G的磁盘空间,但由于之后编译安卓源码需要占用很大空间(我编译完成后源码目录是35G),所以请大家预留足够的空间。

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. 

总结

本人从开始下载到下载成功总共花了两天多的时间,其中误删除数据重新下载一次,Ubuntu系统崩溃一次。网速好的话(本人在教育网,不需要开VPN),实际下载过程大概半天左右,最后下载完虚拟机共29.36G,估计下载的数据有15G左右,加上配置环境总共花费流量20G左右。
下载完成的效果见截图:


其他问题

1. 重新启动虚拟机之后有可能会出现repo命令出错:
No command 'repo' found, did you mean:Command 'rep' from package 'rep' (universe)Command 'repl' from package 'nmh' (universe)Command 'repl' from package 'mailutils-mh' (universe)
repo: command not found
出现这个错误的话,建议将~/bin目录下的repo文件夹删除,重新安装repo。注意,不是将安卓源码目录下的.repo文件删除,否则就需要重新下载之前下过的源码!本人就曾经误删除过.repo文件导致所有文件都要重新下载。

2.安装其他必需的包时候遇到错误:
E: Sub-process /usr/bin/dpkg returned an error code (1)
执行:
cd /var/lib/dpkg 
sudo mv info info.bak 
sudo mkdir info
再次运行命令,遇到错误:
Errors were encountered while processing:libc6-dev:i386
E: Sub-process /usr/bin/dpkg returned an error code (1)
执行:
apt-get install linux-libc-dev:i386
apt-get install libc6-dev:i386
最后再次运行安装其他必需包命令,就没有错误了

3.如果中间出现类似以下错误的话:
error: Failed connect to android.googlesource.com:443; Connection timed out while accessing https://android.googlesource.com/a/platform/sdk/info/refs
fatal: HTTP request failed
可以尝试ping一下android.googlesource.com,如果ping不通的话,可以修改hosts。方法为,在终端中输入:
sudo gedit /etc/hosts
在host文件中增加以下内容:
74.125.31.82 www.googlesource.com  
74.125.31.82 android.googlesource.com  
203.208.46.172 cache.pack.google.com
59.24.3.173 cache.pack.google.com
注意,一定要检查该域名是否能ping通,ping不通的话再改,本人就是本来能ping通的,改完就出错了

4.下载过程中出错:
error: gnutls_handshake() failed: A TLS packet with unexpected length was received. while accessing https://android.googlesource.com/a/platform/packages/screensavers/WebView/info/refs
fatal: HTTP request failed

5.关闭Ubuntu虚拟机之后无法启动系统
本人就曾经遇到过这个问题,还是在基本下载完成的时候,眼看着就要重新下载了,一个师兄给我提供了解决方案,真是山重水复疑无路,柳暗花明又一村啊。可以新建一个虚拟机,将旧的虚拟机作为硬盘挂载到新的虚拟机上。再将旧虚拟机上的安卓源码目录复制到新的虚拟机上,继续执行脚本下载即可。

6.下载结束时出错:
error: frameworks/base/: platform/frameworks/base checkout 
4b77609a983b08f163853df2a77e1d535d684aec 
进入到frameworks/base目录,执行:
git reset --hard

7.下载过程中出错:
Fetching projects:   0% (1/363)  Fetching project platform/hardware/samsung_slsi/exynos5
fatal: Invalid gitfile format: /home/zhaoxy/develop/.repo/repo/.git/clone.bundle
fatal: The remote end hung up unexpectedly 
再次repo sync即可

8.下载结束时出错:
fatal: Unable to create '/home/zhaoxy/develop/system/media/.git/index.lock': Permission denied
是由于中间本人更换过虚拟机引起的权限问题,执行以下命令修复文件所有者及权限即可:
sudo chgrp -R zhaoxy /home/zhaoxy/develop
sudo chmod -R g+w /home/zhaoxy/develop


之后遇到问题会持续补充。
编译过程见下一篇博文《 安卓系统源码编译系列(二)——安卓系统源码编译教程》
下载完成一个版本的源码后,如果需要下载其他版本的源码,可以见《 安卓系统源码编译系列(三)——常用命令》

如果大家觉得对自己有帮助的话,还希望能帮顶一下,谢谢:)
个人博客: http://blog.csdn.net/zhaoxy2850
本文地址: http://blog.csdn.net/zhaoxy_thu/article/details/12657265
转载请注明出处,谢谢!


http://chatgpt.dhexx.cn/article/oP7mb4BQ.shtml

相关文章

【Android】系统源码下载及编译

源码及编译 步骤 1:创建一个空目录来存放源码: mkdir aosp cd aosp步骤 2:获取最新版本的 repo 并签出 android-8.1.0_r1 分支: repo init -u https://android.googlesource.com/platform/manifest -b android-8.1.0_r1其中&am…

Android源码下载编译(高通)

0 前言 本文介绍如何下载高通平台的Android源码,然后进行编译。 相关:《Android源码下载&编译(TI)》 1 安装工具 下载Android源码需要git,repo等工具,启动repo是Google写的一个专门用于下载Android源码…

Window下载Android源码

Android 10源码下载 想要研究Android 源码的同学可以用此方法进行下载。源码从清华大学开源软件镜像站(https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/)下载。 使用Linux的同学直接参照清华镜像站提供的使用帮助(https://mirrors.tuna.tsinghua.edu…

下载安卓源码

安卓内核源码下载教程 准备环境如何选择你想要下载的版本ubuntu环境配置 准备环境 Ubuntu 18.04 安装 最好是用这个版本或者高于这个版本的,低版本的有一些环境问题可能会让你很难受我使用的是VMware Workstation 16 ProPixel 3 XL、Pixel 3、Pixel 2 XL、Pixel 2、Pixel XL、…

Android13源码下载及全编译流程

一、源码下载 1.1、配置要求 官方推荐配置请参考:https://source.android.google.cn/docs/setup/start/requirements?hlzh-cn,重点有如下几项: 1.1.1、硬件配置要求 1、内存至少 16GB,实测建议至少 32G。 2、磁盘至少 250GB&am…

Java 工厂设计模式

简介 工厂设计模式在java中有大量的应用,如spring框架,这种类型的设计模式属于创建型模式。在工厂设计模式中,创建逻辑不会对客户端暴露,可以通过一个对外接口创建所需对象。 工厂模式使用场景 需要频繁创建对象且这些对象多处…

简单工厂设计模式

简单工厂设计模式 刚开始学设计模式,犹如刚睁开眼看世界的孩子,满眼都是惊奇,原来代码的世界可以如此的精彩纷呈.当然这些都是前辈智慧的结晶.简单工厂设计模式是接触的第一个设计模式,看完后更多的是不懂和迷糊.不过相信慢慢会懂得其精髓的. 简单工厂设计模式是创建型(就是把对…

Java工厂设计模式详解

前言 工厂设计模式在开发过程中有大量的运用,不管是spring框架,还是诸多的中间件,都有着工厂设计模式的体现 比如,手机生产工厂,当提供了相关生产手机的原材料,工厂就可以按要求生产出手机 工厂模式介绍 …

Android工厂设计模式(简单工厂,工厂方法,抽象工厂,BitmapFactory简单工厂分析,Retrofit抽象工厂分析)

文章目录 创建型设计模式(简单工厂,工厂方法,抽象工厂)一.简单工厂模式引出简单工厂模式 二.工厂方法模式三.抽象工厂模式 Android源码中用到的工厂模式举例一.BitmapFactory 源码工厂模式详解(简单工厂)二.Retrofit的工厂模式(抽象工厂) 创建型设计模式…

工厂设计模式有什么用?

工厂方法是非常古老且常用的设计模式。原因主要是一个系统要运转起来一定会涉及到对象的实例化过程,如果对象的实例化分散在各种逻辑代码之间,那么就会非常零乱、难以维护,bug自然也多。 工厂方法的出现解决的就是对象创建的问题&#xff0c…

Java中的工厂设计模式

引出工厂模式 package www.java.test;interface Computer{void printComputer(); } class MacbookPro implements Computer{Overridepublic void printComputer() {System.out.println("This is a MacbookPro");} } class SurfaceBook implements Computer{Override…

Java工厂设计模式

工厂设计模式 一、面向对象的设计原则1.1 OCP(开闭原则,Open-Closed Principle)1.2 DIP(依赖倒转原则,Dependence Inversion Principle)1.3 LOD(迪米特法则,Law Of Demeter&#xff…

设计模式—工厂设计模式

工厂设计模式 1.概述2.简单工厂模式2.1 结构2.2 实现2.3 优缺点2.4 扩展 3.工厂方法模式3.1 概述3.2 结构3.3 实现3.4 优缺点 4.抽象工厂模式4.1 概述4.2 结构4.3 实现4.4 优缺点4.5 应用场景 5.扩展模式5.1 第一步:定义配置文件5.2 改写工厂类 6.JDK源码解析—Coll…

工厂设计模式 - 详解

介绍 工厂模式是Java中最常用的设计模式之一,这种类型的设计模式数据创建型模式。 主要就是负责创建对象的,当我们使用new创建对象的时候会导致对该对象的耦合性很严重,当我们需要修改的时候需要对所有new的对象进行修改,违反了软…

【iOS】—— 工厂设计模式

工厂设计模式 文章目录 工厂设计模式设计模式概念设计模式七大准则开闭原则单⼀职责原则里氏替换原则依赖倒转原则接口隔离原则迪米特法则合成复用原则 类族模式简单工厂模式优点缺点主要作用示例文件分类实现效果: 工厂方法模式优点缺点主要作用:示例&a…

【设计模式】工厂模式(Factory Pattern)

1. 概述 工厂模式(Factory Pattern)是最常用的设计模式之一,它属于创建类型的设计模式。它提供了一种创建对象的最佳方式,在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过一个共同的接…

设计模式之工厂模式,史上最强,不服来辩!

设计模式是对大家实际工作中写的各种代码进行高层次抽象的总结,如果设计模式没学会,抽象能力肯定就不会太强。常见的设计模式有 23 种,今天我们只聊最简单的工厂模式。 工厂模式是属于创建型模式的,通过工厂获取一个一个的新对象。…

工厂设计模式

1、概念 工厂模式分三种:简单工厂模式、工厂方法模式、抽象工厂模式 简单工厂模式(Simple Factory Pattern):属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实例&#xf…

设计模式之工厂模式(factory pattern)

工厂顾名思义就是创建产品,根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式,根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式。该模式用于封装和管理对象的创建,是一种创建型模式。本文从一个具体的例子逐步深入分析,来体会三种工厂模式的应用场景和…

sqlserver2008的SSMS连接sqlserver2016的时候提示‘索引超出了数组界限。’

解决:打sp3补丁。 http://www.microsoft.com/en-us/download/details.aspx?id44271