之前也在公司的服务器上(Ubuntu系统)下载和编译过原生的Android源码,考虑到不可能一直连接到公司内网的服务器,平常也可能会折腾一下,而且在source.android.com上Setting up a Mac OS build environment的章节中,发现master版本的编译环境依赖都使用了”or newer”的字眼。想必对OS X系统的软件依赖要求也没那么高了,所以还是决定在本机下载一份Android的源码,并尝试编译。

下载Android源码

Step1 创建磁盘文件 打开Terminal,输入如下命令:

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

Step2 下载源码 这步本没什么可说,直接按照官方教程https://source.android.com/source/downloading.html下载源码即可。但是由于我们特殊的网络环境,从官方下载源码可能不太顺利,即使使用VPN也不一定稳定。强烈建议使用中国科技大学清华大学的AOSP镜像。 另外如果你是第一次下载Android,强烈建议使用清华大学的每月更新的初始化包,这样100M光纤,使用迅雷平均9~10M的速度,不到两小时即可下载完成,比直接repo sync要节省不少时间。

wget http://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar # 下载初始化包
tar xf aosp-latest.tar
cd AOSP   # 解压得到的 AOSP 工程目录
repo sync # 正常同步

具体介绍请参考:https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/#section-1 我在下载aosp-latest.tar解压后repo sync结果一直报错,看结果是/platform/external/dtc/ not found这时修改 .repo/manifests.git/config将url修改为谷歌的地址https://android.googlesource.com/platform/manifest然后再打开VPN同步一下即可。

repo_sync_success
repo_sync_success

编译源码

设置编译环境 参考官方设置OS X编译环境:https://source.android.com/source/initializing.html#setting-up-a-mac-os-x-build-environment

根据官方文档在安装了MacPorts之后,使用MacPorts安装依赖工具时,可能会遇到Port gmake not found的错误,在安装之前需要先执行下面的命令。

sudo port -d sync

然后就可以安装相关的工具了。

POSIXLY_CORRECT=1 sudo port install gmake libsdl git gnupg

本机的系统环境如下:

  • OS X El Capitan 10.11.3
  • JDK 1.8.0_73
  • Xcode 7.2.1

然后

source build/envsetup.sh
lunch # 选择要build的target
make -j4

lunch aosp_arm-eng
lunch aosp_arm-eng

如果你人品好的话,可能直接一遍就编译通过了。我在编译的时候遇到了一个”Building with Jack …… Out of memory error”的问题。

Jack Out of memory error
Jack Out of memory error
首先了解到Jack (Java Android Compiler Kit)是新的Android 编译工具,从Android 6.0 开始加入,开始替换原有的编译工具,例如javac, ProGuard, jarjar和 dx。它主要负责将java代码编译成dex包,并支持代码压缩,混淆等。 具体在官网也有介绍:https://source.android.com/source/jack.html 而且官网也提到了Jack “Out of memory error”的问题,并给出了建议的解决方案: 即将$HOME/.jack 文件中SERVER_NB_COMPILE 设置为较小的值。可是在我的HOME目录下没有.jack这个文件,只有.jack-settings,于是我在.jack-settings中添加了SERVER_NB_COMPILE=1,再次make的时候依然遇到了”Out of memory error”。 再次查看编译的log,发现其实已经给出了提示,”Try increasing heap size with java option ‘-Xmx’.” 所以在make之前设置一下jvm如下:

export JVM_ARGS="-Xmx4096m -XX:MaxPermSize=1024m"

然后再次make -j4,大概经过2个小时的样子,编译完成,虽然带着一堆的warning。

make_successfully
make_successfully
查看out目录下已经多出了很多文件,接下来就是烧录了。

make_successfully
make_successfully