国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Android Binder通信原理(一):簡(jiǎn)介

這篇具有很好參考價(jià)值的文章主要介紹了Android Binder通信原理(一):簡(jiǎn)介。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

源碼基于:Android R

0. 前言

在Linux 系統(tǒng)中現(xiàn)有的進(jìn)程間通信(IPC)方式:

  • 管道(PIPE):在創(chuàng)建時(shí)分配一個(gè)page大小的內(nèi)存,緩存區(qū)大小比較有限;
  • 命名管道(FIFO):考慮 PIPE_BUF 和原子操作;
  • 消息隊(duì)列:信息復(fù)制兩次,額外的CPU消耗;不合適頻繁或信息量大的通信;
  • 共享內(nèi)存:?無(wú)須復(fù)制,共享緩沖區(qū)直接付附加到進(jìn)程虛擬地址空間,速度快;但進(jìn)程間的同步問(wèn)題操作系統(tǒng)無(wú)法實(shí)現(xiàn),必須各進(jìn)程利用同步工具解決;
  • 套接字:?作為更通用的接口,傳輸效率低,主要用于不通機(jī)器或跨網(wǎng)絡(luò)的通信;
  • 信號(hào)量:?常作為一種鎖機(jī)制,防止某進(jìn)程正在訪問(wèn)共享資源時(shí),其他進(jìn)程也訪問(wèn)該資源。因此,主要作為進(jìn)程間以及同一進(jìn)程內(nèi)不同線程之間的同步手段;?
  • 信號(hào):?不適用于信息交換,更適用于進(jìn)程中斷控制,比如非法內(nèi)存訪問(wèn),殺死某個(gè)進(jìn)程等;

0.1 使用Binder 原因

0.1.1 性能

Socket 作為一款通用接口,其傳輸效率低,開(kāi)銷(xiāo)大,主要用在跨網(wǎng)絡(luò)的進(jìn)程間通信和本機(jī)上進(jìn)程間的低速通信。

消息隊(duì)列和管道采用存儲(chǔ)-轉(zhuǎn)發(fā)方式,即數(shù)據(jù)先從發(fā)送方緩存區(qū)拷貝到內(nèi)核開(kāi)辟的緩存區(qū)中,然后再?gòu)膬?nèi)核緩存區(qū)拷貝到接收方緩存區(qū),至少有兩次拷貝過(guò)程。

共享內(nèi)存雖然無(wú)需拷貝,但控制復(fù)雜,難以使用。

Binder 只需要一次數(shù)據(jù)拷貝,性能上僅次于共享內(nèi)存。

0.1.2 穩(wěn)定性

Binder 基于 C/S 架構(gòu),客戶(hù)端(Client)有什么需求就丟給服務(wù)端(Server)去完成,架構(gòu)清晰、職責(zé)明確又相互獨(dú)立,自然穩(wěn)定性更好。共享內(nèi)存雖然無(wú)需拷貝,但是控制負(fù)責(zé),難以使用。

從穩(wěn)定性的角度講,Binder 機(jī)制是優(yōu)于內(nèi)存共享的。

0.1.3 安全性

Android 為每個(gè)安裝好的 APP 分配了自己的 UID,故而進(jìn)程的 UID 是鑒別進(jìn)程身份的重要標(biāo)志。傳統(tǒng)的 IPC 只能由用戶(hù)在數(shù)據(jù)包中填入 UID/PID,但這樣不可靠,容易被惡意程序利用。可靠的身份標(biāo)識(shí)只有由 IPC 機(jī)制在內(nèi)核中添加。其次傳統(tǒng)的 IPC 訪問(wèn)接入點(diǎn)是開(kāi)放的,只要知道這些接入點(diǎn)的程序都可以和對(duì)端建立連接,不管怎樣都無(wú)法阻止惡意程序通過(guò)猜測(cè)接收方地址獲得連接。同時(shí) Binder 既支持實(shí)名 Binder,又支持匿名 Binder,安全性高。

2. Binder 劃分

在Android 8.0 之前,Binder機(jī)制比較簡(jiǎn)單,只有一個(gè)驅(qū)動(dòng)設(shè)備"/dev/binder",一個(gè)守護(hù)進(jìn)行"/system/bin/servicemanager",一個(gè)binder庫(kù)"/system/lib64/libbinder.so".

在Android 8.0開(kāi)始,Android引入了Treble的機(jī)制,為了方便Android系統(tǒng)的快速移植、升級(jí),提升系統(tǒng)穩(wěn)定性,Binder機(jī)制被拓展成了"/dev/binder", "/dev/hwbinder","/dev/vndbinder"

我們?cè)仁褂玫?/dev/binder",成為框架進(jìn)程的專(zhuān)有節(jié)點(diǎn),這意味著供應(yīng)商進(jìn)程無(wú)法再訪問(wèn)此節(jié)點(diǎn)。供應(yīng)商進(jìn)程可以訪問(wèn) /dev/hwbinder,但必須將其 AIDL 接口轉(zhuǎn)為使用 HIDL。

對(duì)于想要繼續(xù)在供應(yīng)商進(jìn)程之間使用 AIDL 接口的供應(yīng)商,需要使用 /dev/vndbinder(而非 /dev/binder)。

Android8.0 及之后的Binder域如下圖所示:

Android Binder通信原理(一):簡(jiǎn)介

3. 三種 binder 介紹

?Android Binder通信原理(一):簡(jiǎn)介?

?Android Binder通信原理(一):簡(jiǎn)介?

?Android Binder通信原理(一):簡(jiǎn)介?

3.1 vndbinder 和 binder

vnbinder 和binder 使用的是一個(gè)ServiceManager 和libbinder,只不過(guò)在選擇的時(shí)候會(huì)區(qū)分open /dev/binder 還是/dev/vnbinder:

?Android Binder通信原理(一):簡(jiǎn)介?

?Android Binder通信原理(一):簡(jiǎn)介?

frameworks/native/cmds/servicemanager/main.cpp

int main(int argc, char** argv) {
    if (argc > 2) {
        LOG(FATAL) << "usage: " << argv[0] << " [binder driver]";
    }

    const char* driver = argc == 2 ? argv[1] : "/dev/binder";

    sp<ProcessState> ps = ProcessState::initWithDriver(driver);
    ps->setThreadPoolMaxThreadCount(0);
    ps->setCallRestriction(ProcessState::CallRestriction::FATAL_IF_NOT_ONEWAY);

    sp<ServiceManager> manager = new ServiceManager(std::make_unique<Access>());
    if (!manager->addService("manager", manager, false /*allowIsolated*/, IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk()) {
        LOG(ERROR) << "Could not self register servicemanager";
    }

    ..
}

代碼中根據(jù)參數(shù)選擇性的將driver 傳入進(jìn)行open,詳細(xì)看ProcessState::initWithDriver() 函數(shù)。

通常,供應(yīng)商進(jìn)程不直接打開(kāi) Binder 驅(qū)動(dòng)程序,而是鏈接到打開(kāi) Binder 驅(qū)動(dòng)程序的 libbinder 用戶(hù)空間庫(kù)。為 ::android::ProcessState() 添加方法可為 libbinder 選擇 Binder 驅(qū)動(dòng)程序。供應(yīng)商進(jìn)程應(yīng)該在調(diào)用 ProcessState、IPCThreadState 或發(fā)出任何普通 Binder 調(diào)用之前調(diào)用此方法。要使用該方法,請(qǐng)?jiān)诠?yīng)商進(jìn)程(客戶(hù)端和服務(wù)器)的 main() 后放置以下調(diào)用:

ProcessState::initWithDriver("/dev/vndbinder");

dev/binder和dev/vndbinder無(wú)法在一個(gè)進(jìn)程中同時(shí)使用

binder和vndbiner 的機(jī)制共用一套libbinder,因此兩者使用時(shí),每次只能指定一個(gè)設(shè)備節(jié)點(diǎn),不能同時(shí)使用。

3.2 hwbinder

hwbinder 獨(dú)立于binder和vndbinder,擁有獨(dú)立的驅(qū)動(dòng)設(shè)備 /dev/hwbinder,獨(dú)立的hwservicemanager (system/hwservicemanager/ 目錄) 和獨(dú)立的binder 庫(kù)libhwbinder (system/libhwbinder/ 目錄)。

android 8.0 以后采用了treble 的架構(gòu),framework 和HAL 是獨(dú)立的,在不同的 fw 和 HAL 進(jìn)程中,進(jìn)程間通信使用的是 HIDL 語(yǔ)言,而不在使用 AIDL 語(yǔ)言,因此使用了不同的 binder 驅(qū)動(dòng)設(shè)備

3.3 binder 庫(kù)的變化

binder

vndbinder

hwbinder

lib binder 位置

frameworks/native/libs/binder

frameworks/native/libs/binder

system/libhwbinder

service manager 位置

frameworks/native/cmds/servicemanager

frameworks/native/cmds/servicemanager

system/hwservicemanager文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-494967.html

到了這里,關(guān)于Android Binder通信原理(一):簡(jiǎn)介的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Binder通信原理

    Binder通信原理

    注:本文大部分代碼來(lái)自安卓11 ● 從IPC角度來(lái)說(shuō),Binder是Android中的一種跨進(jìn)程通信方式,Binder還可以理解為一種虛擬的物理設(shè)備驅(qū)動(dòng),它的設(shè)備驅(qū)動(dòng)是/dev/binder,該通信方式以前在linux中沒(méi)有 ● 從Android Framework角度來(lái)說(shuō),Binder是ServiceManager連接各種Manager(ActivityManager、Windo

    2024年02月03日
    瀏覽(16)
  • Android Binder——Java層通信實(shí)例(十六)

    ??????? 前面的文章中我們介紹了 Java 層服務(wù)的注冊(cè)流程,以及代理文件的查找。這里我們看一個(gè) Binder 通信的實(shí)例,為了方便我們就以 Android 源碼中現(xiàn)有的功能 PMS 的 install 為例,PMS 在進(jìn)行 APK 安裝時(shí),會(huì)進(jìn)行 dex 的翻譯,依賴(lài)守護(hù)進(jìn)程 installd 完成。 ??????? 在 Binder

    2024年04月23日
    瀏覽(23)
  • Android Binder常用案例使用分析,跨進(jìn)程通信aidl

    Android Binder常用案例使用分析,跨進(jìn)程通信aidl

    service組件的binderService獲取binder通信。 servicemanager.getService方法獲取相關(guān)服務(wù)。 本質(zhì)上都是IBinder通信。 客戶(hù)端:使用intent,啟動(dòng)服務(wù)端的service,使用binderservice,在onServiceConnected回調(diào)方法中獲取服務(wù)端的實(shí)際binder對(duì)象。使用aidl中的接口調(diào)用服務(wù)端的方法即可。 服務(wù)端:定義

    2024年02月07日
    瀏覽(30)
  • Android 進(jìn)階——Binder IPC之Binder IPC架構(gòu)及原理概述(九)

    Android 進(jìn)階——Binder IPC之Binder IPC架構(gòu)及原理概述(九)

    前面幾篇文章,為我們學(xué)習(xí)Binder IPC通信機(jī)制提供了扎實(shí)的理論基礎(chǔ),接下來(lái)將正式進(jìn)入Binder IPC通信架構(gòu)及原理的解讀。 Binder 是基于 C/S 架構(gòu)的,由一系列的組件組成,包括 Client進(jìn)程、Server進(jìn)程、Service Manager進(jìn)程、Binder 驅(qū)動(dòng)。其中 Client進(jìn)程、Server進(jìn)程、Service Manager進(jìn)程運(yùn)行

    2023年04月09日
    瀏覽(20)
  • Android Binder機(jī)制淺談以及使用Binder進(jìn)行跨進(jìn)程通信的倆種方式(AIDL以及直接利用Binder的transact方法實(shí)現(xiàn))

    Android Binder機(jī)制淺談以及使用Binder進(jìn)行跨進(jìn)程通信的倆種方式(AIDL以及直接利用Binder的transact方法實(shí)現(xiàn))

    Binder機(jī)制學(xué)習(xí) ·為何新增Binder來(lái)作為主要的IPC方式 Android也是基于Linux內(nèi)核,Linux現(xiàn)有的進(jìn)程通信手段有管道/消息隊(duì)列/共享內(nèi)存/套接字/信號(hào)量。 既然有現(xiàn)有的IPC方式,為什么重新設(shè)計(jì)一套Binder機(jī)制呢? 主要是出于以上三個(gè)方面的考量: 2. binder是什么? 從進(jìn)程間通信的角度

    2024年02月16日
    瀏覽(27)
  • BpBinder與PPBinder調(diào)用過(guò)程——Android開(kāi)發(fā)Binder IPC通信技術(shù)

    BpBinder與PPBinder調(diào)用過(guò)程——Android開(kāi)發(fā)Binder IPC通信技術(shù)

    在Android系統(tǒng)中,進(jìn)程間通信(IPC)是一個(gè)非常重要的話題。Android系統(tǒng)通過(guò)Binder IPC機(jī)制實(shí)現(xiàn)進(jìn)程間通信,而B(niǎo)inder IPC通信技術(shù)則是Android系統(tǒng)中最為重要的進(jìn)程間通信技術(shù)之一。本文將介紹Binder IPC通信技術(shù)的原理,并詳細(xì)解析BpBinder與PPBinder調(diào)用過(guò)程的使用以及注意事項(xiàng)。 Bind

    2024年02月13日
    瀏覽(26)
  • 寫(xiě)給 Android 應(yīng)用工程師的 Binder 原理剖析

    寫(xiě)給 Android 應(yīng)用工程師的 Binder 原理剖析

    這篇文章我醞釀了很久,參考了很多學(xué)習(xí)文檔,讀了很多源碼,卻依舊不敢下筆。生怕自己理解上還有偏差,對(duì)大家造成誤解,貽笑大方。又怕自己理解不夠透徹,無(wú)法用清晰直白的文字準(zhǔn)確的表達(dá)出 Binder 的設(shè)計(jì)精髓。直到今天提筆寫(xiě)作時(shí)還依舊戰(zhàn)戰(zhàn)兢兢。 Binder 之復(fù)雜遠(yuǎn)遠(yuǎn)

    2024年02月13日
    瀏覽(24)
  • AR 體驗(yàn)的“后浪,Android源碼的Binder權(quán)限是如何控制

    AR 體驗(yàn)的“后浪,Android源碼的Binder權(quán)限是如何控制

    △ 左邊沒(méi)有遮擋功能的“喵星人”在空間里穿越,缺乏真實(shí)感,右側(cè)開(kāi)啟遮擋功能的“喵星人”則逼真地藏在了 而有了 Depth API,虛擬物體可以在現(xiàn)實(shí)世界找到自己的位置,和環(huán)境良好互動(dòng),讓我們一起看一些優(yōu)秀的使用案例。 “遮擋”掉不真實(shí) 讓精彩上線 開(kāi)發(fā)了 Five Nig

    2024年04月17日
    瀏覽(23)
  • 【Android】Binder(一)Binder的介紹和AIDL使用Binder的實(shí)例

    【Android】Binder(一)Binder的介紹和AIDL使用Binder的實(shí)例

    Android 中的 Binder 是一個(gè)進(jìn)程間通信機(jī)制,它允許不同進(jìn)程之間相互調(diào)用方法和傳遞數(shù)據(jù)。Binder 主要用于實(shí)現(xiàn)系統(tǒng)服務(wù)和應(yīng)用程序之間的通信,以及實(shí)現(xiàn) IPC(Inter-Process Communication,進(jìn)程間通信)。 Binder 的核心是 Binder 驅(qū)動(dòng)程序,它負(fù)責(zé)管理不同進(jìn)程之間的通信。每個(gè)進(jìn)程都可

    2024年02月07日
    瀏覽(26)
  • 【安卓源碼】Binder機(jī)制3 -- Binder線程池

    Binder本身是C/S架構(gòu),就可能存在多個(gè)Client會(huì)同時(shí)訪問(wèn)Server的情況。 在這種情況下,如果Server只有一個(gè)線程處理響應(yīng),就會(huì)導(dǎo)致客戶(hù)端的請(qǐng)求可能需要排隊(duì)而導(dǎo)致響應(yīng)過(guò)慢的現(xiàn)象發(fā)生。解決這個(gè)問(wèn)題的方法就是引入多線程?!径鄠€(gè)客戶(hù)端不同線程去請(qǐng)求,服務(wù)端需要使用多線程

    2023年04月27日
    瀏覽(17)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包