0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RK3576 Android15 构建脚本(build.sh)全解析

jf_44130326 来源:Linux1024 作者:Linux1024 2026-01-30 22:34 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一、脚本整体定位

该脚本是瑞芯微RK3576平台基于Android 15的自动化构建脚本,整合了UBootKernel(含驱动)、Android系统、OTA包、update.img固件等全流程构建逻辑,是平台固件编译的核心入口。开发者掌握该脚本,能精准控制编译流程、定位编译失败点、定制化构建策略(如仅编译内核/UBoot、调整编译参数),是RK3576 Android开发调试的核心抓手。

wKgZPGl8wZaADeGCAAD7cJq2vQ8958.png

二、脚本核心知识点拆解

1.脚本基础框架(Shell脚本核心)

脚本头声明#!/bin/bash声明脚本使用Bash解释器执行,是Linux Shell脚本的标准开头。

用法函数(usage:定义脚本参数说明,当传入非法参数或执行-h/--help(隐式)时打印用法并退出,提升脚本易用性。

知识点:Shell函数定义、echo输出格式化、exit退出码(exit 1表示异常退出)。

2.变量初始化(构建参数预设)

脚本开头定义了一系列布尔型/字符型变量,作为构建开关和参数容器:

变量名

作用

BUILD_UBOOT

UBoot编译开关(默认false

BUILD_KERNEL_WITH_CLANG

内核是否用Clang编译(默认false

BUILD_KERNEL

内核编译开关(默认false

BUILD_ANDROID

Android系统编译开关(默认false

BUILD_UPDATE_IMG

update.img固件打包开关(默认false

BUILD_OTA

OTA升级包编译开关(默认false

BUILD_PACKING

编译产物归档开关(默认false

KERNEL_DTS

内核设备树文件名(默认空,后续从环境变量读取)

BUILD_JOBS

编译并行任务数(默认16,控制make -j的并发数)

知识点:Shell变量赋值、布尔型变量的Shell表达(true/false为字符串,非原生布尔)。

3.命令行参数解析(getopts

whilegetopts"UCKABpouvV"argdo case$argin    U) BUILD_UBOOT=true;;    C) BUILD_KERNEL=true; BUILD_KERNEL_WITH_CLANG=true;;   # ... 其他参数处理    ?) usage ;;# 非法参数调用usage esacdone

核心知识点:getoptsShell内置的参数解析工具,支持短参数(如-U-K)解析:

UCKABpouvV中,带:的字符(如v)表示参数后需跟值(如-v userdebug);

case分支匹配参数,实现参数变量的映射;

非法参数触发usage函数,保证参数合法性。

4.环境前置检查与初始化

1)编译环境校验

if[ -z"$TARGET_RELEASE"];then echo"Please lunch your product first! e.g." echo"source build/envsetup.sh" echo"lunch rk3588_u-trunk_staging-userdebug"  (return1 2>/dev/null) ||exit1fi

知识点:

[ -z "$VAR" ]检查变量是否为空;

TARGET_RELEASEAndroid编译环境的核心变量,需通过lunch命令初始化,脚本强制要求先执行source build/envsetup.sh && lunch,避免环境缺失导致编译失败;

(return 1 2>/dev/null) || exit 1兼容脚本“source执行直接执行两种场景(source执行时return,直接执行时exit)。

2)编译工具链配置


	

知识点:

export设置环境变量,作用于当前Shell及子进程;

Android编译对JDK/Clang版本强依赖,脚本固化路径避免版本错误;

ANDROID_BUILD_TOPAndroid源码顶层路径,由envsetup.sh定义。

3Android编译变量读取

BUILD_NUMBER=`get_build_var BUILD_NUMBER`UBOOT_DEFCONFIG=`get_build_var PRODUCT_UBOOT_CONFIG`KERNEL_DEFCONFIG=`get_build_var PRODUCT_KERNEL_CONFIG`

知识点:

get_build_varAndroid编译系统的工具函数,用于读取Android.mk/BoardConfig.mk中定义的变量;

脚本通过该方式动态获取产品配置(如UBoot默认配置、内核defconfig),而非硬编码,适配多产品/多版本。

5.分模块编译逻辑

1UBoot编译

if["$BUILD_UBOOT"=true] ;then cdu-boot && make clean && make mrproper && make distclean && make$UBOOT_DEFCONFIG&& ./make.sh &&cd- if[ $? -eq 0 ];then   echo"Build uboot ok!" else   echo"Build uboot failed!"   exit1 fifi

核心知识点:

make clean/mrproper/distcleanUBoot编译清理,逐步清理临时文件/配置/编译产物,保证编译环境干净;

make $UBOOT_DEFCONFIG:加载UBoot默认配置(如rk3576_defconfig);

./make.sh:瑞芯微定制的UBoot编译脚本(替代原生make);

$? -eq 0:检查上一条命令的退出码(0为成功,非0为失败),失败则立即退出脚本,避免无效编译。

2Kernel编译(含驱动)

编译器适配(Clang/GCC

if["$BUILD_KERNEL_WITH_CLANG"=true] ;then if["$KERNEL_ARCH"="arm64"];then    ADDON_ARGS="CROSS_COMPILE=aarch64-linux-gnu- LLVM=1 LLVM_IAS=1" else    ADDON_ARGS="CC=clang LD=ld.lld" fifi

知识点:

ARM64架构内核用Clang编译时,需指定LLVM=1 LLVM_IAS=1(启用LLVM汇编器);

32ARM架构直接指定CC=clang LD=ld.lld

ADDON_ARGS整合编译参数,后续传递给make,实现参数复用。

内核主编译

cd$LOCAL_KERNEL_PATH&& make clean && make$ADDON_ARGSARCH=$KERNEL_ARCH$KERNEL_DEFCONFIG&& make$ADDON_ARGSARCH=$KERNEL_ARCH$KERNEL_DTS.img -j$BUILD_JOBS&&cd-

知识点:

$LOCAL_KERNEL_PATH:内核源码路径(如kernel-5.10),由PRODUCT_KERNEL_VERSION动态获取;

$KERNEL_DTS.img:编译指定设备树的内核镜像(RK平台内核镜像与DTS绑定);

-j$BUILD_JOBS:并行编译,默认16线程,可通过-J参数调整,平衡编译速度与系统负载。

外设驱动编译(WiFi/摄像头)

WiFi驱动:编译external/wifi_driver路径下的驱动,生成.ko文件并剥离调试信息(llvm-strip --strip-debug);

摄像头驱动:编译hardware/rockchip/rvcam/drivers路径下的驱动,拷贝到预编译目录;

知识点:内核模块(.ko)编译需指定M=$PWD(模块源码路径),依赖内核源码的编译环境;llvm-strip剥离调试信息减小文件体积。

3Android系统编译

if["$BUILD_ANDROID"=true] ;then if["$BUILD_OTA"=true] ;then   # OTA包编译逻辑:make → make dist → mkimage_ab.sh/mkimage.sh else   # 普通编译:make installclean → make -j$BUILD_JOBS fifi

核心知识点:

make installclean:清理out目录下的临时产物,保留配置,避免编译缓存导致的问题;

make dist:生成OTA包所需的target_files.zip(包含系统分区镜像);

mkimage_ab.sh/mkimage.sh:瑞芯微定制的镜像打包脚本,区分AB分区(无缝更新)和非AB分区;

每一步编译后检查$?,失败则退出,保证编译链路的可靠性。

4)固件打包(update.img/OTA

① update.img打包

if["$BUILD_UPDATE_IMG"=true] ;then cp-f$IMAGE_PATH/*$PACK_TOOL_DIR/rockdev/Image/ if[[$TARGET_PRODUCT=~"PX30"]];then   cd$PACK_TOOL_DIR/rockdev && ./mkupdate.sh px30 Image # ... 其他平台适配 fi mv$PACK_TOOL_DIR/rockdev/update.img$IMAGE_PATH/ -ffi

知识点:

PACK_TOOL_DIR=RKTools/linux/Linux_Pack_Firmware:瑞芯微官方打包工具路径;

mkupdate.sh:根据平台(PX30/RK356x/RK3576)调用不同的打包逻辑,生成可用于量产的update.img

正则匹配[[ $TARGET_PRODUCT =~ "PX30" ]]:适配多产品平台,提升脚本通用性。

② OTA包打包

AB分区:make dist生成target_files.zip →mkimage.sh ota生成OTA.zip

AB分区:make distmkimage_ab.sh ota生成AB格式OTA包;

知识点:Android OTA包依赖target_files.zip,包含分区镜像、升级脚本等,是系统空中升级的核心文件。

5)编译产物归档(BUILD_PACKING

if["$BUILD_PACKING"=true] ;then mkdir-p$STUB_PATH/IMAGES/ cp$IMAGE_PATH/*$STUB_PATH/IMAGES/ # 生成补丁/提交清单/编译命令日志  .repo/repo/repo forall -c"$PROJECT_TOP/device/rockchip/common/gen_patches_body.sh" cpout/commit_id.xml$STUB_PATH/manifest_${DATE}.xmlfi

知识点:

STUB_PATH:按产品_版本_时间命名归档路径,便于版本追溯;

repo forall:遍历所有Git仓库,执行补丁生成脚本,记录代码修改;

归档内容包含镜像文件、编译日志、内核配置、Git提交清单,用于版本管理和问题复现。

6.辅助逻辑(路径/时间/日志)

路径格式化STUB_PATH="$(echo $STUB_PATH | tr '[]' '[]')"将路径转为大写,统一命名规范;

时间戳DATE=$(date +%Y%m%d.%H%M)生成时间戳,用于归档路径和版本标识;

日志输出:大量echo "-------------------KERNEL_VERSION:$KERNEL_VERSION"输出关键参数,便于编译过程调试。

三、脚本整体流程图

wKgZPGl8wZaAc0RfAANPqXK_aSY587.png

四、掌握该脚本对开发调试的意义

1.精准控制编译流程,提升开发效率

开发阶段无需全量编译:调试UBoot时仅执行./build.sh -U,调试内核时执行./build.sh -K,调试Android时执行./build.sh -A,避免全量编译耗时(RK3576全量编译需1-2小时);

自定义编译参数:通过-J调整并发数(如低配机器执行./build.sh -A -J 8),通过-v指定编译版本(./build.sh -A -v user),适配不同调试场景。

2.快速定位编译失败点

脚本每一步编译后检查$?并输出日志,失败时直接退出并打印原因(如“Build kernel failed!”);

开发者可根据日志定位失败模块:

UBoot失败:检查UBOOT_DEFCONFIG是否正确、u-boot/make.sh是否有语法错误;

Kernel失败:检查KERNEL_DTS是否存在、Clang版本是否匹配、驱动编译依赖;

Android失败:检查lunch命令是否正确、Android源码是否完整。

3.定制化适配产品需求

新增产品/版本:修改PRODUCT_KERNEL_DTS/PRODUCT_UBOOT_CONFIG等变量,或在参数解析分支中新增产品适配逻辑;

定制固件打包:修改BUILD_PACKING逻辑,添加自定义归档内容(如新增模块的编译产物);

适配新编译工具:调整Clang/JDK路径,兼容新版编译链(如升级Clang版本时修改clang-r530567为新路径)。

4.理解RK平台编译体系,掌握量产固件制作

脚本整合了瑞芯微定制工具([mkupdate.sh](mkupdate.sh)[pack_resource.sh](pack_resource.sh))和Android原生编译逻辑,是RK平台源码量产固件的完整链路;

掌握脚本后,可自主制作OTA包、update.img量产固件,适配工厂烧录/用户升级场景;

归档逻辑(BUILD_PACKING)便于版本管理,调试时可追溯某版本固件的编译参数/代码提交/内核配置,快速复现线上问题。

5.适配AB分区/OTA升级等高级特性

脚本区分AB分区(BOARD_USES_AB_IMAGE)和非AB分区的编译逻辑,开发者可通过脚本理解Android 15无缝更新(AB OTA)的实现方式;

掌握OTA包生成流程,可定制升级脚本(如添加分区校验、预安装脚本),满足产品升级需求。

总结

该脚本是RK3576 Android 15平台的编译总控中心,涵盖了从环境初始化到固件量产的全流程。开发者掌握其逻辑,不仅能高效调试各模块(UBoot/Kernel/Android),还能定制化适配产品需求,是RK3576平台开发调试的核心技能。同时,脚本的模块化设计、参数解析、错误处理等Shell编程技巧,也为嵌入式Linux/Android开发提供了通用参考。

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Android
    +关注

    关注

    12

    文章

    4035

    浏览量

    134494
  • rk3576
    +关注

    关注

    1

    文章

    297

    浏览量

    1670
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    RK3576 Android15音频开发必看:alsa_route核心文件解析与修改场景

    ——alsa_route(alsa_route.h/alsa_route.c)。 作为连接Android上层音频框架与底层ALSA驱动的“桥梁”,alsa_route是RK3576 Android15音频
    的头像 发表于 02-26 08:08 374次阅读
    <b class='flag-5'>RK3576</b> <b class='flag-5'>Android15</b>音频开发必看:alsa_route核心文件<b class='flag-5'>解析</b>与修改场景

    深入解析RK平台编译核心:build.sh的知识点、调试技巧与开发价值

    在瑞芯微(RK)Linux SDK 开发中,build.sh是整个编译构建系统的“入口中枢”—— 它统一管理环境配置、命令解析、模块构建与日
    的头像 发表于 02-03 16:02 3326次阅读
    深入<b class='flag-5'>解析</b><b class='flag-5'>RK</b>平台编译核心:<b class='flag-5'>build.sh</b>的知识点、调试技巧与开发价值

    硬核进阶:RK3576 Android15 驱动与系统开发实战指南

    android15,想与大家探讨更多,不仅仅是驱动,更包含android其他方面。 各位嵌入式与Android开发的朋友们,我们的  RK3576
    的头像 发表于 01-26 22:29 819次阅读
    硬核进阶:<b class='flag-5'>RK3576</b> <b class='flag-5'>Android15</b> 驱动与系统开发实战指南

    迅为如何在RK3576上部署YOLOv5;基于RK3576构建智能门禁系统

    迅为如何在RK3576开发板上部署YOLOv5;基于RK3576构建智能门禁系统
    的头像 发表于 11-25 14:06 1975次阅读
    迅为如何在<b class='flag-5'>RK3576</b>上部署YOLOv5;基于<b class='flag-5'>RK3576</b><b class='flag-5'>构建</b>智能门禁系统

    【作品合集】米尔RK3576开发板测评

    测试 作者:鲁治驿【米尔RK3576开发板免费体验】测评综合解析 【米尔RK3576开发板免费体验】集成MQ-2烟雾传感器和ADS1263模块实现气体监测 【米尔RK3576开发板免费
    发表于 09-11 10:19

    瑞芯微RK3576RK3576S有什么区别,性能参数配置与型号差异解析

    瑞芯微第二代8nm高性能AIOT平台RK3576家族再添新成员-RK3576S,先说结论:相较主型号的RK3576/RK3576J,性能略有缩减,而功耗有所降低。主要应用于商显终端、智
    的头像 发表于 08-14 23:57 2721次阅读
    瑞芯微<b class='flag-5'>RK3576</b>与<b class='flag-5'>RK3576</b>S有什么区别,性能参数配置与型号差异<b class='flag-5'>解析</b>

    【米尔RK3576开发板免费体验】1、开发环境、镜像烧录、QT开发环境搭建以及应用部署

    Ubuntu22.04 系统中并解压 tar zxf MYD-LR3576-Distribution-L6.1.75-V1.1.0.tar.gz 运行解压文件夹中的build.sh构建脚本
    发表于 07-14 11:26

    RK这2款旗舰芯片RK3588 PK RK3576,谁是最优选

    ,了解两者的区别十分重要,以下将从多个方面进行详细对比。一、处理器性能解析(一)CPU 性能1. 核心架构◦ RK3576:采用四核 Cortex - A72 和四核 Cortex - A53 架构
    发表于 07-10 18:24

    Mpp支持RK3576

    想问下,https://github.com/rockchip-linux/mpp这里面支持RK3576么,看介绍没有提到说支持RK3576 目前是买了个rk3576的机顶盒,搭载了安卓14,想做安卓视频硬解。
    发表于 06-13 15:35

    RK3576 vs RK3588:为何越来越多的开发者转向RK3576

    瑞芯微(Rockchip)最新发布的 RK3576 一经推出,就吸引了大量原本关注 RK3588 的开发者。RK3588 作为旗舰级芯片,性能固然强大,但 RK3576 凭借其超高的能
    发表于 05-30 08:46

    适配多种系统,米尔瑞芯微RK3576核心板解锁多样化应用

    。 myir-image-lr3576-android 基于 Android 14 构建的镜像,包含完整的硬件驱动,支持通用功能 米尔基于瑞芯微 RK3576 开发板 Linux
    发表于 05-23 16:07

    RK3576 Android 14.0 SDK开发指南(第一集)

    的kernel,kernel源码在工程中kernel-6.1目录下 Lunch项说明 一键编译命令 ./build.sh -UKAupSoc RK3576 SDK默认没有开启GKI,如需要开启GKI功能
    发表于 05-20 08:43

    基于RK3576开发板的QT GUI例程

    文件的配置解析,帮助开发者理解和管理Qt项目。此外,还详细说明了build.sh编译脚本的功能,包括路径定位、编译参数设置和编译操作,确保开发者能够顺利编译和部署Qt应用程序。
    的头像 发表于 05-14 10:26 1647次阅读
    基于<b class='flag-5'>RK3576</b>开发板的QT GUI例程

    基于RK3576开发板的多路网络摄像头取流方案

    、示例文件目录、CMakeLists.txt文件解析build.sh编译脚本的使用,帮助用户快速理解并扩展项目功能。
    的头像 发表于 05-13 11:14 2009次阅读
    基于<b class='flag-5'>RK3576</b>开发板的多路网络摄像头取流方案

    基于RK3576开发板的PWN使用说明

    RK3576开发板使用PWN教程及Demo
    的头像 发表于 05-07 14:07 2496次阅读
    基于<b class='flag-5'>RK3576</b>开发板的PWN使用说明