Skip to main content

linux 源码编译

1 编译环境

这里提供两种编译方案,如果要直接编译就选方案一,如果想用docker编译就选方案二。

注意事项:

  1. SDK 采用交叉编译,所以要在 X86_64 电脑上使用 SDK,不要将 SDK 下载到板子上。
  2. 编译环境请使用 Ubuntu20.04/Ubuntu22.04(真机或 docker 容器),如果使用其他版本可能导致编译出错。
  3. 不要在虚拟机共享文件夹以及非英文目录存放、解压SDK。
  4. 获取、编译 SDK 请全程使用普通用户,不允许也不需要使用 root 权限(除非需要 apt 安装软件)

2 解压源码

准备事项,根据自己的情况有选择的配置

从下载页面下载源码,放到x86 Ubuntu主机或者虚拟机里面。
资料下载,点击跳转

mkdir YY3588_Debian12
tar zxf yy3588_linux6.1_release_v0.0_20250429_sdk.tar.gz -C YY3588_Debian12
.repo/repo/repo sync -l

3 编译方法

  • 方案一: 直接编译
  • 方案二: 使用docker搭建编译环境

软件依赖

安装源码编译需要的依赖

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
  • 完整编译
  • 分步编译
./yy3588-build.sh

完整编译得到完整的固件大小是4G多。烧录完整的固件花费的时间比较多,不利于驱动等程序调试。这里提供分步编译,需要

  • 单独编译 uboot
cd u-boot
./make.sh rk3588
  • 单独编译 kernel
cd kernel
make CROSS_COMPILE=../prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu- ARCH=arm64 rockchip_linux_defconfig rk3588_linux.config
make CROSS_COMPILE=../prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu- ARCH=arm64 rk3588s-yyt.img
  • 单独编译 reocvery
./build.sh recovery
  • 打包完整固件
./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
./yy3588-build.sh
  • 开启docker编译环境
./docker/docker-rm.sh
./docker/docker-start.sh
  • 单独编译 uboot
cd u-boot
./make.sh rk3588
  • 单独编译 kernel
cd kernel
make CROSS_COMPILE=../prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu- ARCH=arm64 rockchip_linux_defconfig rk3588_linux.config
make CROSS_COMPILE=../prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu- ARCH=arm64 rk3588s-yyt.img
  • 单独编译 reocvery
./build.sh recovery
  • 打包完整固件
./build.sh firmware
./build.sh updateimg

android 源码编译

1 编译环境

这里提供两种编译方案,如果要直接编译就选方案一,如果想用docker编译就选方案二。

注意事项:

  1. SDK 采用交叉编译,所以要在 X86_64 电脑上使用 SDK,不要将 SDK 下载到板子上。
  2. 编译环境请使用 Ubuntu20.04/Ubuntu22.04(真机或 docker 容器),如果使用其他版本可能导致编译出错。
  3. 不要在虚拟机共享文件夹以及非英文目录存放、解压SDK。
  4. 获取、编译 SDK 请全程使用普通用户,不允许也不需要使用 root 权限(除非需要 apt 安装软件)

2 前言

2.1 硬件要求

编译 Android 对机器的配置要求较高:

  • 64 位 CPU
  • Android13源码编译需要的内存比较大,我们实测Android14内存需要至少32G,推荐使用64G的内存
  • 250GB 空闲的磁盘空间

2.2 增加交换内存(可选)

如果使用的是16g物理内存,要完成编译Android14源,需要再增加16G的交换内存,以下是增加交换内存步骤。

  1. 创建一个用作交换文件的文件:
sudo fallocate -l 16G /swapfile
  1. 设置文件权限到600阻止常规用户读写这个文件:
sudo chmod 600 /swapfile
  1. 在这个文件上创建一个 Linux 交换区:
sudo mkswap /swapfile
  1. 通过运行下面的命令,激活交换区:
sudo swapon /swapfile
  1. 使用swapon命令来验证交换区是否已激活
sudo swapon --show
  1. 设置永久生效
sudo vim /etc/fstab
## 增加以下内容
/swapfile swap swap defaults 0 0

3 解压源码

从下载页面下载源码,放到x86 Ubuntu主机或者虚拟机里面。
资料下载,点击跳转

解压源码步骤:

mkdir YY3588_Android14
cat yy3588_android14.0_release_v0.0_20250514_sdk.tgz* | tar zxf - -C YY3588_Android14
cd YY3588_Android14
.repo/repo/repo sync -l

4 编译方法

  • 方案一: 直接编译
  • 方案二: 使用docker搭建编译环境
  • Tab

在编译源码前需要安装一系列环境依赖。

安装依赖。

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 rk3588_u-userdebug
./build.sh -UKAu

分区编译是将各个分区源码单独编译成分区固件,分区固件体积相比于完整固件小很多,在驱动调试中,单独烧写对应的分区固件,无须烧录其他分区。大大提高烧录固件速度,以及调试速度。

  • 导出Android编译环境
source build/envsetup.sh
lunch rk3588_u-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 rk3588_u-userdebug
./build.sh -UKAu
分步编译

分区编译是将各个分区源码单独编译成分区固件,分区固件体积相比于完整固件小很多,在驱动调试中,单独烧写对应的分区固件,无须烧录其他分区。大大提高烧录固件速度,以及调试速度。

  • 开启docker编译环境
./docker/docker-rm.sh
./docker/docker-start.sh
  • 单独编译 uboot
./build.sh -U
  • 单独编译 kernel
./build.sh -K
  • 单独编译 android
./build.sh -A
  • 打包成完整固件
./build.sh -u

Openharmony5.1 源码编译

安装依赖工具

sudo apt-get update && sudo apt-get install binutils git git-lfs gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip m4 bc gnutls-bin python3.8 python3-pip ruby

获取源代码

  1. 注册码云gitee账号。
  2. 注册码云SSH公钥,请参考码云帮助中心。
  3. 安装git客户端和git-lfs并配置用户信息。
git config --global user.name "yourname"
git config --global user.email "your-email-address"
git config --global credential.helper store
  1. 安装码云repo工具,可以执行如下命令。
curl -s https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 \>
/usr/local/bin/repo \#如果没有权限,可下载至其他目录,并将其配置到环境变量中

chmod a+x /usr/local/bin/repo

pip3 install -i https://repo.huaweicloud.com/repository/pypi/simple requests
  1. 获取源码操作步骤
repo init -u http://dd.youyeetoo.cn:8000/ohos_yy3588/manifest_yy3588 -b master -m default.xml
repo sync -c
repo forall -c 'git lfs pull'

编译构建

安装编译器及二进制工具

bash build/prebuilts_download.sh

构建工程

./build.sh --product-name YY3588 –ccache

烧录验证

  • 编译完成之后,固件生成到目录:
  • 使用RKDevTool.exe烧录固件,在镜像目录中存在一个config.cfg,在RKDevTool.exe导入该配置,导入完配置确定一下你的镜像目录是不是全部正确。
  • 板子按住RECOVERY键,然后上电,这时设备进入loader模式,RKDevTool.exe会显示发现一个LOADER设备,点击执行。

Ubuntu22.04 源码使用教程

源码编译

  1. 下载源码
    资料下载,点击跳转
  2. 把源码分卷压缩包进行md5校验,确保下载的源码完整。在X86 Ubuntu系统中输入下面命令进行校验
md5sum -c yy3588_linux6.1_ubuntu22.04_release_v1.0_20251210_sdk.tar.md5sum
  1. 校验没问题,开始解压源码
mkdir yy3588Ubuntu && tar -zxf yy3588_linux6.1_ubuntu22.04_release_v1.0_20251210_sdk.tar -C yy3588Ubuntu
.repo/repo/repo sync -l
  1. 源码解压出来后开始编译,这里提供两种编译方法,一个是直接编译,另一个是创建docker容器进行编译
  • 直接编译
  • 使用docker编译源码
  • 安装编译环境
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
  • 编译源码
./yy3588-build.sh
  • 生成固件路径在rockdev目录下,烧录rockdev/update.img文件。

  • 安装docker

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/docker-start.sh
  • 编译源码
./yy3588-build.sh
  • 生成固件路径在rockdev目录下,烧录rockdev/update.img文件。

Overlayfs 文件系统使用

Overlayfs的目录结构介绍

本源码使用Overlayfs文件系统,将Ubuntu固件的根文件系统分为三部分rootfs、oem、userdata,分别存放在rootfs、oem和userdata对应分区上。其中rootfs和oem为厂家维护,用户勿动。用户只需要在userdata对应位置修改即可。系统启动后会将三个分区的内容合并挂载到userdata分区,同路径下的同名文件会覆盖,同路径下的不同文件会进行合并到同一个目录下。

本Ubuntu源码的Overlayfs的目录结构介绍

oem对应的路径为 device/rockchip/common/extra-parts/oem/normal 如下图:
10-1.png

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

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下的文件,同路径下的不同文件会进行合并到同一个目录下。

Overlayfs操作

  • 修改文件

复制一份要修改的文件到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
./yy3588-build.sh

烧录固件,系统起来后,查看/media/retroarch.cfg内容是否改变。

  • 创建文件
    如果Ubuntu根文件系统下某路径下的文件不存在,用户只需要直接创建文件,或者拷贝文件到指定路径下。例如,需要在Ubuntu根文件系统下/bin/目录下内置一个hello.sh脚本。
    在源码目录下操作:
# 创建对应文件
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
./yy3588-build.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

# 编译源码
./yy3588-build.sh

烧录固件,系统起来后,查看/media/game_test.gba是否还存在。

  • 移动文件
    就是创建文件+删除文件两个操作。这里就不展开叙述了。