背景

前几天心血来潮想编译Android源码,总共花了大概三天的时间,碰到一些问题,记录一下防止以后忘掉。

本地环境

系统版本: OS X 10.11.2
git : 2.6.4
port :2.3.4
make : 3.81
curl : 7.46.0

环境配置

首先需要一个区分大小写的硬盘,至少要100G,我是在一个移动硬盘上编译,所以直接磁盘工具->选择硬盘->抹掉,格式选择第二个”OS X扩展(区分大小写,日志式)”就可以了。

如果不想新建一个分区,也可以通过官网提供的方式,执行

1
2
3
hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 100g ~/android.dmg
hdiutil attach ~/android.dmg -mountpoint /Volumes/android;

来创建并挂载一个dmg文件来使用。

然后需要装一下java7环境,去下载一下就好了jdk-7u71-macosx-x64.dmg,一般做Android开发的都已经装过了。

接下来需要安装macports,它会替你装好编译过程中需要的各种工具。
直接到官网下载最新版本的,装好后,再将路径 /opt/local/bin 添加到环境变量,并且要在 /usr/bin 的前面。
接着执行POSIXLY_CORRECT=1 sudo port install gmake libsdl git gnupg开始下载。

然后执行 make -v查看当前make的版本,如果是3.82的话,还需要回退到3.81。因为3.82有个bug所以不能用来编译。不过我装完一直都是3.81,所以无所谓了,回退的具体方法可以去看官方文档。

下载镜像

我用的是清华的AOSP镜像,根据提示

由于首次同步需要下载 36GB 数据,过程中任何网络故障都可能造成同步失败,因此你可以选择使用每月更新的初始化包。

所以我选择先下载这个初始包。然后再进行同步。
执行命令

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

如果提示repo命令没找到,可以通过命令 brew install repo 来直接安装。
如果没有brew,可以执行ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"来安装。
然后开始同步,同步过程中碰到一个错误
提示result=56, HTTP code = 200 , 后来发现是git的一个bug,原本的git版本是2.4.9,将git升级到最新版2.6.4就解决了。

编译

首先执行source build/envsetup.sh设置环境变量,然后使用lunch命令选择构建目标。
接着在AOSP目录下执行make -j4就可以开始编译了。
过程中碰到一堆错误。

  • 提示build/core/config.mk:596: *** Error: could not find jdk tools.jar,其实第一次make没有这个错误,但是中间手贱装了个java8,然后就找不到这个文件了。网上找了一些方法都不能解决,最后根据错误提示,在config.mk的596行附近看了下,发现它是调用了一个叫find-jdk-tools-jar.sh的脚本,然后又看了下这个脚本的代码,主要逻辑就是先寻找 ANDROID_JAVA_HOME 是否被定义,如果有,就返回$ANDROID_JAVA_HOME/lib/tools.jar,于是我自己定义了一下,export ANDROID_JAVA_HOME="$(/usr/libexec/java_home -v 1.7)",成功解决。

  • 提示 Unsupported curl, please use a curl not based on SecureTransport ,搜了了下发现只有stackover上有人问了同样的问题,但没有人解答。刚开始以为是版本问题,于是换了一个最新版本的curl,但是没解决,不清楚这个不基于SecureTransport的curl是怎么样的。后来在元旦节这天,有人给出了解决方法,原来是要用openssl重新编译一个curl。
    首先下载curl源码,然后执行

    1
    2
    3
    ./configure --prefix=/usr/local/curl --with-ssl=/usr/local/Cellar/openssl/1.0.2d_1
    make
    make install

    这个1.0.2d_1需要根据自己本地实际版本进行更改,我这里是1.0.2e,最后将 /usr/local/curl/bin 添加到环境变量。可以使用 curl --version,查看一下,如果没有出现SecureTransport,而是出现OpenSSL,则表明替换成功。

  • 提示 No Jack server running. Try 'jack-admin start-server'
    jack服务器开启失败。原因是之前手动创建了一个 .jack-server文件夹,删了之后重新make一下就可以了。

make 完之后,就可以尝试刷进手机了。但是我并没有nexus手机,所以只能在模拟器上玩了。

在Android Studio上阅读源码

在AOSP根目录执行 make idegen && development/tools/idegen/idegen.sh,然后直接用Android Studio打开生成的android.ipr 文件就可以了。

参考