当前位置: 萬仟网 > IT编程>移动开发>Android > Android8.1源码编译实践(Mac)

Android8.1源码编译实践(Mac)

2019年07月10日 15:36  | 萬仟网IT编程  | 我要评论

第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:

  1. ~/.jack-settings
  2. ~/.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系统成功了。
xnip2019-05-18_22-22-31

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

◎已有 0 人评论

Copyright © 2019  萬仟网 保留所有权利. 粤ICP备17035492号-1
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com