Build AOSP in mac osx 10.12.6

更新:

2022-03-01更新AOSP11.0的编译
2017-09-09更新AOSP8.0的编译
2016-05-01更新AOSP6.0编译

配置OSX系统

  1. 安装Xcode
  2. 找到Xcode安装目录,右键打开show package content
  3. 创建/Developer/SDK目录
  4. MacOSX10.11.sdkContents/Developer/Platforms/MacOSX.platform/Developer/SDKs/复制到/Developer/SDK
  5. Xcode.app复制到到/Developer目录下

完成Xcode的配置

  1. 打开Xcode
  2. Xcode的菜单打开Preferences
  3. 选择Location标签
  4. Command Line Tools中选择Xcodd 7.2(具体版本依个人电脑上的Xcode版本而定)

安装MacPorts

  1. 获取最新版的MacPorts!
  2. 打开控制台,编辑bash配置文件
1
$ vim ~/.bash_profile
  1. 在配置文件中插入
1
$ export PATH=/opt/local/bin:$PATH
  1. 重新载入配置信息
1
$ . ~/.bash_profile
  1. 运行port命令检测是否成功安装
1
$ port
  1. 安装需要的依赖包
1
$ POSIXLY_CORRECT=1 sudo port install gmake libsdl git gnupg

安装java开发包(JDK1.7)

安装Repo

Repo是基于git的一种工具,能很方便的用来管理Android源码。更多信息请查看

  1. 确保根目录下有/bin目录
1
2
$ mkdir ~/bin
$ PATH=~/bin:$PATH
  1. 下载Repo工具,确保它可以运行
1
2
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo

设置文件描述符

OSX系统的默认文件描述符的数量太小,高并行构建可能会超出这个限制。为了突破这个限制,添加以下命令到.bash_profile

1
2
3
4
5
$ vim ~/.bash_profile
~~~~~
# set the number of open files to be 1024
ulimit -S -n 1024

创建字符大小写敏感的虚拟驱动

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

源码很大,因此建议要创建大一点的虚拟光驱

挂载这个驱动:

1
hdiutil attach ~/android.dmg -mountpoint /Volumes/android

你也可以用另一种方式,在配置文件中加入如下方法:

1
function mountAndroid { hdiutil attach ~/android.dmg.sparseimage -mountpoint /Volumes/android; }

然后运行如下命令:

1
mountAndroid

下载源文件

首先我们确定我们要下载的是哪个版本的源码,本文以android-6.0.1_r30为例

首先在/Volumes/android创建一个工作目录

1
2
3
$ cd /Volumes/android
$ mkdir WORKING_DIRECTORY
$ cd WORKING_DIRECTORY

运行

1
$ repo init -u https://android.googlesource.com/platform/manifest -b android-5.0.0_r7.0.1

最后运行

1
repo sync

来下载源码

编译源码

在源码根目录运行

1
$ source build/envsetup.sh

运行

1
$ lunch

按回车选择aosp_arm-eng

安装openssl curl

1
2
brew install curl --with-openssl
export PATH=$(brew --prefix curl)/bin:$PATH

运行

1
caffeinate make -j4

caffeinate阻止休眠

开始漫长的编译过程

运行

1
make idegen && development/tools/idegen/idegen.sh

生成可被IDE识别的工程。

碰到的一些问题

  • 下载源码时,需要比较长的时间,还好支持断点续传。(被盾的地方,必须使用VPN)
  • 源码下载完之后,编译会碰到找不到MacOSsdk。按照文中开头的步骤即可解决
  • 编译过程中会出现
    1
    fatal error: linux/netfilter/xt_DSCP.h: No such file or directory

这是由于我的源码没有直接在/Volumns/android下下载,是从别的地方下载完之后拷贝过来的。而编译源码会严格区分大小写的。相应目录下有小写的头文件。

解决方案是:

  1. 严格按照官方文档描述,在相应目录下下载源码
  2. ./external/iptables/include/linux/netfilter中创建头文件xt_DSCP.h。在该头文件中加入如下代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/*
* based on ipt_FTOS.c (C) 2000 by Matthew G. Marsh <mgm@paktronix.com>
* This software is distributed under GNU GPL v2, 1991
*
* See RFC2474 for a description of the DSCP field within the IP Header.
*
* xt_DSCP.h,v 1.7 2002/03/14 12:03:13 laforge Exp
*/
#ifndef _XT_DSCP_TARGET_H
#define _XT_DSCP_TARGET_H
#include <linux/netfilter/xt_dscp.h>
#include <linux/types.h>

/* target info */
struct xt_DSCP_info {
__u8 dscp;
};

struct xt_tos_target_info {
__u8 tos_value;
__u8 tos_mask;
};

#endif /* _XT_DSCP_TARGET_H */
  • Java文件找不到
1
external/doclava/src/com/google/doclava/ClassInfo.java:20: error: package com.sun.javadoc does not exist import com.sun.javadoc.ClassDoc

解决方案是在配置文件中加入

1
$ export PATH=/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home/bin:$PATH
  • 编译最新版的aosp可能会遇到Unsupported curl, please use a curl not based on SecureTransport。解决方案是运行一下命令
1
2
3
brew install curl --with-openssl
export PATH=$(brew --prefix curl)/bin:$PATH
caffeinate make -j4