Android8.1源码编译实践(Mac)
第0步:版本选择
AOSP版本选择很重要,如果选错了,会造成编译失败等各种问题,编译AOSP对Xcode的版本是有要求的;
比如:AOSP6.0-7.0,要求Xcode的版本是8.3,然而在MacOS 10.14上面是不支持Xcode8.3的这就很尴尬;
由于现在大家的Mac环境基本是更新到最新的10.14了,所以这里推荐大家选择android-8.1.0_r1。
编译环境:
- OS: macOS Mojave 10.14.4
- JDK: 1.8.0_144
- Xcode: 10.2.1
- XcodeSDK: 10.11
- AOSP: android-8.1.0_r15
- Git: 2.21.0
第一步:创建区分大小写的磁盘映像
由于Mac OS的文件系统默认是不区分大小写的,Git 并不支持此类文件系统,而且此类文件系统会导致某些 Git 命令(例如 git status)的行为出现异常,所以我们需要在区分大小写的文件系统中对 AOSP 源文件进行操作。
通过 shell 使用以下命令创建磁盘映像:
# hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 150g ~/android.dmg
这里设置分配150g的大小,这将创建一个 .dmg(也可能是 .dmg.sparseimage)文件,该文件在装载后可用作具有 Android 开发所需格式的存储卷。
如果您以后需要更大的存储卷,还可以使用以下命令来调整稀疏映像的大小:
# hdiutil resize -size <new-size-you-want>g ~/android.dmg.sparseimage
双击生成的.dmg.sparseimage文件,就会看到挂载的磁盘了,之后所有操作都在这个磁盘分区中进行,您可以像对待外接硬盘一样将其弹出(卸载)。
如果你喜欢在命令行中挂载/卸载分区,可以向 ~/.bash_profile 中添加辅助函数:
# mount the android file image
function mountAndroid { hdiutil attach ~/android.dmg.sparseimage -mountpoint /Volumes/android; }
# unmount the android file image
function umountAndroid() { hdiutil detach /Volumes/android; }
注意文件名路径是否一致,要使.bash_profile配置生效,需要:
# source ~/.bash_profile
之后你就可以在命令行中通过mountAndroid和unmountAndroid来操作了。
第二步:安装所需的程序包
安装 Xcode 命令行工具:
一般在安装Xcode的时候会自动安装命令行工具,这里保险起见,检查一下:
# xcode-select --install
通过 macports.org 安装 MacPorts。
将以下内容添加到~/.bash_profile中
export PATH=/opt/local/bin:$PATH
通过 MacPorts 获取 Make、Git 和 GPG 程序包:
# POSIXLY_CORRECT=1 sudo port install gmake libsdl git gnupg
如果您使用 Mac OS X v10.4,还需要安装 bison:
# POSIXLY_CORRECT=1 sudo port install bison
设置文件描述符数量上限
在 Mac OS 中,可同时打开的文件描述符的默认数量上限太低,在高度并行的编译流程中,可能会超出此上限。
要提高此上限,请将下列行添加到 ~/.bash_profile 中:
# set the number of open files to be 1024
ulimit -S -n 1024
第三步:下载源代码
安装Repo
Repo 是一款工具,可让您在 Android 环境中更轻松地使用 Git.
直接运行下面的命令:
# curl https://storage.googleapis.com/git-repo-downloads/repo > ~/repo
会在主目录下生成repo文件,接着给他赋予可执行的权限:
# chmod a+x ~/repo
为了可以方面的使用repo命令,我们把它移动到/opt/local/bin里面,因为这个路径我们在上一步中已经加入到PATH了,所以我们可以在任何一个地方执行repo命令;
# mv ~/repo /opt/local/bin
同步源码
进入第一步中创建好的分区,建立工作目录:
# mkdir aosp
# cd aosp
repo的运行过程中会尝试访问官方的git源更新自己,如果想使用tuna的镜像源进行更新,可以将如下内容复制到你的~/.bash_profile里:
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'
设置Git用户名和邮箱:
# git config --global user.name "Your Name"
# git config --global user.email "you@example.com"
初始化repo,这里采用清华大学的镜像,并设置分支android-8.1.0_r15:
#repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-8.1.0_r15
最后一步:
# repo sync
源码同步过程中常常会因为网络因素而断开,如果断开了继续执行repo sync命令即可,直到下载完成。
漫长的等待......
下载完成后差不多占用70G大小,因为我们后续不需要再进行分支切换与同步,所以我们可以把目录下的.repo文件夹给删除了,毕竟Mac的SSD容量宝贵,删除之后你会发现硬盘大小没有释放,这就有点尴尬了,这个问题目前也没找到解决的办法,我的方法是按照第一步创建一个新的分区,把内容拷贝进去,然后把旧的分区删了,这样空间就释放了。
编译源码
优化编译环境 设置 ccache
要使用 ccache,请在源代码树的根目录下执行以下命令:
#export USE_CCACHE=1
#export CCACHE_DIR=/<path_of_your_choice>/.ccache
#prebuilts/misc/darwin-x86/ccache/ccache -M 50G
注意<path_of_your_choice>是你源码下载的根目录。
最后请将以下内容添加到 .bash_profile(或等同文件)中:
export USE_CCACHE=1
配置ANDROID_JAVA_HOME环境变量
在~/.bash_profile中添加以下内容,前提必须是安装了JDK1.8:
export ANDROID_JAVA_HOME=$(/usr/libexec/java_home -v 1.8)
设置XcodeSDK的版本
执行以下命令,打开配置文件:
# vi build/soong/cc/config/x86_darwin_host.go
查看darwinSupportedSdkVersions,这里列出了支持的sdk版本:
darwinSupportedSdkVersions = []string{
"10.10",
"10.11",
"10.12",
}
接着我们进入以下目录查看现有的XcodeSDK版本:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/
这里我们选择10.11的版本,如果没有MacOSX10.11.sdk则去MacOSX-SDKs 中下载一个,解压到该目录,并把其他版本的删除,确保只保留一个就行了。
开始编译
首先要把shell切换到bash(如果你使用的是zsh)
#chsh -s /bin/bash
初始化环境:
#source build/envsetup.sh
选择编译的分支:
#lunch
会出现以下列表:
Lunch menu... pick a combo:
1. aosp_arm-eng
2. aosp_arm64-eng
3. aosp_mips-eng
4. aosp_mips64-eng
5. aosp_x86-eng
6. aosp_x86_64-eng
7. aosp_car_arm-userdebug
8. aosp_car_arm64-userdebug
9. aosp_car_x86-userdebug
10. aosp_car_x86_64-userdebug
... ...
Which would you like? [aosp_arm-eng]
要求输入对应的数字:
如果你想在你的Nexus上设备运行,请参照官方设备对应列表选择;
如果你只想在本机的虚拟机上运行,Mac系统的话选择aosp_x86-eng即可。
最后一步,编译:
#make -j6
通过-jN参数来设置编译的并行任务数,以提高编译速度,在此前我的CPU核心数为6,这里N值最好选在6到12之间,这里我们设置6个并行任务进行编译。
这里需要注意的是,每次退出再进入命令行要执行以上命令之前,都要先执行:
#source build/envsetup.sh
编译中遇到的问题
问题1:Jack编译报错:communication error with Jack server
原因:JACK编译器不支持多用户同时编译,其他用户在编译,端口被占用。
解决方法:
如下:修改以下两个配置文件中的端口号server.service.port和server.admin.port,比如都改为8096/8097:
- ~/.jack-settings
- ~/.jack-server/config.properties
注意:
两个文件中的端口号必须一致。
修改后的端口号必须是没有被使用的。
问题2: 出现Try increasing heap size with java option '-Xmx'
原因: 出现这个错误是由于电脑内存不足;
解决方法:在命令行分别执行以下三条语句,然后继续编译;
# export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4g"
# ./prebuilts/sdk/tools/jack-admin kill-server
# ./prebuilts/sdk/tools/jack-admin start-server
问题3: BISON_PKGDATADIR=external/bison/data prebuilts/misc/darwin-x86/bison/bison -d
在log中出现BSION等字样;
原因:网上说这个bsion的一个bug;
解决方法:拉取新的分支,重新编译 bison:
#cd external/bison
#git cherry-pick c0c852bd6fe462b148475476d9124fd740eba160
如果这步骤发生错误了(比如之前删除了.repo文件夹)
这时候我们就把bison这个文件夹删除,下载一个新的:
wget https://android.googlesource.com/platform/external/bison/+archive/c0c852bd6fe462b148475476d9124fd740eba160.tar.gz
解压后进入bison文件夹,执行:
# mm
# cp out/host/darwin-x86/bin/bison prebuilts/misc/darwin-x86/bison/
结束
最后一切顺利的话,经过漫长的编译后,最终会出现以下画面则说明编译Android系统成功了。

Android8.1源码编译实践(Mac)的更多相关文章
- android源码编译-Mac 10.11 xcode5.1.1
第一步: 参考官网:创建一个dmg,大小80g,这个要尽量大一点,40g感觉不够用:http://source.android.com/source/initializing.html 第二步:下载a ...
- 第一篇: openJDK源码编译安装--mac版本
1.为什么要编译JDK 想要一探JDK内部的实现机制,最便捷的路径之一就是自己编译一套JDK,通过阅读和跟踪调试JDK源码去了解Java技术体系的原理,虽然门槛高一点,但肯定比阅读各种书籍,文章,博客 ...
- Mac Android8.0源码编译笔记
原因:内存不够 办法:添加限制,输入如下命令:export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompil ...
- MatrixOne从入门到实践02——源码编译
MatrixOne从入门到实践--源码编译 在部署MatrixOne前,我们可能会比较纠结使用哪个版本合适,MatrixOne在github上有各个版本的Releases,包含源码包和适用于Lin ...
- 记一次在mac上源码编译curl,使其支持NSS的过程
一.背景 在一次学习https原理的过程中,希望客户端指定特定的cipher suites来抓包分析SSL/TLS的握手过程,就想到了使用curl工具,而不是使用浏览器. 接下来使用man curl找 ...
- MySQL数据库企业级应用实践(多实例源码编译)
MySQL数据库企业级应用实践(多实例源码编译) 链接:https://pan.baidu.com/s/1ANGg3Kd_28BzQrA5ya17fQ 提取码:ekpy 复制这段内容后打开百度网盘手机 ...
- 源码编译安装 MySQL 5.5.x 实践
1.安装cmakeMySQL从5.5版本开始,通过./configure进行编译配置方式已经被取消,取而代之的是cmake工具.因此,我们首先要在系统中源码编译安装cmake工具. # wget ht ...
- 源码编译安装 MySQL 5.5.x 实践(转)
1.安装cmakeMySQL从5.5版本开始,通过./configure进行编译配置方式已经被取消,取而代之的是cmake工具.因此,我们首先要在系统中源码编译安装cmake工具. # wget ht ...
- Flink 源码解析 —— 源码编译运行
更新一篇知识星球里面的源码分析文章,去年写的,周末自己录了个视频,大家看下效果好吗?如果好的话,后面补录发在知识星球里面的其他源码解析文章. 前言 之前自己本地 clone 了 Flink 的源码,编 ...
随机推荐
- SimpleDateFormat类简单学习
一.简介 SimpleDateFormat是一个格式化和解析日期的具体类,其可以将时间转化为指定格式的日期字符串,也可以将具有格式的日期字符串转换为时间. formatting (date → tex ...
- 网络协议 3 - 物理层 和 MAC 层
在上一篇博文中,我们见证了 IP 地址的诞生,机器一旦有了 IP,就可以在网络的环境里和其他的机器展开沟通了. 今天,我们来认识下 物理层 和 MAC 层. 日常生活中,身为 90 后 ...
- 数字图像处理:图像的灰度变换(Matlab实现)
(1)线性变换:通过建立灰度映射来调整源图像的灰度. k>1增强图像的对比度:k=1调节图像亮度,通过改变d值达到调节亮度目的:0 i = imread('theatre.jpg');i = i ...
- 微信小程序之文件系统初探
微信小程序之文件系统初探 1.文件下载 //下载文件 go_download: function() { var content = this; var baseUrl = "http:// ...
- 剑指offer 23:从上往下打印二叉树
题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 解题思路 按照从左往右从上到下的顺序打印节点,需要我们维护一个队列,这个队列放入元素的顺序是访问队头节点(起始先放入根节点),则若当前 ...
- 安装 tensorflow 1.1.0;以及安装其他相似版本tensorflow遇到的问题;tensorflow 1.13.2 cuda-10环境变量配置问题;Tensorflow 指定训练时如何指定使用的GPU;
# 安装 2.7 环境conda create -n python2. python= conda activate python2. # 安装 1.1.0 gpu版本pip # 配置环境变量expo ...
- Shell—输入输出重定向
大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回到您的终端.一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端.同样,一个命令通常将其输出写入到标准输出,默 ...
- Linux-3.14.12内存管理笔记【构建内存管理框架(1)】
传统的计算机结构中,整个物理内存都是一条线上的,CPU访问整个内存空间所需要的时间都是相同的.这种内存结构被称之为UMA(Uniform Memory Architecture,一致存储结构).但是随 ...
- 高通平台开机LOGO修改LK(bootloader)下实现【转】
网络上已经有许多在kernel中修改开机Logo的文章,本文就LK下实现开机logo进行简述 需要用到ffmpeg工具,没有安装ffmpeg请参考这里: http://blog.csdn.net/re ...
- [内核同步]自旋锁spin_lock、spin_lock_irq 和 spin_lock_irqsave 分析【转】
转自:https://www.cnblogs.com/x_wukong/p/8573602.html 转自;https://www.cnblogs.com/aaronLinux/p/5890924.h ...