首页
论坛
课程
招聘
[原创]记一次安卓系统源码下载过程。
2017-6-10 21:31 11593

[原创]记一次安卓系统源码下载过程。

2017-6-10 21:31
11593

最近买了个Nexus 5 手机准备学习android4.4.4源码。Nexus 5 刷入从第三方下载的ROM后,总是推送各种第三方APP,于是自己打算下载编译一次官方的源码。小白的学习记录过程分享,大神勿喷,请忽略。 Google官方的教程:https://source.android.com/source/initializing

一、编译环境搭建

1.官方推荐环境介绍

关于Android各个版本的编译环境的搭建,大家可以参考我去年翻译的Android 官方文档http://blog.csdn.net/u012417380/article/details/51472860。我目前打算用VM虚拟机编译Android 4.4.4  版本,它官方要求的具体环境是:
硬件环境

  • 64 位系统环境编译(2.3及2.3系统上都是64位环境)
  • 至少100GB的磁盘空间用于校验。单个版本编译需要150GB磁盘空间,多版本编译需要200GB以上成磁盘空间
  • 如果在虚拟机上运行 Lunix,至少需要 16GB的RAM/swap空间。

注:上述环境是官方以最新版本为要求的环境。我打算用VM 虚拟机运行Lunix编译,目前的方案是 动态分配硬盘大小为150G,内存分配 4GB,交换空间分配8GB。
软件环境
1.操作系统
Linux:
Android 2.3.x (Gingerbread) - Android 5.x (Lollipop): Ubuntu 12.04 (Precise)  
2. Java Development Kit (JDK)
Android 2.3.x (Gingerbread) - Android 4.4.x (KitKat): Ubuntu - Java JDK 6, Mac OS - Java JDK 6
3. Key packages
Python 2.6 – 2.7 下载官网 python.org
GNU Make 3.81 – 3.82 下载官网:gnu.org ; Android 4.0.x (Ice Cream Sandwich) 以及之前的版本需要 使用 maker 3.81 来避免编译错误。
Git 1.7 + 下载官网 git-scm.com

2.本地编译环境搭建

1.用VMare 12.0   创建Linux虚拟机。

虚拟机:动态分配硬盘大小为150G,内存分配 4GB,交换空间分配8GB。
操作系统:ubuntu-12.04.5-desktop-amd64.iso
这里写图片描述
安装成功后安装VM Tools,这里不介绍

2.安装java JDK 1.6

jdk版本:jdk-6u45-linux-x64.bin
详细安装及环境变量配置参考我这篇博文: Ubuntu 下JDK的安装与环境配置

3.安装依赖的其它包

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

4.配置 USB 使用权限

如果在乌班图系统下编译后,并用USB数据线进行对NEXUS 5 刷机,那么默认情况下普通用户无法直接使用 USB 设备。需要以root用户身份在‘/etc/udev/rules.d/51-android.rules’下创建一个文件。
为此,请运行以下命令来下载本网站附带的 51-android.txt 文件,对其进行修改以包含您的用户名,然后将其放到正确位置

//51-android.txt

# 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>"# adb protocol on panda (PandaBoard ES)SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="d002", 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>"# adb protocol on hammerhead (Nexus 5)SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee1", MODE="0600", OWNER="<username>"

下面的的命令会自动下载51-android.txt 文件,对文件中<username>字段替换成你的用户名,并将文件放在/etc/udev/rules.d/51-android.rules文件文件中

$ wget -S -O - http://source.android.com/source/51-android.txt | sed "s/<username>/$USER/" | sudo tee >/dev/null /etc/udev/rules.d/51-android.rules
$ sudo udevadm control --reload-rules

如果显示拒绝连接无法下载的话,将51-android.txt文件放在本地目录任意一目录,在该目录中执行下面的命令。

$  cat 51-android.txt | sed "s/<username>/$USER/" | sudo tee >/dev/null /etc/udev/rules.d/51-android.rules
$  sudo udevadm control --reload-rules

执行完后,为了验证NEXUS 5 与乌班图是否连接,将nexus 5的USB计算机连接方式设置为相机,可以看到乌班图能够识别设备了。
这里写图片描述
这里写图片描述

5.配置单独的输出目录。

默认情况下,每次编译的输出都会存储在相应源代码树的 out/ 子目录下。如果将源文件和输出存储在单独的存储卷中,编译速度会更快。
要进行这项设置,请导出 OUT_DIR_COMMON_BASE 变量,使其指向将存储输出目录的位置。

$ export OUT_DIR_COMMON_BASE=<path-to-your-out-directory>

对于每个单独的源代码树,其输出目录都将以其存放目录命名。
例如,如果您有源代码树 /source/master1 和 /source/master2,并且 OUT_DIR_COMMON_BASE 设为了 /output,那么输出目录将为 /output/master1 和 /output/master2。这个过程后续会验证

3 下载系统源码

安卓系统源码放在git仓库中

1.安装Repo

repo 是安卓环境下的命令行工具,对Git部分命令进行封装,将 百多个git库进行更新。
按照如下步骤进行安装Repo.

1.确定你的主目录(home)下有bin目录,并且bin目录变量在你的path环境变量中:

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

2.下载Repo tool,并且确保它是可执行的。

$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo$ chmod a+x ~/bin/repo

初始化 Repo 客户端

当你安装完Repo后,设置安卓源码仓库的客户端:

1.创建一个存放安卓源码的空目录

$ mkdir WORKING_DIRECTORY
$ cd WORKING_DIRECTORY

由于我下载的版本是 Android4.4.4_r1所以将WORKING_DIRECTORY替换成Android444_r1:
这里写图片描述
即:

aosp444@aosp444-virtual-machine:~$ mkdir Android444_r1
aosp444@aosp444-virtual-machine:~$ cd Android444_r1
aosp444@aosp444-virtual-machine:~/Android444_r1$

2.进入Android444_r1 目录,运行 repo init 来下载相应版本Android4.4.4_r1的源码:

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

由于google站无法访问,所以我选择了清华的下载源,用下面的命令下载

repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-4.4.4_r1

3.配置你的用户邮箱

repo  init 后,会提示你输入名字和邮箱, 两个我都是直接按的回车键,这时它默认将系统用户名和主机名 作为用户名和邮箱,接着我直接按了y,提示repo初始完。

$ git config --global user.name "Your Name"
$ git config --global user.email "you@example.com"

这里写图片描述

4.然后同步源码树

$ repo sync

接着就是漫长的等待,如果中间出现中断,只要重复该命令即可。
下载成功后提示:

Fetching projects: 100% (413/413), done.  
Checking out files: 100% (1179/1179), done.
Checking out files: 100% (2776/2776), done.ut files:  50% (1390/2776)   
Checking out files: 100% (44267/44267), done. files:   0% (441/44267)   
Checking out files: 100% (3628/3628), done.ut files:  35% (1305/3628)   
Checking out files: 100% (6683/6683), done.out files:   8% (568/6683)   
Checking out files: 100% (2438/2438), done.out files:  40% (976/2438)   
Checking out files: 100% (9389/9389), done.out files:  29% (2742/9389)   
Checking out files: 100% (50822/50822), done.t files:   4% (2060/50822)   
Checking out files: 100% (140/140), done.
Checking out files: 100% (10083/10083), done.t files:  13% (1340/10083)   
Checking out files: 100% (4307/4307), done.out files:   1% (64/4307)   
Checking out files: 100% (3494/3494), done.out files:  12% (422/3494)   
Checking out files: 100% (7954/7954), done.
Checking out files: 100% (580/580), done.g out files:  25% (145/580)   
Checking out files: 100% (1056/1056), done. out files:  48% (510/1056)   
Checking out files: 100% (11685/11685), done.ut files:   4% (578/11685)   
Checking out files: 100% (4093/4093), done. out files:  13% (546/4093)   
Checking out files: 100% (2501/2501), done. out files:  13% (336/2501)   
Checking out files: 100% (2619/2619), done. out files:  42% (1107/2619)   
Checking out files: 100% (1654/1654), done. out files:  10% (176/1654)   
Checking out files: 100% (3924/3924), done.
Checking out files: 100% (2570/2570), done. out files:  30% (790/2570)   
Checking out files: 100% (21973/21973), done.
Checking out files: 100% (8597/8597), done. out files:  44% (3802/8597)   
Checking out files: 100% (1532/1532), done. out files:  40% (620/1532)   
Checking out files: 100% (1690/1690), done. out files:  32% (557/1690)   
Checking out files: 100% (376/376), done.ng out files:   9% (37/376)   
Checking out files: 100% (108/108), done.
Checking out files: 100% (171/171), done.
Checking out files: 100% (175/175), done.ng out files:  43% (76/175)   
Checking out files: 100% (181/181), done.
Checking out files: 100% (135/135), done.
Checking out files: 100% (378/378), done.ng out files:   2% (8/378)   
Checking out files: 100% (109/109), done.
Checking out files: 100% (181/181), done.ng out files:  49% (90/181)   
Checking out files: 100% (2407/2407), done.
Checking out files: 100% (2482/2482), done.
Checking out files: 100% (2484/2484), done. out files:   0% (21/2484)   
Checking out files: 100% (182/182), done.
Checking out files: 100% (132/132), done.ng out files:  47% (63/132)   
Checking out files: 100% (50299/50299), done.
Checking out files: 100% (4864/4864), done.
Checking out files: 100% (4383/4383), done.
Checking out files: 100% (28/28), done.king out files:  46% (13/28)   
Checking out files: 100% (182/182), done.
Checking out files: 100% (1256/1256), done.
Checking out files: 100% (2951/2951), done. out files:  20% (606/2951)   
Syncing work tree: 100% (412/412), done.

这时可看到Android444r1文件夹下checkout出的代码:
这里写图片描述
checkout出的代码有9.4G
这里写图片描述
进入隐藏的 .repo目录,查看当前分支大小,有64G呢

这里写图片描述
如果想check out 其它分支代码,将工作目录下check out出的代码删除,保留隐藏的.repo 目录,重新初始化分支执行上述流程就行,这时会快很多。

总结起来就是太耗时间。进入考试月了,等考完试,计划再实战出 android 4.4.4.r1 系统编译篇、内核编译篇、内核反调试修改编译篇、以及ROM镜像和内核的刷机教程。小白的学习记录过程分享,大神不要喷呀。



【看雪培训】目录重大更新!《安卓高级研修班》2022年春季班开始招生!

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (19)
雪    币: 443
活跃值: 活跃值 (342)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
猫子 活跃值 2017-6-11 00:52
2
0
期待后续的教程
雪    币: 427
活跃值: 活跃值 (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cshcmq 活跃值 2017-6-11 07:32
3
0
不错不错
雪    币: 6
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
字母姐 活跃值 2017-6-11 08:32
4
0
好像jdk得1.7
雪    币: 9425
活跃值: 活跃值 (594)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
无边 活跃值 2017-6-11 12:15
5
0
/  只分了15G,还把android放到~/,确定够用吗
雪    币: 146
活跃值: 活跃值 (91)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
倔强石头 活跃值 1 2017-6-11 13:56
6
0
无边 / 只分了15G,还把android放到~/,确定够用吗
/home  下挂了150G,整个androd都在home下
雪    币: 146
活跃值: 活跃值 (91)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
倔强石头 活跃值 1 2017-6-11 14:07
7
0
字母姐 好像jdk得1.7

   

雪    币: 2
活跃值: 活跃值 (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
prife 活跃值 2017-6-11 19:21
8
0
文章写的很不错,点个赞。
提几点小建议:
1.  ubuntu系统的分区方案总体合理,可以去掉/boot分区(这是早年Linux内核不稳定时才需要单独划分/boot),只要/、/swap、/home
2.repo脚本可以单独配置REPO_URL环境变量,可配置为清华的repo仓库,避免repo命令仓库无法拉取(所谓repo命令仓库指的是  .repo/repo)
3.  清华镜像还提供了每月更新包,可以下载更新包解压,之后使用repo  sync快速拉取。

最后想说的是:Android  O都要发布了。目前工业街基本都上Android7.0了,再搞4.4意义不大呀~
雪    币: 146
活跃值: 活跃值 (91)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
倔强石头 活跃值 1 2017-6-12 00:04
9
0
只是照着官方教程做了一遍,谢谢你的建议,又get到新知识了
雪    币: 62
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
技术那些事 活跃值 2017-6-12 14:48
10
0
雪    币: 62
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
技术那些事 活跃值 2017-6-12 14:54
11
0
你QQ是多少?
雪    币: 9795
活跃值: 活跃值 (945)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
马来 活跃值 2017-6-18 21:14
12
0
repo  init  -u  https://aosp.tuna.tsinghua.edu.cn/platform/manifest  -b  android-4.4.4_r1,小写的android
雪    币: 146
活跃值: 活跃值 (91)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
倔强石头 活跃值 1 2017-6-18 22:17
13
0
马来 repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-4.4.4_r1,小写的android
谢谢指出错误,已改正
雪    币: 431
活跃值: 活跃值 (69)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
ID蝴蝶 活跃值 1 2017-6-18 23:40
14
0
虚拟机需要这么大的硬盘空间?
雪    币: 443
活跃值: 活跃值 (342)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
猫子 活跃值 2017-7-4 22:29
15
0

配好环境重启后直接在开机界面进不去系统了,楼主有没有这种情况


雪    币: 31
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cccczzss 活跃值 2017-9-6 15:14
16
0
cccczzzzssss@ubuntu:~$  repo    init    -u    https://aosp.tuna.tsinghua.edu.cn/platform/manifest    -b    android-4.4.4_r1
fatal:  Cannot  get  https://gerrit.googlesource.com/git-repo/clone.bundle
fatal:  error  [Errno  101]  Network  is  unreachable
cccczzzzssss@ubuntu:~$ 
有没有遇到一样问题的 
雪    币: 402
活跃值: 活跃值 (23)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
星星当空照 活跃值 2017-10-12 10:55
17
0
mark。。。。
雪    币: 687
活跃值: 活跃值 (218)
能力值: ( LV9,RANK:240 )
在线值:
发帖
回帖
粉丝
sakura零 活跃值 4 2018-2-25 22:56
18
0
猫子 配好环境重启后直接在开机界面进不去系统了,楼主有没有这种情况
我遇到了,你解决了么
雪    币: 687
活跃值: 活跃值 (218)
能力值: ( LV9,RANK:240 )
在线值:
发帖
回帖
粉丝
sakura零 活跃值 4 2018-2-26 01:25
19
0
猫子 配好环境重启后直接在开机界面进不去系统了,楼主有没有这种情况
解决了。http://eternalsakura13.com/2018/02/24/bianyi/
我自己写了下编译过程……比这篇简单不少
雪    币: 443
活跃值: 活跃值 (342)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
猫子 活跃值 2018-2-26 21:32
20
0
sakura零 解决了。http://eternalsakura13.com/2018/02/24/bianyi/ 我自己写了下编译过程……比这篇简单不少
谢谢分享,  我也解决了,我是重装Ubuntu14系统,再按照官方的方法就可以了
最后于 2018-2-26 21:35 被猫子编辑 ,原因:
游客
登录 | 注册 方可回帖
返回