chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

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

一、核心背景與代碼定位

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

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

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

?動態(tài)分區(qū)/虛擬AB機制的兼容性檢測;

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

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

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

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

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

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

1.android_boot_control_compute_crc

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

?輸入:指向android_bootloader_control的指針;

?輸出:32位CRC32校驗值;

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

2.android_boot_control_default

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

?輸入:指向android_bootloader_control的指針;

?核心邏輯

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

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

c.計算并填充CRC32校驗值。

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

1.android_boot_control_create_from_disk

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

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

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

?核心邏輯

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

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

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

2.android_boot_control_store

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

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

?輸出:0(成功)/-1(失?。?;

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

(三)槽位選擇核心類

1.android_ab_compare_slots

?作用:比較兩個槽位的優(yōu)先級,確定最優(yōu)啟動槽位。

?輸入:兩個android_slot_metadata指針;

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

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

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

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

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

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

?核心邏輯

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

b.校驗魔法值/版本號合法性,非法則返回失??;

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

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

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

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

(四)虛擬AB消息處理類

1.read_misc_virtual_ab_message/write_misc_virtual_ab_message

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

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

(五)動態(tài)分區(qū)檢測類

ab_is_support_dynamic_partition

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

?核心邏輯

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

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

c.否則返回不支持。

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

1.get_partition_unique_uuid

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

2.ab_update_root_uuid

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

3.ab_update_root_partition

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

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

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

1.ab_get_slot_suffix

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

2.ab_decrease_tries

?作用:啟動失敗時,遞減當前槽位的剩余嘗試次數(shù)(次數(shù)為0則該槽位不可用);

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

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

ab_can_find_recovery_part

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

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

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

以下是android_ab_select的核心流程:

wKgZPGlxXMmAMJJdAAMUjY3QIuY345.png

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

1.掌握A/B啟動的底層邏輯

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

2.硬件平臺適配的關鍵

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

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

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

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

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

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

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

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

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

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

4.定制化更新策略

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

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

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

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

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

這份代碼同時兼容:

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

?虛擬AB機制;

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

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

五、總結

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

審核編輯 黃宇

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

    關注

    12

    文章

    4021

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

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

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

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

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

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

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

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

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

    Android系統(tǒng)與應用開發(fā)培訓班

    的源代碼結構與編譯方法 實驗:a.三種方法編寫一個Hello Android的程序,深化認識Android平臺的結構
    發(fā)表于 03-23 14:12

    分享高性能Android應用開發(fā)超清版PDF

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

    怎樣去修改RK3229平臺Android6.0系統(tǒng)的默認時區(qū)呢

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

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

    ,否則引導linux的boot,啟動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ù)和用戶安裝的應用等重要信息。將該分區(qū)數(shù)據(jù)固化下來,便可以靈活地定制固件,而不用修改系統(tǒng)代碼,加入諸多預置參數(shù)。但是,直接燒寫
    發(fā)表于 06-27 10:21

    淺析RK3128 Android系統(tǒng)內(nèi)核驅動的相關知識

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

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

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

    深入剖析Android消息機制

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

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

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

    深入解析RK平臺Android/Linux Bootloader核心文件:android_bootloader.c

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

    深入解析rk平臺Android Bootloader核心代碼:從啟動流程到AVB驗證

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