Android8.0的正式版在8月21日正式发布,我打算亲自动手编一个可以跑在nexus 6p上的rom测试一下,下面是编译过程中的一些记录一、下载前准备
1,我使用自己的mac进行编译,限于存储容量,另外准备了一个移动硬盘。首先要将移动硬盘格式化为区分大小写的,可以使用ma自带的磁盘工具来完成。
2,安装好jdk,最好使用最新的jdk版本来编译Android8.0,一开始没有使用最新的jdk,编译到40%左右的时候遇到了编译错误,重新升级jdk才解决。
3,确保电脑上make、git都已经正确安装
4,安装xz,源码编译到后面好像需要解压缩之类的,可以使用brew进行安装,命令是 brew install xz,非常简单。如果没有安装brew,可以参照我文章后面介绍的进行安装。
二、源码下载
1,由于谷歌被墙,所以我采用清华镜像来进行源码下载。清华镜像关于Android源码的网址为https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/
2,下载repo工具。repo是一个Python写的脚本,它建立在git上。通过下面几行命令进行repo的设置和下载
mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
上面网址有问题的话可以使用下面的来替换
https://mirrors.tuna.tsinghua.edu.cn/git/git-repo
3,修改repo脚本
打开~/bin/repo文件,将
REPO_URL = 'https://gerrit.googlesource.com/git-repo'
替换成
REPO_URL = 'https://gerrit-google.tuna.tsinghua.edu.cn/git-repo'
为了加快代码下载速度,我首先下载了清华镜像中的初始化包,网址为 https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar。
下载完成后进行解压,会出现一个aosp目录,进入到这个目录中继续进行代码的下载。
通过下面的命令可以下载代码的master分支代码
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest
如果需要某个特定的 Android 版本(列表),可以通过-b来选择分支
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-4.0.1_r1
接着开始进行代码的同步,使用下面的命令行
repo sync
如果没有问题的话,repo sync执行完毕后就会下载一份完整的代码。当然了,大多数情况下可能不会一次就成功,文章最后是我下载和编译过程中遇到的一些问题以及解决方案。
三、源码编译
1,进入到aosp目录,执行下面的命令
source build/envsetup.sh #初始化编译环境
lunch #选择编译目标,我选择的是Nexus6p所对应的angler,即aosp_angler-userdebug
make # 或者 make -j8
2,接下来就是漫长的等待,如果出现了问题就针对性解决,我编了四五次终于成功了,附一张截图
四、下面是Android8.0源码编译过程中出现的错误
1,我使用的清华镜像进行代码下载,在下载代码时出现了Exited sync due to fetch errors,原因应该是下载的负载过重,所以把下载的线程数减少就可以了,使用repo sync -f -j4解决了这个问题
2,Jack server failed to (re)start, see Jack server log Unsupported curl, please use a curl not based on SecureTransport Unsupported curl, please use a curl not based on SecureTransport ninja: build stopped: subcommand failed. make: *** [ninja.intermediate] Error 1这个错误说明使用的curl是基于SecureTransport的,需要重新安装一个其它的。在安装curl时可以使用brew进行安装,由于我电脑上没安装brew,所以我首先对brew进行了安装。brew类似于ubuntu上的apt-get,它的安装可以通过一行命令来完成:
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew安装完成后,通过下面两行命令完成新的curl的安装和环境变量配置
brew install curl--with-opensslexport
PATH=$(brew--prefix curl)/bin:$PATH
3,build/core/base_rules.mk:238: error: external/googletest/googletest: MODULE.TARGET.STATIC_LIBRARIES.libgtest already defined by external/googletest/googletest. 16:57:43 ckati failed with: exit status 1在编译过程中多次遇到这个问题,问题说的是某些东西重定义了,后来多方查找,原来是我在mac的环境变量中设置过NDK_ROOT和SDK_ROOT,也就是NDK和SDK的路径,然后后面编译Android源码时会与它们产生冲突,所以暂时把设置过的NDK和SDK环境变量取消掉,就可以解决这个问题了。
4,Out of memory error (version 1.3-rc6 'Douarn' (441800 22a11d4b264ae70e366aed3025ef47362d1522bb by [email protected])).GC overhead limit exceeded.
(1)首先停止jack server的运行;
(2)去prebuilts/sdk/tools目录下执行 jack-admin kill-server以杀死Jack server;
(3)然后打开jack-admin文件,在文件中搜索JACK_SERVER_COMMAND,然后将JACK_SERVER_COMMAND="java -XX:MaxJavaStackTraceDepth=-1 -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -cp $LAUNCHER_JAR $LAUNCHER_NAME",改为JACK_SERVER_COMMAND="java -Xmx3g -XX:MaxJavaStackTraceDepth=-1 -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -cp $LAUNCHER_JAR $LAUNCHER_NAME"。
也就是添加了-Xmx3g选项
5,编译过程中出现了一次java编译器报错,我使用的jdk版本是1.8.0_24,然后升级成了1.8.0_144,问题解决
6,Jack server failed to (re)start, try 'jack-diagnose' or see Jack server log
使用jack-admin kill-server命令杀死后重新make就好了。