91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

深入解析rk平臺(tái)Android A/B分區(qū)核心代碼:android_ab.c全維度剖析

jf_44130326 ? 來(lái)源:Linux1024 ? 作者:Linux1024 ? 2026-01-22 07:06 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Android系統(tǒng)的無(wú)縫更新(Seamless Updates)方案中,A/B(Slot A/B)分區(qū)機(jī)制是核心——它通過(guò)雙系統(tǒng)槽位實(shí)現(xiàn)更新時(shí)不中斷用戶使用,更新失敗也能快速回滾。而U-Boot作為嵌入式系統(tǒng)的第一階段引導(dǎo)程序,承擔(dān)了A/B分區(qū)槽位選擇、元數(shù)據(jù)校驗(yàn)與管理的關(guān)鍵職責(zé)。本文將深度拆解U-Boot中android_ab.c的核心代碼,逐一解析每個(gè)函數(shù)的功能、核心邏輯,梳理關(guān)鍵流程,并探討開(kāi)發(fā)者關(guān)注這部分代碼的核心價(jià)值。

一、核心背景與代碼定位

android_ab.c是U-Boot中處理Android A/B分區(qū)引導(dǎo)的核心模塊,聚焦于bootloader階段的A/B分區(qū)核心邏輯,主要負(fù)責(zé):

?A/B分區(qū)元數(shù)據(jù)(bootloader_control)的讀寫、校驗(yàn)與初始化;

?最優(yōu)啟動(dòng)槽位(Slot A/B)的篩選與選擇;

?動(dòng)態(tài)分區(qū)/虛擬AB機(jī)制的兼容性檢測(cè);

?根分區(qū)路徑的動(dòng)態(tài)構(gòu)造與更新;

?啟動(dòng)嘗試次數(shù)管理、Recovery分區(qū)適配等輔助邏輯。

這份代碼是連接硬件底層與Android/Linux A/B系統(tǒng)的關(guān)鍵橋梁,直接決定了設(shè)備啟動(dòng)時(shí)的槽位選擇邏輯和更新穩(wěn)定性。

二、逐函數(shù)深度解析

我們按功能模塊對(duì)核心函數(shù)分類解析,清晰梳理每個(gè)函數(shù)的定位與邏輯:

(一)元數(shù)據(jù)初始化與校驗(yàn)類

1.android_boot_control_compute_crc

?作用:計(jì)算bootloader_control結(jié)構(gòu)體的CRC32校驗(yàn)值(僅校驗(yàn)crc32_le字段前的字節(jié)),防止元數(shù)據(jù)篡改或損壞。

?輸入:指向android_bootloader_control的指針;

?輸出:32位CRC32校驗(yàn)值;

?核心邏輯:調(diào)用crc32函數(shù),以offsetof定位crc32_le字段偏移,僅計(jì)算該偏移前的字節(jié)校驗(yàn)和。

2.android_boot_control_default

?作用:當(dāng)A/B元數(shù)據(jù)損壞時(shí),初始化默認(rèn)值,保證系統(tǒng)能從默認(rèn)槽位啟動(dòng)。

?輸入:指向android_bootloader_control的指針;

?核心邏輯

a.設(shè)置魔法值(magic)、版本號(hào)(version)、槽位數(shù)量;

b.初始化所有槽位元數(shù)據(jù)(優(yōu)先級(jí)15、嘗試次數(shù)7、未標(biāo)記成功啟動(dòng)等);

c.計(jì)算并填充CRC32校驗(yàn)值。

(二)元數(shù)據(jù)磁盤讀寫類

1.android_boot_control_create_from_disk

?作用:從misc分區(qū)讀取A/B元數(shù)據(jù)到內(nèi)存,為后續(xù)校驗(yàn)/修改做準(zhǔn)備,自動(dòng)處理塊對(duì)齊、分區(qū)大小檢查。

?輸入:塊設(shè)備描述符、分區(qū)信息;

?輸出:元數(shù)據(jù)緩沖區(qū)指針(失敗返回NULL);

?核心邏輯

a.計(jì)算元數(shù)據(jù)在misc分區(qū)的偏移(2KiB處),檢查塊對(duì)齊;

b.計(jì)算需讀取的塊數(shù)(向上取整),校驗(yàn)分區(qū)大小是否足夠;

c.分配內(nèi)存并讀取數(shù)據(jù),失敗則釋放內(nèi)存返回NULL。

2.android_boot_control_store

?作用:將修改后的元數(shù)據(jù)寫回misc分區(qū)原位置,完成元數(shù)據(jù)更新。

?輸入:元數(shù)據(jù)緩沖區(qū)、塊設(shè)備描述符、分區(qū)信息;

?輸出:0(成功)/-1(失?。?/p>

?核心邏輯:計(jì)算偏移和塊數(shù),調(diào)用blk_dwrite寫回?cái)?shù)據(jù),檢查寫入塊數(shù)是否匹配。

(三)槽位選擇核心類

1.android_ab_compare_slots

?作用:比較兩個(gè)槽位的優(yōu)先級(jí),確定最優(yōu)啟動(dòng)槽位。

?輸入:兩個(gè)android_slot_metadata指針;

?輸出:負(fù)數(shù)(a更優(yōu))、正數(shù)(b更優(yōu))、0(同等);

?核心邏輯:按「優(yōu)先級(jí)→成功啟動(dòng)標(biāo)記→剩余嘗試次數(shù)」的順序比較,高優(yōu)先級(jí)/已成功啟動(dòng)/嘗試次數(shù)多的槽位更優(yōu)。

2.android_ab_select(核心函數(shù))

?作用:讀取元數(shù)據(jù)、校驗(yàn)完整性、篩選可啟動(dòng)槽位、選擇最優(yōu)槽位,并更新嘗試次數(shù)/槽位后綴。

?輸入:塊設(shè)備描述符、分區(qū)信息;

?輸出:選中的槽位索引(失敗返回-1);

?核心邏輯

a.讀取misc分區(qū)元數(shù)據(jù),校驗(yàn)CRC32(不匹配則初始化默認(rèn)值);

b.校驗(yàn)?zāi)Хㄖ?版本號(hào)合法性,非法則返回失?。?/p>

c.篩選可啟動(dòng)槽位(未損壞+嘗試次數(shù)>0);

d.遍歷槽位,調(diào)用android_ab_compare_slots選擇最優(yōu);

e.若選中槽位未標(biāo)記成功啟動(dòng),遞減嘗試次數(shù);

f.若元數(shù)據(jù)有修改,重新計(jì)算CRC并寫回磁盤。

(四)虛擬AB消息處理類

1.read_misc_virtual_ab_message/write_misc_virtual_ab_message

?作用:讀取/寫入misc分區(qū)中的虛擬AB元數(shù)據(jù)(適配Android虛擬A/B分區(qū)場(chǎng)景);

?核心邏輯:定位boot設(shè)備與misc分區(qū),計(jì)算偏移和塊數(shù),調(diào)用blk_dread/blk_dwrite完成讀寫。

(五)動(dòng)態(tài)分區(qū)檢測(cè)類

ab_is_support_dynamic_partition

?作用:檢測(cè)設(shè)備是否支持Android動(dòng)態(tài)分區(qū)(super分區(qū));

?核心邏輯

a.優(yōu)先檢查是否存在super分區(qū)(存在則支持);

b.無(wú)super分區(qū)則檢查boot鏡像cmdline是否包含androidboot.super_partition(有則支持);

c.否則返回不支持。

(六)根分區(qū)路徑更新類

1.get_partition_unique_uuid

?作用:讀取指定分區(qū)的UUID,用于構(gòu)造root=PARTUUID=xxx啟動(dòng)參數(shù)。

2.ab_update_root_uuid

?作用:兼容Android/Linux A/B場(chǎng)景,若bootargs無(wú)root=,則讀取system分區(qū)UUID并添加到啟動(dòng)參數(shù)。

3.ab_update_root_partition

?作用:根據(jù)存儲(chǔ)類型(MMC/SPINAND/MTD)構(gòu)造不同的root=路徑,更新bootargs;

?核心邏輯:跳過(guò)動(dòng)態(tài)分區(qū)場(chǎng)景,按存儲(chǔ)類型構(gòu)造路徑(如/dev/mmcblk0p%d、ubi.mtd=%d)。

(七)槽位與嘗試次數(shù)管理類

1.ab_get_slot_suffix

?作用:獲取當(dāng)前槽位后綴(_a/_b),失敗則回退到lastboot標(biāo)記。

2.ab_decrease_tries

?作用:?jiǎn)?dòng)失敗時(shí),遞減當(dāng)前槽位的剩余嘗試次數(shù)(次數(shù)為0則該槽位不可用);

?核心邏輯:獲取槽位→加載元數(shù)據(jù)→遞減嘗試次數(shù)→保存修改。

(八)Recovery分區(qū)檢測(cè)類

ab_can_find_recovery_part

?作用:檢測(cè)是否存在recovery分區(qū)(兼容Linux A/B場(chǎng)景,需recovery分區(qū)更新系統(tǒng));

?核心邏輯:定位boot設(shè)備,查詢r(jià)ecovery分區(qū)信息,存在則返回true。

三、核心流程可視化(android_ab_select)

以下是android_ab_select的核心流程:

wKgZPGlxXMmAMJJdAAMUjY3QIuY345.png

四、開(kāi)發(fā)者關(guān)注這部分代碼的核心意義

1.掌握A/B啟動(dòng)的底層邏輯

A/B分區(qū)的核心是bootloader階段的槽位選擇,這份代碼完整實(shí)現(xiàn)了「元數(shù)據(jù)校驗(yàn)→槽位篩選→最優(yōu)選擇→元數(shù)據(jù)更新」的全流程。理解它能解決「槽位切換失敗」「更新后啟動(dòng)回滾」「元數(shù)據(jù)損壞」等核心問(wèn)題。

2.硬件平臺(tái)適配的關(guān)鍵

不同芯片(如Rockchip)的存儲(chǔ)介質(zhì)(MMC/NAND/MTD/NVME)、分區(qū)布局差異極大,需基于此代碼適配:

?調(diào)整根分區(qū)路徑構(gòu)造邏輯(ab_update_root_partition);

?適配動(dòng)態(tài)分區(qū)/虛擬AB(ab_is_support_dynamic_partition);

?兼容不同存儲(chǔ)類型的槽位元數(shù)據(jù)讀寫。

3.調(diào)試啟動(dòng)故障的核心抓手

當(dāng)系統(tǒng)出現(xiàn)以下問(wèn)題時(shí),這份代碼是定位根因的關(guān)鍵:

?CRC校驗(yàn)失?。涸獢?shù)據(jù)損壞/篡改;

?無(wú)可用槽位:所有槽位嘗試次數(shù)為0或標(biāo)記損壞;

?分區(qū)大小不足:misc分區(qū)無(wú)法容納元數(shù)據(jù);

?槽位切換異常:android_ab_compare_slots優(yōu)先級(jí)邏輯不符合預(yù)期。

4.定制化更新策略

若需定制A/B規(guī)則(如調(diào)整槽位優(yōu)先級(jí)、修改嘗試次數(shù)閾值),可直接修改:

?android_boot_control_default:調(diào)整默認(rèn)槽位參數(shù);

?android_ab_compare_slots:修改槽位比較邏輯;

?ab_decrease_tries:調(diào)整嘗試次數(shù)遞減規(guī)則。

5.兼容新特性與跨系統(tǒng)場(chǎng)景

這份代碼同時(shí)兼容:

?Android 10+動(dòng)態(tài)分區(qū)(super分區(qū));

?虛擬AB機(jī)制;

?Android A/B(無(wú)recovery)與Linux A/B(需recovery)跨系統(tǒng)場(chǎng)景。

理解這些邏輯能保證系統(tǒng)適配新版本Android規(guī)范。

五、總結(jié)

android_ab.c是U-Boot層實(shí)現(xiàn)Android A/B無(wú)縫更新的核心,覆蓋了元數(shù)據(jù)管理、槽位選擇、動(dòng)態(tài)分區(qū)適配、根路徑構(gòu)造等全流程。對(duì)于嵌入式開(kāi)發(fā)者而言,深入分析這份代碼不僅能解決A/B啟動(dòng)的各類故障,還能基于硬件特性定制更新策略,是保證設(shè)備更新穩(wěn)定性與兼容性的關(guān)鍵。無(wú)論是Android設(shè)備開(kāi)發(fā)、Linux嵌入式系統(tǒng)適配,還是bootloader層的故障調(diào)試,這份代碼的分析都具有極高的實(shí)踐價(jià)值。

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Android
    +關(guān)注

    關(guān)注

    12

    文章

    4026

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    RK3588 Android+Linux雙系統(tǒng)方案的實(shí)現(xiàn)

    RK3588雙系統(tǒng)啟動(dòng)流程如下圖 ? uboot根據(jù)按鍵來(lái)識(shí)別要啟動(dòng)的系統(tǒng),這里可以使用撥碼開(kāi)關(guān)來(lái)代替。 uboot在加載分區(qū)的時(shí)根據(jù)分區(qū)名字來(lái)區(qū)分加載android或者linux的
    的頭像 發(fā)表于 10-10 14:25 ?1.2w次閱讀
    <b class='flag-5'>RK</b>3588 <b class='flag-5'>Android</b>+Linux雙系統(tǒng)方案的實(shí)現(xiàn)

    深度解析SPL階段A/B分區(qū)啟動(dòng):spl_ab.c代碼拆解

    ( Secondary Program Loader ,二級(jí)程序加載器)作為系統(tǒng)啟動(dòng)的早期階段,負(fù)責(zé)初始化硬件、選擇啟動(dòng)分區(qū), spl_ab.c 正是 SPL 層處理 A/B
    的頭像 發(fā)表于 01-20 07:07 ?9570次閱讀
    深度<b class='flag-5'>解析</b>SPL階段<b class='flag-5'>A</b>/<b class='flag-5'>B</b><b class='flag-5'>分區(qū)</b>啟動(dòng):spl_<b class='flag-5'>ab.c</b><b class='flag-5'>代碼</b><b class='flag-5'>全</b>拆解

    RK3576 Android 14.0 SDK開(kāi)發(fā)指南(第一集)

    RK3576 Android 14.0 SDK代碼編譯 SDK下載到本地后大概70多個(gè)G 下載后要做個(gè)校驗(yàn) 解壓后內(nèi)核源碼 kernel代碼路徑說(shuō)明
    發(fā)表于 05-20 08:43

    Android系統(tǒng)與應(yīng)用開(kāi)發(fā)內(nèi)容介紹

    及使用 5)AndroidManifest.xml分析10.Android的源代碼結(jié)構(gòu)與編譯方法 實(shí)驗(yàn):a.三種方法編寫一個(gè)Hello Andro
    發(fā)表于 07-13 14:03

    Android系統(tǒng)與應(yīng)用開(kāi)發(fā)培訓(xùn)班

    的源代碼結(jié)構(gòu)與編譯方法 實(shí)驗(yàn):a.三種方法編寫一個(gè)Hello Android的程序,深化認(rèn)識(shí)Android平臺(tái)的結(jié)構(gòu)
    發(fā)表于 03-23 14:12

    分享高性能Android應(yīng)用開(kāi)發(fā)超清版PDF

    Telephony原理剖析與最佳實(shí)踐深入理解ANDROID 卷3深入理解Android(卷2)(帶
    發(fā)表于 08-13 10:40

    怎樣去修改RK3229平臺(tái)Android6.0系統(tǒng)的默認(rèn)時(shí)區(qū)呢

    怎樣去修改RK3229平臺(tái)Android6.0系統(tǒng)的默認(rèn)時(shí)區(qū)呢?怎么去修改RK3229平臺(tái)Android
    發(fā)表于 03-09 06:11

    如何實(shí)現(xiàn)基于RK3588的Android系統(tǒng)與Linux系統(tǒng)切換呢

    ,否則引導(dǎo)linux的boot,啟動(dòng)linux系統(tǒng)diff --git a/arch/arm/mach-rockchip/rk3588/rk3588.c b/arch/arm
    發(fā)表于 05-26 10:16

    利用RK3288固化Android系統(tǒng)的data分區(qū)

    前言Android 的 data 分區(qū)保存著系統(tǒng)的配置數(shù)據(jù)和用戶安裝的應(yīng)用等重要信息。將該分區(qū)數(shù)據(jù)固化下來(lái),便可以靈活地定制固件,而不用修改系統(tǒng)代碼,加入諸多預(yù)置參數(shù)。但是,直接燒寫
    發(fā)表于 06-27 10:21

    淺析RK3128 Android系統(tǒng)內(nèi)核驅(qū)動(dòng)的相關(guān)知識(shí)

      一、rk3128 android4.4 平臺(tái)  主要用來(lái)做電視盒  二、內(nèi)核目錄結(jié)構(gòu)  ├── android android基本配置參
    發(fā)表于 09-30 16:04

    Android Runtime源碼解析》+深入體會(huì)第六章ART的執(zhí)行(4)

    、RISC-V等開(kāi)源社區(qū),主要研究?jī)?nèi)容為Clang/LLVM、JVM等。 在深入閱讀《Android Runtime源碼解析》這本書之后,我對(duì)Android Runtime的內(nèi)部機(jī)制有
    發(fā)表于 11-17 01:33

    深入剖析Android消息機(jī)制

    深入剖析Android消息機(jī)制
    發(fā)表于 01-22 21:11 ?11次下載

    Android案例分享,基于瑞芯微RK3568國(guó)產(chǎn)平臺(tái)!

    SDK:Rockchip_Android13_SDK_Release ? 硬件平臺(tái)介紹 創(chuàng)龍科技TL3568-EVM是一款基于瑞芯微RK3568J/RK3568B2處理器設(shè)計(jì)的四核AR
    的頭像 發(fā)表于 06-20 10:04 ?1749次閱讀
    <b class='flag-5'>Android</b>案例分享,基于瑞芯微<b class='flag-5'>RK</b>3568國(guó)產(chǎn)<b class='flag-5'>平臺(tái)</b>!

    深入解析RK平臺(tái)Android/Linux Bootloader核心文件:android_bootloader.c

    參數(shù)組裝等關(guān)鍵工作。(這個(gè)啟動(dòng)流程android和linux共用) 本文將從 文件定位、核心函數(shù)、執(zhí)行流程 三個(gè)維度,拆解這個(gè)文件的底層邏輯。 一、文件核
    的頭像 發(fā)表于 01-09 10:58 ?1196次閱讀
    <b class='flag-5'>深入</b><b class='flag-5'>解析</b><b class='flag-5'>RK</b><b class='flag-5'>平臺(tái)</b><b class='flag-5'>Android</b>/Linux Bootloader<b class='flag-5'>核心</b>文件:<b class='flag-5'>android_bootloader.c</b>

    深入解析rk平臺(tái)Android Bootloader核心代碼:從啟動(dòng)流程到AVB驗(yàn)證

    android_bootloader.c核心代碼,帶你讀懂Android設(shè)備從Bootloader到內(nèi)核的完整啟動(dòng)邏輯,以及開(kāi)發(fā)者關(guān)注這些代碼
    的頭像 發(fā)表于 01-22 07:06 ?261次閱讀
    <b class='flag-5'>深入</b><b class='flag-5'>解析</b><b class='flag-5'>rk</b><b class='flag-5'>平臺(tái)</b><b class='flag-5'>Android</b> Bootloader<b class='flag-5'>核心</b><b class='flag-5'>代碼</b>:從啟動(dòng)流程到AVB驗(yàn)證