日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

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

3天內不再提示

Binder?驅動深度解析:Android IPC?的核心底層實現

jf_44130326 ? 來源:Linux1024 ? 作者:Linux1024 ? 2026-03-12 08:11 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Android系統的底層架構中,Binder是當之無愧的IPC(跨進程通信)核心,堪稱Android組件通信的“心臟”。從應用啟動、服務調用到系統服務交互,幾乎所有跨進程操作都離不開Binder驅動的支撐。對于Android開發(fā)者而言,吃透Binder驅動的實現原理,不僅能深入理解Android系統的設計邏輯,更能高效定位性能問題、規(guī)避安全漏洞,實現系統級的開發(fā)優(yōu)化。

本文將基于Android 15 + Linux 6.1內核源碼(kernel/drivers/android/binder.c),從核心架構、事務流程、內存管理到實戰(zhàn)調優(yōu),全方位解析Binder驅動的底層邏輯,同時搭配核心流程圖,讓抽象的底層實現變得直觀易懂。

一、核心架構:Binder驅動的設計精髓

Binder驅動的高效性,源于其精妙的分層設計,從并發(fā)控制的三層鎖機制,到核心數據結構的聯動,構成了整個IPC通信的基礎。

1.三層鎖機制:并發(fā)控制的核心

Binder驅動通過分層自旋鎖實現線程安全,嚴格遵循固定獲取順序避免死鎖,這是其并發(fā)控制的精髓。每個鎖對應不同的保護范圍,函數名后綴也會明確標注所需持有的鎖,設計極具規(guī)范性。

// 鎖的獲取順序:proc->outer_lock → node->lock → proc->inner_lock1) proc->outer_lock : 保護 binder_ref2) node->lock: 保護 binder_node 的大部分字段3) proc->inner_lock : 保護線程/節(jié)點列表及所有 todo 列表// 函數后綴標識? _olocked() : 持有 node->outer_lock? _nlocked() : 持有 node->lock? _ilocked() : 持有 proc->inner_lock

2.三大核心數據結構:Binder通信的“骨架”

Binder驅動的所有操作,都圍繞binder_proc、binder_node、binder_ref三大核心數據結構展開,三者相互聯動,實現進程、Binder對象、跨進程引用的統一管理。

wKgZPGmyBYWADofoAAEWTeVHkK0213.png

(注:流程圖核心邏輯:每個進程對應一個binder_proc,每個Binder服務對象對應一個binder_node并歸屬某一binder_proc,跨進程訪問時通過binder_ref建立對目標binder_node的引用,實現進程間的對象關聯)

① binder_proc:進程的Binder上下文

每個使用Binder通信的進程,都會在內核中創(chuàng)建一個binder_proc結構體,作為該進程的Binder核心上下文,管理進程的所有Binder相關資源:

?線程管理:proc->threads(紅黑樹存儲)

?節(jié)點管理:proc->nodes(紅黑樹存儲)

?引用管理:proc->refs_by_desc / refs_by_node(雙紅黑樹)

?工作隊列:proc->todo(存儲待處理事務)

② binder_node:Binder對象的內核表示

每個Binder服務對象(如Service),在內核中都會對應一個binder_node,是對象的內核級抽象,核心字段如下:

structbinder_node{ structbinder_proc*proc;    // 所屬進程的binder_proc binder_uintptr_tptr;     // 對象在用戶空間的地址 binder_uintptr_tcookie;    // 用戶空間Cookie structhlist_headrefs;    // 該節(jié)點的跨進程引用列表 structbinder_node_workwork; // 節(jié)點相關工作項 // ...};

③ binder_ref:跨進程引用的橋梁

當進程需要訪問其他進程的Binder對象時,不會直接操作目標進程的binder_node,而是通過binder_ref建立引用,這是跨進程通信的關鍵橋梁:

structbinder_ref { structbinder_node *node;   // 指向目標binder_node structbinder_proc *proc;   // 所屬的本地進程binder_proc structbinder_ref_data data;  // 引用數據(包含句柄) // ...};

二、事務處理流程:Binder通信的核心執(zhí)行邏輯

Binder跨進程通信的本質,是事務的傳遞與處理。從事務創(chuàng)建、對象轉換,到分發(fā)執(zhí)行,整個流程由一系列核心函數驅動,形成了一套完整的事務生命周期。以下是Binder事務處理的完整流程圖和關鍵步驟解析:

wKgZPGmyBYaAVDGAAAyKf7DvRDU348.png

(注:流程圖核心步驟:事務創(chuàng)建初始化→ Binder對象轉Handle →文件描述符傳遞(如有)→事務分發(fā)→目標線程處理→結果返回(同步場景))

1.事務創(chuàng)建與初始化:binder_alloc_transaction

由binder_alloc_transaction函數完成,創(chuàng)建并初始化事務結構體,填充通信的核心元信息,為后續(xù)傳輸做準備:

?from:發(fā)起事務的源線程

?to_proc:目標進程的binder_proc

?to_thread:目標處理線程(可為空,由驅動后續(xù)選擇)

?buffer:事務數據的存儲緩沖區(qū)

?flags:事務標志(同步/異步、單向通信等)

2.對象轉換:Binder → Handle映射

跨進程通信中,Binder對象無法直接傳輸,需通過binder_translate_binder函數將Binder對象轉換為句柄(Handle),這是跨進程對象訪問的核心邏輯:

1.從源進程中獲取待傳輸的binder_node;

2.在目標進程中創(chuàng)建/查找對應的binder_ref;

3.將內核中的BINDER_TYPE_BINDER類型轉換為BINDER_TYPE_HANDLE;

4.更新句柄編號和對象引用計數。

3.文件描述符傳遞:binder_translate_fd

Binder支持跨進程傳遞文件描述符(如FD),由binder_translate_fd函數處理,保證文件描述符的安全傳遞和有效映射:

1.檢查目標進程是否有權限接收FD;

2.通過fget()獲取文件內核結構,做安全校驗;

3.創(chuàng)建binder_txn_fd_fixup結構,實現FD的延遲分配,避免資源泄漏。

4.事務分發(fā):binder_transaction

binder_transaction是Binder驅動中最復雜的函數之一,承擔事務的最終分發(fā)職責,處理數據拷貝、對象修復、線程選擇、優(yōu)先級繼承、死亡通知等核心邏輯,最終將事務加入目標進程的todo隊列,并喚醒目標線程處理。

5.內存管理:零拷貝的高效實現

Binder驅動的高性能,很大程度上源于基于mmap的內存共享機制,實現了內核空間與用戶空間的零拷貝通信,避免了數據的重復拷貝帶來的性能損耗。

// 進程打開Binder設備時調用mmap,建立內存映射mmap(NULL, map_size, PROT_READ, MAP_PRIVATE, binder_fd,0)

核心優(yōu)勢

?零拷貝:數據無需在用戶/內核空間之間來回復制;

?內存共享:通過映射實現跨進程的內存數據共享;

?按需分配:由binder_alloc管理內存池,實現內存的動態(tài)按需分配。

三、引用計數與生命周期:Binder對象的可靠管理

Binder驅動實現了類似智能指針的引用計數機制,分為強引用和弱引用,通過自動的引用計數傳播,保證Binder對象在跨進程通信中的生命周期安全,避免對象被提前釋放或內存泄漏。

1.強引用vs弱引用:分工明確的生命周期管理

由binder_inc_node_nilocked函數完成引用計數的增減,兩者分工明確,共同保障對象安全:

?強引用(strong):表示對象正在被使用,強引用計數為0時,對象可能被內核釋放;

?弱引用(weak):僅用于跟蹤對象的存在性,不影響對象的生命周期,用于處理“死亡通知”場景。

2.引用計數的自動傳播

當事務中包含Binder對象時,驅動會自動完成引用計數的傳播,通過binder_inc_node和binder_inc_ref_olocked函數,分別增加源對象和目標引用的計數:

// 增加binder_node的引用計數binder_inc_node(node, strong,internal, target_list);// 增加binder_ref的引用計數binder_inc_ref_olocked(ref, strong, target_list);

核心保障

1.發(fā)送方不會釋放正在被傳輸的對象;

2.接收方能夠正確管理接收到的對象引用;

3.有效處理跨進程的循環(huán)引用問題。

四、線程管理與調度:高效的任務處理機制

Binder驅動內置了智能的線程管理和調度策略,包括線程狀態(tài)管理、動態(tài)線程選擇、優(yōu)先級繼承,保證事務處理的高效性和公平性,避免線程過載或優(yōu)先級反轉。

1. Binder線程的六大狀態(tài)

Binder線程有明確的狀態(tài)標識,通過枚舉值定義,驅動根據狀態(tài)進行線程的調度和管理:

enum{  BINDER_LOOPER_STATE_REGISTERED =0x01, // 已注冊  BINDER_LOOPER_STATE_ENTERED   =0x02, // 已進入循環(huán)  BINDER_LOOPER_STATE_EXITED   =0x04, // 已退出  BINDER_LOOPER_STATE_INVALID   =0x08, // 無效  BINDER_LOOPER_STATE_WAITING   =0x10, // 等待中  BINDER_LOOPER_STATE_POLL    =0x20, // Poll 模式};

2.智能線程選擇策略:binder_select_thread_ilocked

驅動通過binder_select_thread_ilocked函數選擇事務處理線程,遵循**“復用優(yōu)先、負載均衡”**的原則,避免線程創(chuàng)建的開銷和單線程過載:

1.優(yōu)先選擇**等待中(WAITING)**的線程,最大化線程復用;

2.無等待線程時,根據負載動態(tài)創(chuàng)建新線程,實現負載均衡;

3.基于進程的線程池上限,避免無限制創(chuàng)建線程。

3.優(yōu)先級繼承:解決優(yōu)先級反轉問題

Binder支持優(yōu)先級繼承機制(由binder_transaction_priority實現),防止高優(yōu)先級進程因等待低優(yōu)先級進程的事務處理而出現“優(yōu)先級反轉”:

1.發(fā)送方的進程優(yōu)先級傳遞給目標接收方;

2.接收方處理該事務時,臨時提升線程優(yōu)先級;

3.事務處理完成后,恢復線程的原始優(yōu)先級。

五、死亡通知機制:進程崩潰的容錯處理

在跨進程通信中,若服務端進程意外死亡,客戶端需要及時感知并清理資源,否則會出現空指針、通信阻塞等問題。Binder驅動的死亡通知機制,實現了進程崩潰的實時感知,保證通信的容錯性。

wKgZPGmyBYaABNlqAAVY0pnhK0A016.png

(注:流程圖核心步驟:客戶端注冊死亡通知→服務端進程意外死亡→驅動檢測到死亡事件→向客戶端發(fā)送BR_DEAD_BINDER通知→客戶端清理資源)

核心實現流程

1.注冊通知:客戶端通過BC_REQUEST_DEATH_NOTIFICATION向驅動注冊對目標服務的死亡通知;

2.檢測死亡:Binder驅動實時監(jiān)控進程狀態(tài),檢測到服務端進程死亡后,標記對應的binder_node和binder_ref;

3.發(fā)送通知:驅動通過BR_DEAD_BINDER向客戶端發(fā)送死亡通知,攜帶相關標識;

4.資源清理:客戶端接收到通知后,及時清理對目標服務的引用和相關資源,避免無效調用。

六、性能優(yōu)化:讓Binder通信更高效

理解Binder驅動的底層邏輯后,可從開發(fā)層面針對性優(yōu)化,減少性能損耗,避免ANR、卡頓等問題。以下是經過實戰(zhàn)驗證的核心優(yōu)化技巧:

1.減少事務次數:合并小事務

多次小事務會帶來頻繁的跨進程通信開銷,建議將多個小事務合并為一個大事務,大幅減少通信次數:

// 優(yōu)化前:100次小事務,開銷大for(inti =0; i ();for(inti =0; i 

2.異步事務:使用單向通信

對于不需要返回結果的場景,設置異步(單向)事務標志,避免客戶端阻塞等待,提升響應速度:

// C層:設置異步標志t->flags |= TF_ONE_WAY;// Java層:使用oneway關鍵字定義AIDL方法onewayvoiddoSomething(intnum);

3.合理設置線程池:適配業(yè)務負載

根據應用的業(yè)務特點,調整Binder線程池的最大線程數,避免線程數不足導致事務排隊,或線程數過多導致資源浪費:

// 在Application的onCreate()中設置,示例:最大16個線程BinderInternal.setMaxThreads(16);

4.避免大對象傳輸:使用共享內存

大對象(如大文件、大數據數組)直接通過Binder傳輸會占用大量緩沖區(qū),導致性能下降。建議使用Ashmem共享內存實現大數據傳輸:

// 使用Ashmem創(chuàng)建共享內存,傳遞文件描述符MemoryFilememoryFile=newMemoryFile(size);ParcelFileDescriptorpfd=memoryFile.getFileDescriptor();

七、調試與分析:快速定位Binder相關問題

開發(fā)中遇到Binder相關的性能問題(如事務阻塞、ANR)或內存泄漏時,可通過內核調試接口和工具,快速定位問題根源,以下是最常用的調試技巧:

1. debugfs:查看Binder核心狀態(tài)

Binder驅動提供了豐富的debugfs調試接口(/sys/kernel/debug/binder/),可直接查看驅動狀態(tài)、事務日志:

# 查看Binder整體狀態(tài)cat/sys/kernel/debug/binder/state# 查看所有事務日志cat/sys/kernel/debug/binder/transaction_log# 查看失敗的事務日志,定位錯誤原因cat/sys/kernel/debug/binder/failed_transaction_log

2.性能分析:使用trace工具跟蹤事務

通過內核trace工具,實時跟蹤Binder事務的執(zhí)行過程,分析事務的耗時、阻塞點:

# 開啟Binder事件的trace跟蹤echo1 > /sys/kernel/debug/tracing/events/binder/enable# 查看trace日志,分析事務執(zhí)行流程cat/sys/kernel/debug/tracing/trace# 關閉traceecho0 > /sys/kernel/debug/tracing/events/binder/enable

3.內存分析:監(jiān)控Binder內存使用

通過/proc文件系統,查看指定進程的Binder內存映射情況,定位內存泄漏或內存占用過高問題:

# 替換為目標進程ID,查看Binder相關內存映射cat/proc//maps | grep binder

八、安全機制:內核層面的通信防護

Binder作為Android系統的核心通信機制,在內核層面實現了多重安全防護,防止未授權訪問、權限繞過等安全漏洞,保障系統和應用的通信安全。

1.內核級權限檢查

在事務傳輸過程中,驅動通過security_binder_transfer_binder函數進行內核級的權限校驗,若校驗失敗,直接拒絕事務傳輸:

if(security_binder_transfer_binder(proc->cred, target_proc->cred)) {  ret = -EPERM; // 權限不足,返回錯誤 gotodone;}

2. UID/PID嚴格驗證

每個Binder事務都會攜帶發(fā)起方的UID和PID信息,驅動會對UID/PID進行驗證,同時用于審計日志和資源統計,確保通信主體的合法性。

3.深度集成SELinux

Binder與Android的SELinux(安全增強型Linux)深度集成,實現細粒度的訪問控制,通過SELinux策略,限制進程之間的Binder通信權限,防止越權訪問。

九、實戰(zhàn)案例:解決Binder相關的經典問題

理論結合實戰(zhàn),以下是兩個開發(fā)中最常見的Binder相關問題,結合底層原理給出分析思路和解決方案:

案例1:應用啟動延遲(3-5秒)

問題現象:應用啟動緩慢,遠超正常啟動時間;

底層分析

1.通過dumpsys activity分析啟動流程,發(fā)現啟動階段存在大量Binder事務;

2.借助debugfs查看binder/state,確認事務出現排隊現象,導致啟動流程阻塞;

解決方案

?將啟動階段的同步Binder調用改為異步調用;

?預加載核心服務的Binder連接,避免啟動時動態(tài)建立連接;

?優(yōu)化應用初始化順序,將非核心的Binder調用延遲到應用啟動完成后。

案例2:界面卡頓、頻繁ANR

問題現象:應用界面卡頓,頻繁出現ANR彈窗;

底層分析

1.查看ANR日志(/data/anr/traces.txt),發(fā)現主線程等待Binder事務結果

2.排查服務端,發(fā)現服務端在主線程處理耗時操作,導致Binder事務處理阻塞;

解決方案

?將服務端的耗時操作移到工作線程,避免阻塞Binder事務處理;

?客戶端使用oneway異步調用,避免主線程阻塞等待;

?為Binder調用實現超時機制,防止無限期等待。

十、總結與展望

Binder驅動作為Android IPC通信的核心,其精妙的設計貫穿了高效、安全、可靠三大原則:

1.內存管理:基于mmap的零拷貝機制,實現跨進程的高效數據傳輸;

2.并發(fā)控制:三層鎖機制確保線程安全,避免死鎖和數據競爭;

3.線程調度:智能的線程選擇和優(yōu)先級繼承,保證事務處理的高效性;

4.生命周期管理:強/弱引用計數+自動傳播,保障對象的安全管理;

5.容錯機制:死亡通知機制,實現進程崩潰的實時感知和資源清理;

6.安全防護:內核級權限檢查、UID/PID驗證、SELinux集成,全方位保障通信安全。

對于Android開發(fā)者而言,理解Binder驅動的底層原理,不僅是進階的必備知識,更是解決復雜性能問題、實現系統級開發(fā)的關鍵。

未來展望

隨著Android 15升級到Linux 6.1內核,Binder驅動也在持續(xù)優(yōu)化,未來將朝著更高性能、更低延遲、更強安全的方向發(fā)展:

?進一步優(yōu)化內存管理和線程調度,降低通信開銷;

?增強異步事務的處理能力,提升并發(fā)通信效率;

?完善安全機制,實現更細粒度的權限控制和審計。

Binder驅動是Android系統的“神經系統”,吃透它,就能真正理解Android跨進程通信的底層邏輯,在開發(fā)中做到游刃有余。

審核編輯

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

    關注

    12

    文章

    4035

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    HarmonyOS跨進程通信—IPC與RPC通信開發(fā)

    使用Binder驅動,用于設備內的跨進程通信,后者使用軟總線驅動,用于跨設備跨進程通信。需要跨進程通信的原因是因為每個進程都有自己獨立的資源和內存空間,其他進程不能隨意訪問不同進程的內存和資源,
    的頭像 發(fā)表于 02-02 17:47 ?6198次閱讀
    HarmonyOS跨進程通信—<b class='flag-5'>IPC</b>與RPC通信開發(fā)

    深度解析?| DMA-BUF適配Android與RK特性核心Patch:高性能內存管理升級方案

    support ANDROID and RK feature,通過12個文件的深度改造與重構,為DMA-BUF機制注入了Android生態(tài)適配與RK平臺專屬優(yōu)化的雙重能力,同時完善了其底層
    的頭像 發(fā)表于 03-16 08:16 ?3042次閱讀
    <b class='flag-5'>深度</b><b class='flag-5'>解析</b>?| DMA-BUF適配<b class='flag-5'>Android</b>與RK特性<b class='flag-5'>核心</b>Patch:高性能內存管理升級方案

    Android核心模塊及相關技術

    標準的技術,Linux也是一個開放的操作系統。Android對操作系統的使用包括核心驅動程序兩部分,Android的Linux核心為標準的
    發(fā)表于 05-04 15:24

    [資料分享]+Android框架揭秘

    、binder driver概要及相關術語 192第7章 android binder ipc 1977.1 linux內存空間與binder
    發(fā)表于 09-26 09:47

    Android手機操控ARM開發(fā)板外圍硬件設備【創(chuàng)科之龍】原創(chuàng)

    的使命:調試確保手機端發(fā)送過來的可以收到數據,然后解析這個數據進行對底層實現操作設備節(jié)點,最后實現操作硬件。學完可以學生課做只能家居控制系統或者遠程控制家電等項目。 主要講解嵌入式li
    發(fā)表于 01-12 22:31

    Android_Linux BSP底層內核驅動及framework開發(fā)

    Android_Linux BSP底層內核驅動及framework開發(fā)
    發(fā)表于 11-02 10:35

    淺談Android與Linux系統之間的差異

    Linux內核具備的常用核心驅動外,還增加了自己專有的內核驅動程序,如顯示驅動、藍牙驅動、相機驅動
    發(fā)表于 07-05 06:06

    Android電源管理底層簡析

    Android 4.4.2Android電源管理底層用的是Linux power supply框架。驅動部分不敘述。只看JAVA、JNI和CPP應用層。
    發(fā)表于 03-02 07:30

    openHarmony IPC數據調用的過程分享

    OnRemoteRequest方法。這里就是大概ipc調用的過程,對驅動自身的闡述比較淺薄,驅動中的多線程模型還有自身數據結構的復雜性并沒有闡述。如果有機會研究后,再講講dsoftbus驅動
    發(fā)表于 03-30 09:26

    移植openharmony啟動后一直打印binder驅動程序報錯是怎么回事

    在移植openharmony過程中,由于添加了新組件,啟動后,一直打印binder驅動程序報錯,錯誤如下所示。01-01 00:00:45.218 1 1 E 00719/Init
    發(fā)表于 05-23 17:27

    Deep Dive into Android IPC_Binde

    深入介紹Android系統的IPC binder 框架,對了解Android系統內部運作機制有很大幫助。
    發(fā)表于 03-11 13:42 ?11次下載

    Android對內核修改的詳細說明

    Android binder,基于 Open Binder框架的一個驅動,用于提供 Android平臺的進程間通訊(
    發(fā)表于 03-08 17:10 ?14次下載

    Andorid系統中binder是什么意思

    binder是什么?可以理解為Andorid系統中的一種進程間通信的方式,雖然Android系統基于Linux,但是它并沒有采用Linux自帶的進程間通信方式,而是采用了更高效的binder,理解
    的頭像 發(fā)表于 10-07 15:13 ?1581次閱讀
    Andorid系統中<b class='flag-5'>binder</b>是什么意思

    Nginx核心功能深度解析

    Nginx核心功能深度解析
    的頭像 發(fā)表于 05-09 10:50 ?1038次閱讀

    底層邏輯到架構設計:聚徽解析MES看板的技術實現路徑

    與數據接口的協同設計。本文將從底層邏輯出發(fā),深入解析MES看板的技術架構與實現路徑。 一、底層邏輯:數據驅動的生產管理 MES看板的
    的頭像 發(fā)表于 06-16 15:23 ?836次閱讀
    金溪县| 元氏县| 云梦县| 武陟县| 萨嘎县| 高尔夫| 泸定县| 沾益县| 江源县| 青海省| 封开县| 太原市| 通许县| 察隅县| 夹江县| 金塔县| 和平区| 龙里县| 清流县| 读书| 兰坪| 南雄市| 武胜县| 新民市| 怀来县| 乌拉特中旗| 新丰县| 德昌县| 栾城县| 玉林市| 泾阳县| 双鸭山市| 秭归县| 保康县| 裕民县| 永修县| 淮北市| 北宁市| 塔河县| 绵阳市| 砚山县|