MacOS 10.14编译Android源码

一、搭建编译环境

1、设置 Mac OS 编译环境
在默认安装过程中,Mac OS 会在一个保留大小写但不区分大小写的文件系统中运行。Git 并不支持此类文件系统,而且此类文件系统会导致某些 Git 命令(例如 git status)的行为出现异常。因此,我们建议您始终在区分大小写的文件系统中处理 AOSP 源文件。使用下文中介绍的磁盘映像可以非常轻松地做到这一点。

有了适当的文件系统后,在新型 Mac OS 环境中编译 master 分支就会变得非常简单。要编译较早版本的分支,则需要一些额外的工具和 SDK。

创建区分大小写的磁盘映像

您可以使用磁盘映像在现有的 Mac OS 环境中创建区分大小写的文件系统。要创建磁盘映像,请启动磁盘工具,然后选择新建映像。完成编译至少需要 25GB 空间;更大的空间能够更好地满足未来的需求。使用稀疏映像有助于节省空间,而且以后可以随着需求的增加进行扩展。请务必选择 Case sensitive, Journaled 存储卷格式。

2、安装 Xcode 和其他软件包

(1)使用以下命令安装 Xcode 命令行工具:

xcode-select --install

对于较低版本的 Mac OS(10.8 或更低版本),您必须通过 Apple 开发者网站安装 Xcode。如果您尚未注册成为 Apple 开发者,则必须创建一个 Apple ID 才能下载。

(1)安装 Homebrew 以进行软件包管理。

a. Homebrew - /usr/local/bin:

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

b. 使用 Homebrew,发出:

brew install git gnupg2

(2)设置文件描述符数量上限

在 Mac OS 中,可同时打开的文件描述符的默认数量上限太低,在高度并行的编译流程中,可能会超出此上限。要提高此上限,请将下列行添加到 ~/.bash_profile 中:

# set the number of open files to be 1024

 ulimit -S -n 1024

二、下载源代码

Android 源代码树位于由 Google 托管的 Git 代码库中。Git 代码库中包含 Android 源代码的元数据,其中包括对源代码进行的更改以及更改时间。本页介绍了如何下载特定 Android 代码流水线的源代码树。

1、安装 Repo

Repo 是一款工具,可让您在 Android 环境中更轻松地使用 Git。

要安装 Repo,请执行以下操作:

(1)、确保您的主目录中有一个 bin/ 目录,并且它包含在您的路径中:

mkdir ~/bin 

PATH=~/bin:$PATH

(2)、下载 Repo 工具,并确保它可执行:

curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo

chmod a+x ~/bin/repo

(如果下载不下来请自备提子或者选择清华镜像)

2、初始化 Repo 客户端

安装 Repo 后,设置您的客户端以访问 Android 源代码库:

(1)、创建一个空目录来存放您的工作文件。如果您使用的是 MacOS,必须在区分大小写的文件系统中创建该目录。为其指定一个您喜欢的任意名称:

mkdir WORKING_DIRECTORY 

cd WORKING_DIRECTORY

(2)、使用您的真实姓名和电子邮件地址配置 Git。要使用 Gerrit 代码审核工具,您需要一个与注册的 Google 帐号相关联的电子邮件地址。确保这是您可以用来接收邮件的有效地址。您在此处提供的姓名将显示在您提交的代码的提供方信息中。

git config --global user.name "Your Name" 

git config --global user.email "you@example.com"

(3)、运行 repo init 以获取最新版本的 Repo 及其最新的问题修复。您必须为清单指定一个网址,该清单用于指定 Android 源代码中包含的各个代码库将位于工作目录中的什么位置。

repo init -u https://android.googlesource.com/platform/manifest

要检出除 master 之外的其他分支,请使用 -b 指定此分支。要查看分支列表,请参阅源代码标记和细分版本

repo init -u https://android.googlesource.com/platform/manifest -b android-9.0.0_r35

初始化成功后,系统将显示一条消息,告诉您 Repo 已在工作目录中完成初始化。您的客户端目录现在应该包含一个 .repo 目录,这是清单等文件的存放位置。

3、下载 Android 源代码树

要将 Android 源代码树从默认清单中指定的代码库下载到工作目录,请运行以下命令:

repo sync

Android 源代码文件位于工作目录中对应的项目名称下。初始同步操作需要 1 个小时或更长时间才能完成。要详细了解 repo sync 和其他 Repo 命令,请参阅使用 Android 代码

三、编译 Android

1、设置环境
使用 envsetup.sh 脚本初始化环境。请注意,将 source 替换成 .(一个点)可以省去一些字符,这种简写形式在文档中更为常用。

source build/envsetup.sh 或者 . build/envsetup.sh

envsetup.sh 脚本导入了一些命令,可让您使用 Android 源代码,其中包括本练习中使用的命令。以下是一些重要的命令示例:

lunch - lunch product_name-build_variant 会选择“product_name”作为要编译的产品,并选择“build_variant”作为要编译的变体,然后将这些选择存储在可被后续对 m 和其他类似命令的调用读取的环境中。

m - 从树的顶部运行编译。这很有用,因为您可以在子目录中运行 make。如果您设置了 TOP 环境变量,它便会使用此变量。如果您未设置此变量,它便会从当前目录中查找相应的树,以尝试找到树的顶层。您可以通过运行不包含参数的 m 来编译整个源代码树,也可以通过指定相应名称来编译特定目标。

mma - 编译当前目录中的所有模块及其依赖项。

mmma - 编译提供的目录中的所有模块及其依赖项。

croot - cd 到树顶层。

2、选择目标

使用 lunch 选择要编译的目标。确切的配置可作为参数进行传递。例如,以下命令表示针对模拟器进行完整编译,并且启用所有调试功能.

lunch aosp_arm-eng

如果在没有参数的情况下运行,则 lunch 会提示您从菜单中选择目标。

3、编译代码

请使用 make 进行所有编译。make 可以使用 -jN 参数处理并行任务(N代表并行任务数,并不是越大越好,根据自己电脑cpu核心数*2)。如果您未提供 -j 参数,编译系统便会自动选择其认为对您的系统最佳的并行任务计数。

如上所述,您可以通过在 make 命令行中列出相应名称来编译特定模块,而不是编译完整的设备映像。此外,m 还针对各种特殊目的提供了一些伪目标。以下是一些示例:

droid - make droid 是正常编译。此目标在此处,因为默认目标需要名称。

all - make all 可以编译 m droid 能够编译的所有元素,以及没有 droid 标记的所有元素。编译服务器会运行此命令,以确保包含在树中且包含 Android.mk 文件的所有元素都会进行编译。

clean - make clean 可以删除此配置的所有输出文件和中间文件。这与 rm -rf out/ 相同。

运行 make help 即可查看 make 提供的其他伪目标。

4、模拟 Android 设备

emulator

四、以下是我在编译过程中踩的坑

1、下载Repo工具失败:

curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo chmod a+x ~/bin/repo

执行该命令下载失败或者超时,请自备梯子或者使用清华镜像

2、初始化Repo仓库失败

执行 repo init  

(1)执行该命令报错:

warning: gpg (GnuPG)isnotavailable.

warning: Installing itisstrongly encouraged.

请检查brew instal gnupg2 命令安装gnupg2是否成功

(2)执行命令报错:

fatal: Cannot get https://gerrit.googlesource.com/git-repo/clone.bundle

fatal: error [Errno 60] Operation timed out

修改~/bin/repo(用文本编辑器打开)

REPO_URL = 'https://gerrit.googlesource.com/git-repo'

修改为

REPO_URL = 'https://gerrit-googlesource.proxy.ustclug.org/git-repo'

(3)执行命令报错:

SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581)

修改~/bin/repo(用文本编辑器打开)

添加以下代码(Python 升级到 2.7.9 之后引入了一个新特性,当你urllib.urlopen一个 https 的时候,会验证一次 SSL 证书)

import ssl

ssl._create_default_https_context = ssl._create_unverified_context

关闭证书验证

(4)执行该命令超时,请自备梯子或者使用清华镜像

建立工作目录:

mkdir WORKING_DIRECTORY

cd WORKING_DIRECTORY

初始化仓库:

repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest

如果需要指定某个版本,如下:

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

同步源码树(以后只需执行这条命令来同步):

repo sync

2、编译报错

(1)、internal error: Could not find a supported mac sdk: ["10.10" "10.11" "10.12" "10.13"]

xcode最新版本自带是的MacOSX10.14.sdk,Google未支持到该版本,可以到 https://github.com/phracker/MacOSX-SDKs/releases 下载”10.10” “10.11” “10.12” “10.13”的其中一个sdk,解压后,放到/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs中,并且创建名为MacOSX10.12.sdk 的替身。

创建方式

sudo ln -s MacOSX10.12 MacOSX10.12.sdk

经测试我在10.14上使用MacOSX10.13.sdk报错未编译成功,但是使用MacOSX10.12.sdk编译成功

3、编译过程中报错:bash: xz: command not found

未安装XZ工具

http://tukaani.org/xz/下载文件

(1)、解压

tar -zxf xz-5.2.4.tar.gz

(2)、编译

cd xz-5.2.4

./configure

make

make install

(3)、验证

xz -V

出现XZ版本号为成功


以上内容参考自https://source.android.google.cn/setup以及各位大佬的宝贵经验,感谢他们!!!

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

推荐阅读更多精彩内容