编译Android源码需要经历以下几个步骤:
- 搭建编译环境
- 下载源代码
- 编译源码
- 刷入真机
有些步骤可能比较耗时,需要耐心等待;如果不出意外,按照本文介绍的步骤可顺利完成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 | sudo apt-get update |
然后更新默认的Java版本:
1 | sudo update-alternatives --config java |
使用命令java -version
查看Java版本:
1 | openjdk version "1.8.0_222" |
验证OpenJDK已经安装成功。
由于后面的repo
命令会用到Python,因此需要安装Python:
1 | sudo apt-get install python |
下载源代码
首先下载repo工具:
1 | mkdir ~/bin |
由于被墙的原因,这里使用的是清华镜像。
使用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 | mkdir WORKING_DIRECTORY |
WORKING_DIRECTORY
为自己喜欢的名字,如Android-8.1.0_r52
。
配置Git工具(如果Git命令运行不成功,使用sudo apt-get install git
安装Git工具):
1 | git config --global user.name "Your Name" |
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 |
-j4
的4表示使用4条线程。静静的等待代码同步完成,大概需要一两个小时。
如果Ubuntu安装在虚拟机中,可能需要多尝试几次才能同步成功。
下载完源码后,还需要下载谷歌驱动程序,找到Nexus 5X binaries for Android 8.1.0 (OPM7.181205.001),这里需要根据自己的设备和下载的源码版本进行选择。下载完成的压缩文件解压出来是shell
脚本,将shell
脚本拷贝到WORKING_DIRECTORY
目录下并执行,如:
1 | ./extract-lge-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 | export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4g" |
刷入真机
设置ANDROID_PRODUCT_OUT
变量:
1 | export ANDROID_PRODUCT_OUT=WORKING_DIRECTORY/out/target/product/bullhead |
注意:
WORKING_DIRECTORY
需要替换成绝对路径,bullhead是Nexus5X的代号,需要根据自己的机型进行修改。
在自己手机的开发者选项中开启OEM解锁选项。
下载最新的platform-tools,platform-tools里面包含了adb
和fastboot
等工具。将下载好的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 |
如果这个命令允许失败,有两种解决方法:
下载旧版本的platform-tools。只需要将下载链接:https://dl.google.com/android/repository/platform-tools_r29.0.5-linux.zip 中的版本号替换为旧版本号即可下载,如:https://dl.google.com/android/repository/platform-tools_r29.0.2-linux.zip
手动刷写各个
*.img
:1
2
3
4
5
6
7fastboot erase system -w
fastboot flash boot boot.img
fastboot flash system system.img
fastboot flash vendor vendor.img
fastboot flash userdata userdata.img
...
fastboot reboot
至此,整个Android源码编译与系统刷写都介绍完了,希望对您有所帮助。
参考文档
- 搭建编译环境
- 支持旧版本
- Android 镜像使用帮助
- Git Repo 镜像使用帮助
- 下载源代码
- gzip: stdout: No space left on device
- Factory Images for Nexus and Pixel Devices
- [自己写的fastboot flashall命令](