复盘 Mac OS X 下 Android 6.0 源码的下载与编译

文章目录
  1. 1. 鲜血与眼泪
  2. 2. 经验与教训
  3. 3. 最佳的方案
  4. 4. 阅读源码
  5. 5. 后记
  6. 6. 参考文献

复盘是棋类术语,指对局完毕后,复演该盘棋的记录,以检查对局中着法的优劣与得失关键,同时提出假设,再找出最佳方案。

以上部分摘录自维基百科。

研究 Android 源码的重要性想必无需多言,比如参照 B 站 Android 工程师的这篇有没有必要阅读 Android 源码。更有甚者,最近在 Android 圈内小有广传的 Android “天才少年” Lody,就是靠着啃 Android 源码来学习的!要研读源码,首先得有源码。不过,源码环境目前只支持 Linux 和 Mac OS,Windows 暂不支持。本人用的是 Mac,来开启复盘 Mac OS X 下 Android 6.0 源码的下载与编译之旅吧(干货直接跳至最佳的方案)。

鲜血与眼泪

鉴于我大天朝 GFW 的存在,单单折腾下载源码,就花了好几天时间,待我慢慢道来。

上周五下午,意外发现安卓猴同学的这篇国内镜像加速 Android 源码下载,早就听说读源码的重要性,正好手头没活,一时兴起,就打算将 Android 源码下载下来。“源码在手,天下我有”,想想还有点小激动呢。好,开始入坑。

照着博文所描述的步骤,一步步来,开始下载。Mac 摆一边,做着自己的事。离下班还有一小时瞄了眼 Terminal,进度不知何时停住了!等啊等,进度还不动。于是按着步骤重新开始下载,继续摆一边,临下班时看,又在同样的地方卡住了!苍天啊!好了,第一天下载以失败告终。

过完周末,等到这周一,当然心里还惦记着这事。“源码在手,天下我有”,想想还有点小激动呢。又看了下之前的博文,靠,给的官网链接都失效了。想了想,也得不出哪里出了问题。好,算你狠,我有梯子!大不了去官网下。看到描述的 The initial sync operation will take an hour or more to complete。我乐了,那就翻墙下,官网说至少一个小时,看看公司的网速,大不了半天还不成了。于是又像之前一样按部就班操作,将 Mac 摆一边,任由其下载。中午吃饭时看,还好,还在继续下。下午临下班两小时再看,神奇,进度还在继续着。不过,已经过了半天了,不对劲啊!我看了下载容量,都已经 5 个多 G 了,说好的就至少一个小时呢。Google 了一下,懵逼了。源码连着 .repo 什么杂七杂八的,竟然有三四十个 G!这要下到猴年马月!大半天过去了,苍天啊!好了,第二天下载同样以失败告终。

第三天,也就是这周二,早早地就来到公司,几次失败算什么,“源码在手,天下我有”,想想还有点小激动呢。借助梯子的小水管是没戏了,太慢太慢,神奇的 GFW 啊!决定重新使用镜像,之前所提博文给的镜像官网链接失效,又找到了有效的,就是伟大的清华大学 TUNA 镜像源 了。照着上面的过程摘录,一步步地操作,继续同以往一样,将 Mac 放一边下载,这次每隔一段时间就看看,进度一直没问题,然而直到中午,进度又卡住了!继续 Google,看到一个办法,往源码根目录下添加一个脚本文件。好,照着做。再研读下清华的镜像说明,注意到下面有一个使用每月更新的初始化包,里面有个下载链接,不管三七二十一,先下着再说,该下载放公司电脑上,100 M 的宽带接入,下载速度只显示着 300 KB 左右每秒,关键是容量压缩了也近 25 个 G(事实证明,下载该初始包简直不能再明智,后续交代)!于是,周二中午开始,Mac 摆一边下着,公司电脑也同时以龟速下着,很是和谐。不过接下来,大家也猜到了,临下班一小时,Mac 上的下载进度再次莫名其妙地停止,之前的脚本也没起什么作用。也罢,各种尝试都以失败告终,聊以慰藉的是,公司电脑上的龟速进度还在继续着。下班临走前,我将电脑亮度调到最低,打算放在公司下一夜,虽然当时不知道这初始化包是什么个玩意儿。好了,第三天下载,还是一样的味道,以失败告终。

第四天,也就是昨天,又早早地来到公司,着手下载源码的事。“源码在手,天下我有”的梦还在,源码虐我千百遍,我待源码如初恋。虽然,这厮在我还没见着其真面目时就开始一顿暴击了。很幸运,一夜下来,下载进度还在继续着,并且,还有一小会儿就要下完了!心里还是蛮开心的,苍天啊,终于开眼了。很快,初始化包下载完毕。擦干这几天的血与泪,咧开嘴角,终于迈上了正途!

经验与教训

要想成功下载源码,不要按着清华镜像的过程摘录来,直接下载其提供的每月更新的初始化包!更不要不自量力地使用小水管翻墙去官网下,看到网上动不动有说的下载了五天一周的,并且,中间莫名其妙地断掉的话,也许前功尽弃。还有,Google 搜到些排列前面的帖文,一定要注意时间,或许该解决办法已经不再适用,要与时俱进。参照清华镜像与 Android 官网说明,灵活应对,足够!再有些莫名其妙的问题,Just Google 一下。

还有个很重要的提醒,就是,在下载与编译源码的整个过程中,会遭遇各种各样的坑,谨慎入坑。

最佳的方案

Step 1. 创建一个大小写敏感的磁盘镜像

1
$ sudo hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 100g ~/android.dmg

注意,官网给定的 40 g 不够用。这将创建一个 .dmg (可能是 .dmg.sparseimage) 文件,我的是 .dmg.sparseimage 文件。

Step 2. 加载分区

1
$ sudo hdiutil attach ~/android.dmg.sparseimage -mountpoint /Volumes/android

注意,android.dmg.sparseimage 部分与第一步生成文件的亮色部分保持一致。

Step 3. 下载并安装需要的辅助工具

既然到想要研究 Android 源码这一步了,默认 Java 与 Android 环境已配置好,有问题随时 Google。

I.下载并安装 Xcode,地址:https://developer.apple.com

II.下载并安装 MacPorts,地址:https://www.macports.org/install.php

III.我的 Mac 默认相关路径配置好了,有问题自行参照官网说明或 Google。通过 MacPorts 安装 make,git 和 GPG:

1
$ POSIXLY_CORRECT=1 sudo port install gmake libsdl git gnupg

大概花了半个小时。

Step 4. 设置一个文件描述符限制

我当时没有设置,不过官网提示设置。Mac 系统下默认只能同时打开 1024 个文件,而在进行 Android 源码编译时有可能会超出这个限制,因此需要解除这个限制。在 ~/.bash_profile 中添加以下内容:

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

Step 5. 安装 Repo

Repo 是一个辅助于 Git 管理 Android 版本及分支的工具。

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

Step 6. 解压并同步初始化包

还记得之前花了一夜下载好的压缩版初始化包吗?确认包在 /Users/用户名/ 下。

1
2
3
$ tar xf aosp-latest.tar
$ cd AOSP # 解压得到的 AOSP 工程目录
$ repo sync # 正常同步一遍即可得到完整目录

出问题卡住,重新同步。整个同步过程中花了不到一个小时!下载初始化包并解压再同步是何等得明智!Done!

Step 7. 进入 Step 2 加载的分区

注意,先将之前解压同步完的 AOSP 文件夹拷贝到分区中。
接着,

1
$ cd /Volumes/android/

Step 8. 编译

1
$ source build/envsetup.sh

为阅读源码:

1
$ lunch aosp_arm-eng

最后:

1
$ make -j4

没有出现网上提到的很多各种奇葩问题,只出现一个问题如下:

fatal error: linux/netfilter/xt_DSCP.h: No such file or directory

解决办法:

1
2
cd external/iptables/extensions/../include/linux/netfilter
ln -s xt_dscp.h xt_DSCP.h

再返回 AOSP 目录,重新 make -j4

出现问题,解决,再 make -j4,循环往复,直到最终编译完成。不用管出现的多个 warning,有 error 时解决完继续下去。编译全程,花了一半小时多点。最后,令人激动的时刻来临!

编译成功!Congratulations!!!此时,可以写入模拟器或真机进行调试了。

阅读源码

阅读源码的工具种类繁多,这里,姑且只谈谈使用 Android Studio 阅读源码。

源码根目录下,

1
$ mmm development/tools/idegen/

稍等片刻,接着

1
$ sh ./development/tools/idegen/idegen.sh

最终完成后,打开 Android Studio,选择打开一个现有的 Android Studio 项目,选择 Android 源码的根目录,导入 android.irp 文件,Bingo!精美的源码世界。

后记

“源码在手,天下我有”,想想还有点小激动呢。拍拍身上的灰尘,活动完筋骨,继续前行。“路漫漫其修远兮,吾将上下而求索”。

本人才疏学浅,如有疏漏错误之处,望读者中有识之士不吝赐教,谢谢。

1
Email: [email protected] / WeChat: Wolverine623

您也可以关注我个人的微信公众号码农六哥第一时间获得博客的更新通知,或后台留言与我交流

参考文献

1.https://source.android.com/source/requirements.html

2.https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/

3.https://seewhy.me/2016/01/01/aospcompilation/