MacOS X 下载编译Android 4.4.4源码(上)

因为公司产品的一个需求,迫不得已去了解了Android Framework开发和Rom修改定制,由此打开了一扇新世界的大门,找了很久的资料发现现有的文章对新手都不是特别友好,很多教程照着操作下去是死路一条,白白浪费了很多时间。跌跌撞撞的一周,得益于前辈们的无私分享才编译成功,所以记录一下全过程,为开源和分享尽绵薄之力,有些资料需要梯子,我用的是XX-Net


源码介绍

学习下载源码之前,我觉得新手应该对Android系统源码有一个基本的了解,这样可以理解下面的步骤是在做什么,为什么这么做,Android源码在10G-20G左右,一旦做错一步得不到你想要的结果,那可能一天的时间就白费了。

AOSP(Android Open-Source Project),是由谷歌发起的安卓开放源代码项目,三星、小米、锤子、华为的系统都是基于AOSP做的修改。整个AOSP项目是使用git进行管理的(不懂git?传送门),AOSP的整个项目下又分了Android 1.6到Android L所有的子项目,而且每个Android具体版本的项目下又分为上百个子项目,例如我下载的Android4.4.4-r2这个具体版本下面分为420多个子项目,这420个子项目每一个都是一个独立的git仓库,我们要做的就是要将这420个项目都用git clone这个命令给克隆下来,这时候有人就说了“这也太麻烦了吧,420个命令,而且谁知道这420个项目的git地址啊?”,你说的很对,这个时候万能的谷歌给我们提供的一个工具repo出场了。

repo这个工具主要的作用就是对这420多个项目的git地址、对应的版本分支(branch)以及克隆的git命令进行封装,也就是说克隆这420多个项目的命令代码它都帮你干了,我们只需要告诉它我们想要的Android版本即可,这么多信息都存在一个叫做manifest的git仓库里,所以重点来了:

我们要下载Android4.4.4的源码,就要先下载repo这个工具,然后在repo里面指定你要下载的Android4.4.4这个版本,然后repo会帮你把存有Android4.4.4所对应的420多个项目git信息的manifest下载下来,然后我们输入同步命令,repo就会帮我们把manifest中的所有项目都clone下来了。


环境搭建

1、系统要求

要下载编译不同Android版本的系统要求列表(以下为最低要求,高版本也可以编译,有问题解决掉就行了):

Android 6.0 以上要求:MacOS v10.10或以上,Xcode 4.5.2以上和命令行工具;
Android 5.x 要求:MacOS v10.8,Xcode 4.5.2以上和命令行工具;
Android 4.1.x - 4.3.x 要求:MacOS v10.6 或者 10.7,Xcode 4.2以上;
Android 1.5 - 4.0.x 要求:MacOS v10.5 或者 10.6,MacOSX v10.5 SDK;

2、修改文件限制

Mac系统对同时可以打开的文件格式做了限制,AOSP在编译的时候可能会超过这个限制,所以需要修改配置文件,.bash_profile是Mac下的环境变量配置文件,文件名以小数点开头则该文件是隐藏文件,在Finder中是看不到的。

在 /Users/xxx/目录下执行touch命令,作用是假如文件不存在则新建:

touch .bash_profile 

用vim打开.bash_profile文件,添加以下配置,不懂vim基本使用的传送门

# set the number of open files to be 1024 
ulimit -S -n 1024

3、硬盘分区

Mac的文件系统是不区分大小写的,按照google的说法“这种类型的文件系统可能导致git命令异常”,所以建议AOSP要在对大小写敏感的文件系统上编译和运行,打开应用程序中的磁盘工具—>文件—>新建映像—>空白映像:

这里的大小我建议在80G以上,看自己空闲硬盘的大小设置越多越好,原因后边会解释,格式则必须选择Mac OS扩展(区分大小写,日志式),储存后,双击储存位置的AOSP.dmg即可挂载该硬盘,如果这种方式创建或者修改硬盘大小失败的话,那就自行百度Mac下用命令对硬盘分区。

4、安装JDK

要下载编译不同Android版本JDK列表:

AOSP master 要求:OpenJDK 8
Android 5.x - Android 6.0:OpenJDK 7
Android 2.3.x - Android 4.4.x:Oracle JDK 6

更低版本的Google官网没有说明,其中的Oracle JDK6 因为Apple网站的原因经常打不开,这里提供一个云盘链接

Mac上安装多版本JDK需要配置环境变量,比如我安装了Oracle JDK6和OpenJDK8,在.bash_profile文件添加了以下几行:

#添加JDK的环境变量
export JAVA_6_HOME=/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
export JAVA_8_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_77.jdk/Contents/Home
#默认JDK1.8
export JAVA_HOME=$JAVA_8_HOME
#alias命令动态切换JDK版本
alias jdk6="export JAVA_HOME=$JAVA_6_HOME"
alias jdk8="export JAVA_HOME=$JAVA_8_HOME"

在需要使用相应版本JDK的时候,输入jdk6或者jdk8就可以自动切换了,配置路径的时候请到相应文件夹下检查路径对不对。

5、MacPort

一款方便在Shell模式下进行下载、安装、编译、更新的软件,下载传送门。安装完成后,检查环境变量中/opt/local/bin是否在/usr/bin之前,如果用vim打开的.bash_profile里面没有以上的配置,那就把下面这段配置写入.bash_profile文件:

export PATH=/opt/local/bin:$PATH

6、Xcode

由Apple公司开发的Mac下集成开发工具(IDE),在App Store中就能下载安装,这里要注意,经过实践发现,想要编译Android 4.4.4,Xcode必须到Apple开发者中心下载5.x或者6.x,下载地址,我安装的是Xcode 6.4,这里我测试了Xcode 8.x,编译的时候有个问题无法解决。

7、make、Git、GPG
make是C语言的构建工具,用来编译下载好的Android源码的;Git上面讲过了是AOSP的版本控制工具;GPG是一个加密、解密工具;请分别使用以下命令检测这三个软件是否已经安装及其版本:

make -version
git version
gpg --version

如果三个软件都没安装,用MacPort一起安装,将已安装的软件从下面的命令剔除即可:

 sudo port install gmake libsdl git-core gnupg

需要注意的是make3.8.2在构建Android4.0.x以及更早的版本时存在一个bug,如果你的版本是3.8.2的话,就需要安装make3.8.1,安装方法翻译自Google官网(3.8.1版的同学可以直接看下一节):

1.编辑 /opt/local/etc/macports/sources.conf 加入以下文本:

file:///Users/Shared/dports

2.使用以下命令,创建一个文件夹:

mkdir /Users/Shared/dports

3.在步骤2中创建的这个文件夹下执行:

svn co --revision 50980 http://svn.macports.org/repository/macports/trunk/dports/devel/gmake/ devel/gmake/

4.在本地仓库中创建一个prot索引:

portindex /Users/Shared/dports

5.然后安装gmake的老版本:

sudo port install gmake @3.81

下载源码##

在下载环节我们要着重感谢一下清华大学开源软件镜像站,不然我们会因为GFW的原因,在第一步就直接gg,所以下面所讲的所有地址我都自动替换为镜像站的地址了。

1、下载repo

# 在用户目录创建一个bin文件夹
mkdir ~/bin
# 将该目录临时添加进环境变量
PATH=~/bin:$PATH
# 从镜像下载repo工具
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o repo
# 给repo添加执行权限
chmod +x repo

在这里我们要给~/bin这个目录配置一下环境变量,即打开.bash_profile(这时候还不知道怎么找到这个文件并修改的同学请重新学习),可能你的环境变量和我的不一样,在export PATH =“”的引号中用冒号分割添加上就行,参考:

#将
export PATH="/opt/local/bin:/opt/local/sbin:$PATH"
#修改为
export PATH="/opt/local/bin:/opt/local/sbin:~/bin:$PATH"

在运行repo的时候,repo会尝试访问官网的git源去更新自己,因为repo这个项目的源代码本身也是用repo和git进行版本控制的,因为GFW,我们需要把这个更新地址默认配置到清华镜像,依然是.bash_profile,添加:

export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'

修改完毕后,为了让配置立即生效,输入

source .bash_profile

2、同步源码

现在我们有了repo工具,那么我们需要告诉这个工具我们要下载具体哪个版本的Android源码,清华镜像提供了一种简单稳定的方式-每月更新的初始化包,使用方式这里就不讲了,因为这个初始化包同步下来的是AOSP的master分支,也就是现在的Android L版本,我鼓捣了一整天才从master分支切换到android4.4.4-r2,但是我发现我还是要重新下载大小未知的几百个项目,所以这里我不太建议用他们的初始化包,当然很熟悉repo或者要编译Android L的人可以去研究使用初始化包,下面我讲的是官方的同步方式。

进入上边你分出的对大小写敏感的硬盘分区,创建目录aosp,然后进入

mkdir aosp
cd aosp

指定你要同步的具体Android版本分支(分支列表-翻

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

开始同步

repo sync

这个同步的时间无法估计,我同步了三天三夜,总计150G,这也是我看其他教程最坑的地方,这150G源码让我的分区硬盘满了好几次,一度让我怀疑自己同步的可能是假的源码,差点就放弃了,查了很多资料有说源码20G的、40G的、50G的,说多少G的都有,现在我同步完了,但是我依然没办法告诉你android 4.4.4_r2分支到底要同步多少源码量,为什么呢?这里就要说下repo的断点续传功能了。

AOSP这么大的代码量,经常会因为网络状况同步失败,失败后我们直接执行repo sync就可以断点续传继续同步了。但是我发现有好几次某个项目同步失败后,继续同步时的进度会有部分丢失,而且源码目录的内容大小会突然增加几个G,得益于alien75的这篇文章,大概的原因是git在同步的时候会先将整个项目的压缩包下载下来再解压,在同步失败时后进行断点续传时,会新建一个压缩包来继续同步,然后之前的压缩包就成了垃圾数据,这也就是为何前面我建议大家分区越大越好,所以请尽量在网络状况好的环境下进行同步,尽量减少中断同步的情况发生。在同步结束后,用rm命令删除了源码目录下的.repo目录,得到了Android 4.4.4_r2最终的源码量是10G左右。

我们老盯着电脑,等同步失败后重新输入repo sync也不是回事儿啊,所以就有了机智的大大写了下面这段脚本:

#!/bin/sh
repo sync
while [ $? -ne 0 ]
do
repo sync
done

使用方法:在源码根目录新建down.sh文件,写入以上脚本,在终端执行即可

bash down.sh

但是这个脚本也不是万能的,有时候同步过程会卡主不动,这种情况下没有返回同步的结果值,还是需要手动的重启同步过程,看运气吧,我就是运气不好才同步了150G。

类似于以下错误而导致同步停止的请重试,否则请无视之:

error: RPC failed; curl 56 SSL received a record with an incorrect Message Authentication Code.
fatal: The remote end hung up unexpectedly
或者
curl: (22) The requested URL returned error: 404 Not Found Server does not provide clone.bundle; ignoring.

下一篇 - MacOS X 下载编译Android 4.4.4源码(下)

参考资料:

  1. 清华大学开源软件镜像站
  2. Mac OS X 下 Android6.0源码的下载与编译
  3. 深究repo的所谓“续传”功能
  4. Android源码下载repo sync脚本

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容