SDK下载与编译环境搭建
1. 概述
本文介绍 M4-R2(RK3576)Android 14 SDK 的获取、Ubuntu 编译环境准备、源码目录结构和首次完整编译流程。
1.1 SDK 版本
| 项目 | 当前源码配置 |
|---|---|
| Android 版本 | Android 14,API Level 34 |
| 源码发布标识 | android-14.0-mid-rkr7.2 |
| AOSP 基线 | android-14.0.0_r27 |
| Linux 内核 | 6.1.141,源码位于 kernel-6.1/ |
| 产品目标 | rk3576_u |
| 调试版编译目标 | rk3576_u-userdebug |
| 目标架构 | ARM64,当前产品配置为 64 位系统 |
| 默认设备树 | rk3576-evb1-v10 |
1.2 源码目录
本文使用的 SDK 源码目录为:
/home/diskc/hjf/workspace/rockchip/rk3576/rk3576_android后续命令均在 Ubuntu 电脑的 Bash 终端执行。先设置 SDK 路径并进入目录:
export SDK_ROOT=/home/diskc/hjf/workspace/rockchip/rk3576/rk3576_android
cd "$SDK_ROOT"如果源码放在其他位置,将 SDK_ROOT 替换为实际路径。新打开终端后,需要重新设置路径并初始化编译环境。
2. 编译主机准备
2.1 推荐配置
| 项目 | 推荐配置 |
|---|---|
| 主机架构 | x86_64 |
| 操作系统 | Ubuntu 20.04 LTS 或 22.04 LTS,64 位 |
| 内存 | 32GB 以上;内存不足时降低编译并行数 |
| 磁盘 | SSD,建议预留至少 300GB 空闲空间,源码、构建缓存和镜像会持续占用空间 |
| 网络 | 用于下载依赖和获取源码;已取得完整源码时可跳过源码下载 |
源码应放在 Linux 文件系统中,路径避免使用空格和中文。复制或解压源码时保留符号链接和文件权限,根目录的 build.sh、mkimage.sh 均为符号链接。
2.2 安装编译依赖
sudo apt update
sudo apt install -y \
git gnupg flex bison gperf build-essential zip curl \
zlib1g-dev libc6-dev-i386 lib32z1-dev lib32stdc++6 \
libncurses5 libncurses5-dev libx11-dev x11proto-core-dev \
libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig \
python3 python-is-python3 python3-pip bc libssl-dev \
device-tree-compiler rsync file lzop liblz4-tool zstd \
cpio patch dos2unix pkg-configAndroid 构建使用 SDK 自带的 JDK 17 和 Clang,U-Boot 使用 SDK 自带的 GCC 工具链,无需另外下载 ARM GCC 或在全局切换 Java 版本。
3. SDK 获取与检查
3.1 获取源码
通过 资料下载 获取 M4-R2 对应的 Android SDK 源码及发布说明。若提供源码压缩包,请按压缩包格式解压到 Linux 文件系统;若提供 Git 或 Repo 下载方式,请使用发布说明中的仓库地址和分支。
本文指定的源码已经位于 SDK_ROOT,可直接执行后续检查。当前源码目录含 .git 和 android-14.0-mid-rkr7.2.xml,没有 .repo 目录,因此不需要执行 repo init 或 repo sync。
3.2 检查源码完整性
cd "$SDK_ROOT"
# 检查主要目录和构建入口
ls -d build device/rockchip/rk3576 kernel-6.1 u-boot prebuilts RKTools RKDocs
ls -l build.sh mkimage.sh
# 查看产品支持的编译目标
cat device/rockchip/rk3576/rk3576_u/AndroidProducts.mk
# 查看当前内核版本及源码清单
head -n 6 kernel-6.1/Makefile
ls android-14.0-mid-rkr7.2.xml产品配置中应包含 rk3576_u-userdebug 和 rk3576_u-user。首次开发使用 userdebug。
4. SDK 目录结构
rk3576_android/
├── build/ # Android Make、Soong 等构建系统
├── device/rockchip/rk3576/ # RK3576 板级与产品配置
├── device/rockchip/common/ # Rockchip 公共配置及编译脚本
├── kernel-6.1/ # Linux 6.1 内核源码、驱动和设备树
├── kernel/ # 内核相关配置及预编译组件
├── u-boot/ # U-Boot 源码
├── rkbin/ # DDR、SPL、BL31 等启动组件
├── frameworks/ # Android 框架
├── packages/ # 系统应用
├── system/ # Android 系统组件
├── hardware/rockchip/ # HAL、多媒体、图形和 NPU 相关组件
├── vendor/rockchip/ # Rockchip 厂商组件
├── external/ # 第三方组件
├── prebuilts/ # 预编译 JDK、Clang、GCC 等工具
├── RKTools/ # 固件打包、烧录和调试工具
├── RKDocs/ # 原厂开发文档
├── out/ # Android 编译输出
├── rockdev/ # 待打包镜像和完整固件
├── IMAGE/ # 历史归档输出,普通编译无需使用
├── android-14.0-mid-rkr7.2.xml # 源码版本清单
├── build.sh # Rockchip 编译入口
└── mkimage.sh # 镜像整理与打包入口4.1 板级配置
| 路径 | 用途 |
|---|---|
device/rockchip/rk3576/rk3576_u/AndroidProducts.mk | 产品及 lunch 目标定义 |
device/rockchip/rk3576/rk3576_u/BoardConfig.mk | M4-R2 产品配置、设备树和内核配置片段 |
device/rockchip/rk3576/rk3576_u/rk3576_u.mk | Android 产品功能和文件集成配置 |
kernel-6.1/arch/arm64/boot/dts/rockchip/rk3576-evb1-v10.dts | 当前产品使用的设备树 |
device/rockchip/common/build/rockchip/build.sh | 根目录 build.sh 实际指向的脚本 |
4.2 硬件相关组件
| 路径 | 用途 |
|---|---|
hardware/rockchip/rknpu2/ | NPU 用户态相关组件 |
hardware/rockchip/rknn-toolkit2/ | RKNN 模型工具相关资源 |
hardware/rockchip/librga/ | RGA 图像处理组件 |
hardware/rockchip/hwcomposer/ | Android 显示合成 |
hardware/rockchip/audio/ | Android 音频相关实现 |
external/camera_engine_rkaiq/ | 摄像头 ISP 调试和图像处理组件 |
5. 初始化工具链与编译环境
5.1 检查 SDK 自带工具
cd "$SDK_ROOT"
# Android 构建使用的 JDK 17
./prebuilts/jdk/jdk17/linux-x86/bin/java -version
# 当前内核构建脚本使用的 Clang
./prebuilts/clang/host/linux-x86/clang-r487747c/bin/clang --version
# U-Boot 构建脚本默认使用的 ARM64 GCC
./prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc --version通过 SDK 的构建入口编译时,脚本会选择相应工具链,不需要将上述路径逐个写入系统 PATH。
5.2 选择产品
cd "$SDK_ROOT"
source build/envsetup.sh
lunch rk3576_u-userdebug初始化后检查关键变量:
get_build_var TARGET_PRODUCT
get_build_var TARGET_BUILD_VARIANT
get_build_var PRODUCT_KERNEL_VERSION
get_build_var PRODUCT_KERNEL_DTS对应结果应为 rk3576_u、userdebug、6.1 和 rk3576-evb1-v10。
6. 首次完整编译
在已执行 source build/envsetup.sh 和 lunch rk3576_u-userdebug 的同一终端中运行:
./build.sh -UKAu -J8| 参数 | 作用 |
|---|---|
-U | 编译 U-Boot |
-K | 编译内核,当前脚本启用 Clang |
-A | 编译 Android |
-u | 打包完整固件 update.img |
-J8 | 使用 8 个并行任务,可按主机内存和 CPU 调整 |
当前源码没有 .repo 目录,首次编译命令不添加 -p。该参数用于发布归档,脚本会调用 .repo/repo/repo 导出清单和补丁。
6.1 查看编译结果
构建脚本成功结束后,在 SDK 根目录检查:
ls -lh rockdev/Image-rk3576_u/update.img
ls out/target/product/rk3576_u/| 输出路径 | 内容 |
|---|---|
out/target/product/rk3576_u/ | Android 产品构建输出 |
rockdev/Image-rk3576_u/ | 整理后的分区镜像和完整固件 |
rockdev/Image-rk3576_u/update.img | 本次构建生成的完整烧录固件 |
发布资料中的 rk3576_shimetapi_android_v1.0.img 是完整固件的发布文件名;自行编译后默认输出名称为 update.img。烧录自行编译的固件时,在 RKDevTool 中选择本次生成的 update.img。
6.2 烧录与启动验证
按 Android 系统烧录与启动 安装烧录驱动、连接开发板并烧录完整固件。启动后通过 HDMI 确认安卓横屏桌面正常显示,使用鼠标确认桌面可以操作。
7. 常见问题
7.1 找不到 build.sh 或符号链接失效
确认已经进入 SDK 根目录,并执行 ls -l build.sh。该链接应指向 device/rockchip/common/build/rockchip/build.sh。复制源码时需同时保留链接及其目标文件。
7.2 提示 repo 不存在
本地源码目录没有 .repo 时,不要执行 Repo 同步命令或使用 build.sh -p。普通完整编译使用 ./build.sh -UKAu -J8。
7.3 编译进程被终止
若日志出现 Killed 或内存不足提示,降低并行数,例如使用 ./build.sh -UKAu -J4,并检查主机可用内存和磁盘空间。
7.4 找不到工具链或动态库
先执行第 5 节的工具版本检查,确认 prebuilts/ 复制完整并保留可执行权限。若提示缺少 libncurses.so.5 等宿主机库,安装第 2 节中的对应依赖后重试。Android 构建优先使用 SDK 自带的 JDK 17,避免用自行安装的工具链替换默认配置。
扩展阅读
- Android SDK 编译 — 单模块编译与更多构建操作
- 开发环境搭建 — 串口、USB ADB 与网络 ADB 调试
- Android 系统基础操作 — 桌面和系统设置
