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以及各位大佬的宝贵经验,感谢他们!!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容