伦伦影院久久影视,天天操天天干天天射,ririsao久久精品一区 ,一本大道香蕉大久在红桃,999久久久免费精品国产色夜,色悠悠久久综合88,亚洲国产精品久久无套麻豆,亚洲香蕉毛片久久网站,一本一道久久综合狠狠老

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

RK3576 Android15?構建腳本(build.sh)全解析

jf_44130326 ? 來源:Linux1024 ? 作者:Linux1024 ? 2026-01-30 22:34 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、腳本整體定位

該腳本是瑞芯微RK3576平臺基于Android 15的自動化構建腳本,整合了UBoot、Kernel(含驅動)、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

內核設備樹文件名(默認空,后續從環境變量讀?。?/span>

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失?。簷z查UBOOT_DEFCONFIG是否正確、u-boot/make.sh是否有語法錯誤;

?Kernel失?。簷z查KERNEL_DTS是否存在、Clang版本是否匹配、驅動編譯依賴;

?Android失?。簷z查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

    文章

    4033

    瀏覽量

    134213
  • rk3576
    +關注

    關注

    1

    文章

    275

    瀏覽量

    1624
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    RK3576 Android15音頻開發必看:alsa_route核心文件解析與修改場景

    ——alsa_route(alsa_route.h/alsa_route.c)。 作為連接Android上層音頻框架與底層ALSA驅動的“橋梁”,alsa_route是RK3576 Android15音頻
    的頭像 發表于 02-26 08:08 ?197次閱讀
    <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 ?2483次閱讀
    深入<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 ?700次閱讀
    硬核進階:<b class='flag-5'>RK3576</b> <b class='flag-5'>Android15</b>?驅動與系統開發實戰指南

    迅為如何在RK3576上部署YOLOv5;基于RK3576構建智能門禁系統

    迅為如何在RK3576開發板上部署YOLOv5;基于RK3576構建智能門禁系統
    的頭像 發表于 11-25 14:06 ?1860次閱讀
    迅為如何在<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 ?2509次閱讀
    瑞芯微<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 ?1558次閱讀
    基于<b class='flag-5'>RK3576</b>開發板的QT GUI例程

    基于RK3576開發板的多路網絡攝像頭取流方案

    、示例文件目錄、CMakeLists.txt文件解析build.sh編譯腳本的使用,幫助用戶快速理解并擴展項目功能。
    的頭像 發表于 05-13 11:14 ?1949次閱讀
    基于<b class='flag-5'>RK3576</b>開發板的多路網絡攝像頭取流方案

    基于RK3576開發板的PWN使用說明

    RK3576開發板使用PWN教程及Demo
    的頭像 發表于 05-07 14:07 ?2373次閱讀
    基于<b class='flag-5'>RK3576</b>開發板的PWN使用說明