本教程演示如何编译 Android 源码,目的是教会你如何基于aosp(Android open source project)定制Android系统。教程演示所使用的手机是Nexus6,但本教程是通用教程,并不局限于Nexus6,只要你有合适的驱动包,你就可以面向任意机型做定制。
- Nexus 5X
- Nexus 6
- Nexus 6P
- Nexus 9
- Nexus Player
- Pixel
- Pixel C
- Pixel XL
名称 | 需求 |
---|---|
电脑CPU | 双核4线程2GHz或者更高配置的CPU |
电脑内存 | 16G物理内存 |
电脑磁盘 | 至少200G可用的磁盘空间,固态硬盘更好 |
电脑操作系统 | Ubuntu 16.04 |
Android手机 | Google Nexus 6 |
-
全新安装Ubuntu 16.04 操作系统(安装到虚拟机也可以,至少为虚拟机分配16G内存,否则容易出错,这可能要求你的宿主计算机具有24G以上的物理内存)
-
执行如下命令进行更新
sudo apt-get update
-
执行如下命令安装jdk8
sudo apt-get install openjdk-8-jdk
-
执行如下命令安装依赖项
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
-
如果想使用SELinux tool 则还应该安装 python-networkx ,通过执行如下命令进行安装
sudo apt-get install python-networkx
-
如果使用LDAP,则还应该安装 libnss-sss:i386 ,通过如下命令进行安装
sudo apt-get install libnss-sss:i386
-
Ubuntu默认不允许普通用户使用USB,所以还应该配置Android USB设备能够被当前用户访问到,则需要执行如下命令
wget -S -O - http://source.android.com/source/51-android.rules | sed "s/<username>/$USER/" | sudo tee >/dev/null /etc/udev/rules.d/51-android.rules; sudo udevadm control --reload-rules
注意:执行该命令需要翻墙
国内用户可执行如下命令
wget -S -O - http://yunpstatic.oss-cn-beijing.aliyuncs.com/res/android/source/51-android.txt | sed "s/<username>/$USER/" | sudo tee >/dev/null /etc/udev/rules.d/51-android.rules; sudo udevadm control --reload-rules
-
在当前用户目录下创建 bin 目录,可通过如下命令创建
mkdir ~/bin
-
通过如下命令下载 repo ,并将其放在 ~/bin 目录中
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
注意:执行该命令需要翻墙
国内用户可以使用这条命令来执行
curl http://yunpstatic.oss-cn-beijing.aliyuncs.com/res/android/source/repo > ~/bin/repo
-
通过如下命令给repo添加可执行权限
chmod a+x ~/bin/repo
-
通过如下命令初始化git用户名
git config --global user.name "Your Name"
-
通过如下命令初始化git邮箱
git config --global user.email "you@example.com"
- 创建一个目录用于存放Android源码,如我存放的路径是 /Work/AndroidSource/Nexus6/source ,并使用终端进入该目录
- 通过如下代码初始化 Nexus 6 源码仓库
其中 -b 参数指明将下载的代码分支 如果要下载master分支,则不需要加任何参数,则执行的命令如下
repo init -u https://android.googlesource.com/platform/manifest -b android-7.1.1_r28
您也可以根据自己的需要来选择合适的分支进行下载,分支与匹配机型参考表网址是repo init -u https://android.googlesource.com/platform/manifest
http://source.android.com/source/build-numbers.html#source-code-tags-and-builds
注意:访问该网址需要翻墙 - 执行如下命令下载(同步)代码
目前默认使用4个任务同步代码,如果你的机器足够好,可以指定更多的任务,如下命令演示使用8个任务同步代码
repo sync
说明:同步代码可能需要很长时间,你需要一个较好的网络环境和一个较稳定的翻墙工具,按平均状况来看大约需要2天时间,视频教程里有介绍如何使用我已经下载好的用百度云共享的代码,好的网络环境和好的电脑配置可在2小时内完成该任务repo sync -j8
- 访问页面 https://developers.google.com/android/drivers 查找配置自己机型的驱动(我这里查找的是Nexus 6的驱动)
注意:访问该页面需要翻墙 - 下载 Nexus6 驱动包,如下图所示这三项均需下载
- 驱动包文件都是压缩包,在压缩包中包括一个sh文件,该sh文件为自解压脚本,分别将这3个sh文件放在Android源码树的根目录,比如/Work/AndroidSource/Nexus6/source,并执行依次执行这3个文件以自动配置驱动包,配置完成后将在源码树根目录中多出一个vendor目录。
注意:在执行3个sh文件时会呈现协议条款,请慢慢看,不要跳过I ACCEPT那一步,否则不解压
- 执行如下命令进行清理
make clobber
- 执行如下命令加载环境变量
source build/envsetup.sh
- 执行如下命令选择构建目标
如果想选择其它目标,请直接执行
lunch aosp_shamu-userdebug
lunch
,将会呈现一个目标列表,可根据自己的手机型号进行选择,如果只想运行在模式器中,可以选择第一项或者直接执行lunch aosp_arm-eng
。 - 执行如下命令进行编译
该命令使用4个任务进行编译,如果电脑不够好,编译过程可能会持续10小时或更久,如果电脑足够好,也可以指定更多任务,如
make -j4
make -j32
是指定32个任务进行编译。
说明:如果你已经安装Android sdk,也可以使用sdk内置的命令。
- 执行如下命令编译 adb
make adb
- 执行如下命令编译 fastboot
make fastboot
- 进入手机
设置 -> 开发者选项
(如果没有该选项,请进入设置 -> 关于手机
,连续点击Build number
7次以启用开发者模式),启用USB调试和OEM解锁 - 将手机通过USB连接电脑,执行命令
adb reboot bootloader
以进入手机的Bootloader模式,也可以通过手机硬键操作进入Bootloader模式,查看不同手机操作方式列表请访问 http://source.android.com/source/running.html (注意:访问该网址需要翻墙)。 - 解锁Bootloader,执行命令
fastboot flashing unlock
,2014年或更老的手机请执行fastboot oem unlock
,你必须通过手机屏幕确认该操作。 - 执行如下命令格式化缓存
fastboot format cache
- 执行如下命令格式化用户数据
fastboot format userdata
- 执行如下命令将系统写入手机
写入成功后手机将重启进入您编译的操作系统
fastboot flashall -w
- 如果您想长期安全的使用该手机,可以通过命令
fastboot flashing lock
锁定Bootloader,2014年或更老的手机请执行fastboot oem lock
,之后进入手机系统,在开发者选项中取消OEM解锁。