Android源码编译

编译Android源码需要经历以下几个步骤:

  1. 搭建编译环境
  2. 下载源代码
  3. 编译源码
  4. 刷入真机

有些步骤可能比较耗时,需要耐心等待;如果不出意外,按照本文介绍的步骤可顺利完成Android源码编译和刷写系统。


搭建编译环境

本次使用64位Ubuntu系统进行编译Android系统源码,具体的版本为Ubuntu 18.04.3 LTS

根据官方文档介绍,首先需要安装所需的软件包:

1
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 libgl1-mesa-dev libxml2-utils xsltproc unzip

其次需要安装OpenJDK:

1
2
sudo apt-get update
sudo apt-get install openjdk-8-jdk

然后更新默认的Java版本:

1
2
sudo update-alternatives --config java
sudo update-alternatives --config javac

使用命令java -version查看Java版本:

1
2
3
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (build 1.8.0_222-8u222-b10-1ubuntu1~18.04.1-b10)
OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)

验证OpenJDK已经安装成功。

由于后面的repo命令会用到Python,因此需要安装Python:

1
sudo apt-get install python

下载源代码

首先下载repo工具:

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

由于被墙的原因,这里使用的是清华镜像。

使用gedit编辑~/bin/repo文件:

1
gedit ~/bin/repo

需要将文件里面的:

1
REPO_URL='https://android.googlesource.com/git-repo'

替换为:

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

建立工作目录:

1
2
mkdir WORKING_DIRECTORY
cd WORKING_DIRECTORY

WORKING_DIRECTORY为自己喜欢的名字,如Android-8.1.0_r52

配置Git工具(如果Git命令运行不成功,使用sudo apt-get install git安装Git工具):

1
2
git config --global user.name "Your Name"
git config --global user.email "you@example.com"

Your Name`you@example.com`根据自己的真实意愿填写。

初始化仓库,并指定特定的Android版本(分支列表):

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

注意分支版本一定要与自己的设备对应上,我使用的是Nexus 5x,目前其最高支持的分支版本是android-8.1.0_r52

同步源码树:

1
repo sync -j4

-j44表示使用4条线程。静静的等待代码同步完成,大概需要一两个小时。

如果Ubuntu安装在虚拟机中,可能需要多尝试几次才能同步成功。

下载完源码后,还需要下载谷歌驱动程序,找到Nexus 5X binaries for Android 8.1.0 (OPM7.181205.001),这里需要根据自己的设备和下载的源码版本进行选择。下载完成的压缩文件解压出来是shell脚本,将shell脚本拷贝到WORKING_DIRECTORY目录下并执行,如:

1
2
./extract-lge-bullhead.sh
./extract-qcom-bullhead.sh

执行完成后将生产vendor目录。

至此所需的代码和文件都以准备完成,下面将进入编译环节。

编译源码

源码拉取完成后,在WORKING_DIRECTORY目录下使用 envsetup.sh 脚本初始化环境:

1
source build/envsetup.sh

使用 lunch 选择要编译的目标:

1
lunch aosp_arm-eng

我的真机为Nexus 5X,所以我的目标是:aosp_bullhead-userdebug,具体的机型对应关系查看选择设备编译系统

在进行编译前,先去除所有本地化设置:

1
export LC_ALL=C

然后执行命令进行编译:

1
make -j4

漫长的等待后,可能一次编译成功,也有可能会遇见各种错误,这时需要解决问题,进行再次尝试。

如果遇到如下错误:

1
Try increasing heap size with java option '-Xmx<size>

请执行下面命令后再重新执行make命令:

1
2
3
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

刷入真机

设置ANDROID_PRODUCT_OUT变量:

1
export ANDROID_PRODUCT_OUT=WORKING_DIRECTORY/out/target/product/bullhead

注意:WORKING_DIRECTORY需要替换成绝对路径,bullhead是Nexus5X的代号,需要根据自己的机型进行修改。

在自己手机的开发者选项中开启OEM解锁选项。

下载最新的platform-tools,platform-tools里面包含了adbfastboot等工具。将下载好的platform-tools压缩包解压到合适的目录,并将该目录添加到PATH环境变量中:

1
export PATH=PLATFORM_TOOLS_PATH:$PATH

然后使用USB数据线连接自己的手机,使用如下选项查看是否连接成功:

1
adb devices -l

如果没有连接成功,检查手机的USB调试是否打开。

然后进入bootloader模式:

1
adb reboot bootloader

进入Android设备的开发者选项中将OEM解锁-允许解锁引导加载程序开关打开,然后进行OEM解锁:

1
fastboot oem unlock

使用手机的音量键进行选择,选择YES后,使用电源键进行确认。

刷入镜像:

1
fastboot -w flashall

如果这个命令允许失败,有两种解决方法:

至此,整个Android源码编译与系统刷写都介绍完了,希望对您有所帮助。

参考文档

  1. 搭建编译环境
  2. 支持旧版本
  3. Android 镜像使用帮助
  4. Git Repo 镜像使用帮助
  5. 下载源代码
  6. gzip: stdout: No space left on device
  7. Factory Images for Nexus and Pixel Devices
  8. [自己写的fastboot flashall命令](