这里提供两种编译方案,如果要直接编译就选方案一,如果想用docker编译就选方案二。
注意事项:
1. SDK 采用交叉编译,所以要在 X86_64 电脑上使用 SDK,不要将 SDK 下载到板子上。
2. 编译环境请使用 Ubuntu20.04/Ubuntu22.04(真机或 docker 容器),如果使用其他版本可能导致编译出错。
3. 不要在虚拟机共享文件夹以及非英文目录存放、解压SDK。
4. 获取、编译 SDK 请全程使用普通用户,不允许也不需要使用 root 权限(除非需要 apt 安装软件)
编译 Android 对机器的配置要求较高:
如果编译主机使用的是16g物理内存,要完成编译Android15源,需要再增加16G的交换内存,以下是增加交换内存步骤。
sudo fallocate -l 16G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
sudo swapon --show
sudo vim /etc/fstab
## 增加以下内容
/swapfile swap swap defaults 0 0
从下载页面下载源码,放到x86 Ubuntu主机或者虚拟机里面。
解压源码步骤:
mkdir R2_Android15
cat r2_android15.0_release_v0.0_20260911_sdk.tgz* | tar zxf - -C R2_Android15
cd R2_Android15
.repo/repo/repo sync -l
在编译源码前需要安装一系列环境依赖。
安装依赖。
sudo apt-get update
sudo apt-get install git gnupg flex bison gperf libsdl1.2-dev \
libesd-java libwxgtk3.0-dev squashfs-tools build-essential zip curl \
libncurses5-dev zlib1g-dev pngcrush schedtool libxml2 libxml2-utils \
xsltproc lzop libc6-dev schedtool g++-multilib lib32z1-dev lib32ncurses5-dev \
lib32readline-dev gcc-multilib libswitch-perl libssl-dev unzip zip device-tree-compiler \
liblz4-tool python-pyelftools python3-pyelftools -y
完整编译是将一系列分区固件如uboot、boot分区固件合并成一个完整的固件,烧录完整固件相比于分区烧录操作简单。
source build/envsetup.sh
lunch youyeetoo_R2-ap4a-userdebug
./build.sh -UKAu
分区编译是将各个分区源码单独编译成分区固件,分区固件体积相比于完整固件小很多,在驱动调试中,单独烧写对应的分区固件,无须烧录其他分区。大大提高烧录固件速度,以及调试速度。
source build/envsetup.sh
lunch youyeetoo_R2-ap4a-userdebug
uboot./build.sh -U
kernel./build.sh -K
android./build.sh -A
./build.sh -u
在编译源码前需要安装一系列环境依赖。
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
sudo apt update
apt-cache policy docker-ce
sudo apt install docker-ce
sudo groupadd docker
sudo usermod -aG docker $USER
sudo reboot
sudo systemctl status docker
完整编译是将一系列分区固件如uboot、boot分区固件合并成一个完整的固件,烧录完整固件相比于分区烧录操作简单。
./docker/docker-rm.sh
./docker/docker-start.sh
source build/envsetup.sh
lunch youyeetoo_R2-ap4a-userdebug
./build.sh -UKAu
分区编译是将各个分区源码单独编译成分区固件,分区固件体积相比于完整固件小很多,在驱动调试中,单独烧写对应的分区固件,无须烧录其他分区。大大提高烧录固件速度,以及调试速度。
./docker/docker-rm.sh
./docker/docker-start.sh
source build/envsetup.sh
lunch youyeetoo_R2-ap4a-userdebug
uboot./build.sh -U
kernel./build.sh -K
android./build.sh -A
./build.sh -u
准备事项,根据自己的情况有选择的配置
从下载页面下载源码,放到x86 Ubuntu主机或者虚拟机里面。
mkdir R2_Debian13
tar zxf r2_linux6.1_release_v0.0_20260911_sdk.tar.gz -C R2_Debian13
.repo/repo/repo sync -l
安装源码编译需要的依赖
sudo apt update
sudo apt-get install git ssh make gcc libssl-dev liblz4-tool expect g++ patchelf chrpath gawk texinfo chrpath diffstat binfmt-support qemu-user-static live-build bison flex fakeroot cmake gcc-multilib g++-multilib python2 unzip device-tree-compiler ncurses-dev
./r2-build-debian13.sh
完整编译得到完整的固件大小是4G多。烧录完整的固件花费的时间比较多,不利于驱动等程序调试。这里提供分步编译,需要
./build.sh lunch:youyeetoo_R2_defconfig
uboot./build.sh uboot
kernel./build.sh kernel
reocvery./build.sh recovery
ln -sr rootfs/debian/debian13-trixie-arm64.img rockdev/rootfs.img
./build.sh firmware
./build.sh updateimg
安装源码编译需要的依赖
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
sudo apt update
apt-cache policy docker-ce
sudo apt install docker-ce
sudo groupadd docker
sudo usermod -aG docker $USER
sudo reboot
sudo systemctl status docker
./docker/docker-rm.sh
./docker/docker-start.sh
./r2-build-debian13.sh
./docker/docker-rm.sh
./docker/docker-start.sh
./build.sh lunch:youyeetoo_R2_defconfig
uboot./build.sh uboot
kernel./build.sh kernel
reocvery./build.sh recovery
ln -sr rootfs/debian/debian13-trixie-arm64.img rockdev/rootfs.img
./build.sh firmware
./build.sh updateimg
md5sum -c r2_linux6.1_ubuntu22.04_release_v1.0_20251210_sdk.tar.md5sum
mkdir R2-Ubuntu && tar -zxf r2_linux6.1_ubuntu22.04_release_v1.0_20260911_sdk.tar -C R2-Ubuntu
.repo/repo/repo sync -l
sudo apt-get install git gnupg flex bison gperf libsdl1.2-dev \
libesd-java libwxgtk3.0-dev squashfs-tools build-essential zip curl \
libncurses5-dev zlib1g-dev pngcrush schedtool libxml2 libxml2-utils \
xsltproc lzop libc6-dev schedtool g++-multilib lib32z1-dev lib32ncurses5-dev \
lib32readline-dev gcc-multilib libswitch-perl libssl-dev unzip zip device-tree-compiler \
liblz4-tool python-pyelftools python3-pyelftools -y
./r2-build-ubuntu22.04.sh
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
sudo apt update
apt-cache policy docker-ce
sudo apt install docker-ce
sudo groupadd docker
sudo usermod -aG docker $USER
sudo reboot
sudo systemctl status docker
./docker/docker-start.sh
./r2-build-ubuntu22.04.sh
本源码使用Overlayfs文件系统,将Ubuntu固件的根文件系统分为三部分rootfs、oem、userdata,分别存放在rootfs、oem和userdata对应分区上。其中rootfs和oem为厂家维护,用户勿动。用户只需要在userdata对应位置修改即可。系统启动后会将三个分区的内容合并挂载到userdata分区,同路径下的同名文件会覆盖,同路径下的不同文件会进行合并到同一个目录下。
本Ubuntu源码的Overlayfs的目录结构介绍
oem对应的路径为 device/rockchip/common/extra-parts/oem/normal 如下图:

userdata对应的路径 device/rockchip/common/extra-parts/userdata/normal/ 如下图:

rootfs对应的路径为 rockdev/rootfs.img
覆盖关系如下:
device/rockchip/common/extra-parts/userdata/normal/ 同路径下的同名文件会覆盖 device/rockchip/common/extra-parts/oem/normal 下的文件,同路径下的不同文件会进行合并到同一个目录下。
device/rockchip/common/extra-parts/oem/normal 同路径下的同名文件会覆盖rockdev/rootfs.img下的文件,同路径下的不同文件会进行合并到同一个目录下。
复制一份要修改的文件到device/rockchip/common/extra-parts/userdata/normal/目录下的对应位置,然后修改
例如:修改media/retroarch.cfg文件
cp device/rockchip/common/extra-parts/oem/normal/media/retroarch.cfg device/rockchip/common/extra-parts/userdata/normal/media/retroarch.cfg
# 修改retroarch.cfg内容
vim device/rockchip/common/extra-parts/userdata/normal/media/retroarch.cfg
# 编译源码
rm -fr output
# 编译Debian就用以下命令
./r2-build-debian13.sh
# 编译Ubuntu就用以下命令
./r2-build-ubuntu22.04.sh
烧录固件,系统起来后,查看/media/retroarch.cfg内容是否改变。
# 创建对应文件
echo 'echo "hello world!!!"' > device/rockchip/common/extra-parts/userdata/normal/usr/bin/hello.sh
# 添加可执行权限
chmod +x device/rockchip/common/extra-parts/userdata/normal/usr/bin/hello.sh
# 编译源码
rm -fr output
# 编译Debian就用以下命令
./r2-build-debian13.sh
# 编译Ubuntu就用以下命令
./r2-build-ubuntu22.04.sh
烧录固件,系统起来后可以看到/bin/hello.sh文件,执行/bin/hello.sh查看效果。
Overlayfs 删除文件是创建一个whiteout文件,用于屏蔽底层的同名文件,同时该文件在Overlayfs merge层是不可见的,所以用户就看不到被删除的文件或目录了。whiteout文件并非普通文件,而是主次设备号都为0的字符设备。
mknod <文件名> c 0 0
例如:我们要删除oem分区里面的media/game_test.gba,不建议直接删除,而是通过在userdata分区里面的lower目录里面创建一个名字为game_test.gba 的whiteout文件。
# 挂载userdata.img
mkdir rockdev/tmp
sudo mount rockdev/userdata.img rockdev/tmp
# 创建一个名字为game_test.gba 的whiteout文件。
sudo mknod rockdev/tmp/media/game_test.gba c 0 0
sudo umount rockdev/tmp
# 编译源码
rm -fr output
# 编译Debian就用以下命令
./r2-build-debian13.sh
# 编译Ubuntu就用以下命令
./r2-build-ubuntu22.04.sh
烧录固件,系统起来后,查看/media/game_test.gba是否还存在。