Building AOSP for Nexus 3 (maguro)

最近终于将了解 AOSP 提到日程上。在折腾了两晚后总算给吃了很久灰的 Nexus 3 刷了自己编译出来的 4.3 系统,本文仅为记录这一过程。

设备

编译机: Ubuntu LTS 14.04
手机: Galaxy Nexus (maguro)
目标系统: Android 4.3 (Jelly Bean)

流程

按照官方流程,从开始到最终将系统运行于手机上,主要分四个流程:

  1. 配置编译环境
  2. 下载源码
  3. 编译源码
  4. 刷机并运行

下文亦依照该流程进行描述。

配置编译环境

选择分支

首先是选择我们的设备支持的最高版本,通过 Build Numbers 中可以查到官方对 Galaxy Nexus 的支持最高只到 4.3,对应的最新分支为 android-4.3_r1.1

安装 JDK

确定了 Android 版本为 4.3 后,在 JDK Requirements 中了解到编译 4.3 系统需要 JDK 6。

由于相关许可问题,Ubuntu 已经不能直接安装 Oracle JDK 6。然而 Webupd8 Team 为我们提供了相关的脚本下载 JDK。

1
2
3
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java6-installer

如果需要自动配置 Java 环境变量,可以使用下列命令:

1
sudo apt-get install oracle-java6-set-default

安装编译所需的包

由于使用的是 Ubuntu 14.04,根据官方文档,我们还需下载下列包:

1
2
3
4
sudo apt-get install git-core gnupg flex bison gperf build-essential \
zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 \
lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache \
libgl1-mesa-dev libxml2-utils xsltproc unzip

然而只有这部分包编译 4.3 的时候会出现 Can't locate Switch.pm in @INC (you may need to install the Switch module)
错误,解决办法是安装 perl 的 switch 库(参照此文):

1
sudo apt-get install libswitch-perl

优化编译环境(可选)

使用 ccache 能够加快 C/C++ 的编译速度,可以在 .bashrc 中添加以下配置打开 ccache:

1
2
export USE_CCACHE=1
export CCACHE_DIR=/<path_of_your_choice>/.ccache

并在源码根目录中指定 ccache 的大小(建议 50-100G):

1
prebuilts/misc/linux-x86/ccache/ccache -M 50G

下载源码

安装 repo

由于某些因素,Google 已“不可以”访问,这里我们改用清华源的 repo:

1
2
3
4
mkdir ~/bin
PATH=~/bin:$PATH
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o ~/bin/repo
chmod +x ~/bin/repo

并且,为了避免 repo 更新时访问 Google 官方的 git 源,将下列内容添加到 .bashrc 中:

1
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'

配置 Git

在开始下载源码前,确保已经安装 git 并已经配置 user.nameuser.email

1
2
3
sudo apt-get install git-core
git config --global user.name "Your Name"
git config --global user.email "you@example.com"

下载源码

在真正下载代码前,我们还需要根据前面确定的分支初始化 repo。同样的,改为清华源:

1
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-4.3_r1.1

初始化完毕后,使用下列代码下载代码:

1
repo sync

接下来就是漫长的等待……

编译源码

初始化编译环境变量

在开始编译前,我们需要初始化编译的环境变量:

1
source build/envsetup.sh

下载设备相关 so

由于设备的正确运行还需要相关硬件驱动支持,所以我们还需要下载手机各硬件的供应商提供的 so 库并添加到 AOSP 中。

下载完 Galaxy Nexus for Android 4.3 相关包后,解压并将所有脚本移至源码根目录下执行,并同意所有的条款。

当执行完所有的脚本后,相关的 so 会添加到 vendor/ 目录下。

选择编译目标

1
lunch full_maguro-userdebug

或直接执行 lunch 后选择对应的设备

开始编译

1
make -j8

其中 -j8 意思为指定使用 8 条线程同时编译,主要看 cpu 支持的并发数量。

接着又是漫长的等待~

刷机并运行

先将手机切换至 bootloader 模式并解锁:

1
2
adb reboot bootloader
fastboot oem unlock

接着在源码根目录中执行:

1
fastboot flashall -w

当命令执行完后,手机会自动重启,此时只需等待手机完成初始化,之后便可以看到编译的系统以及准确运行在设备上。

最后

至此,我们就已经完成了一次简单的 AOSP 编译及运行流程,顺着官方文档的说明做下来其实蛮简单的。