2.6基礎(chǔ)知識(shí)-Binder

Binder詳解

  • 1 .Linux內(nèi)核的基礎(chǔ)知識(shí)(跟Binder有關(guān)的)
    1. Binder通信機(jī)制介紹
    1. AIDL實(shí)現(xiàn)

1.Linux內(nèi)核的基礎(chǔ)知識(shí)(跟Binder有關(guān)的)

1.進(jìn)程隔離/虛擬地址空間(進(jìn)程A和進(jìn)程B的虛擬地址空間不一樣贡蓖,獨(dú)享)
2.概念:系統(tǒng)調(diào)用唯笙。進(jìn)程只可以訪問許可的資源爽锥,將Linux內(nèi)核層和上層程序抽象分離開。用戶可以通過系統(tǒng)調(diào)用港谊,在用戶空間訪問內(nèi)核的某些程序

3.binder驅(qū)動(dòng):android系統(tǒng)中夺颤,運(yùn)行在內(nèi)核空間中擅憔,負(fù)責(zé)各個(gè)用戶進(jìn)程通過binder通信的內(nèi)核進(jìn)行通信的交互模塊叫binder驅(qū)動(dòng)武氓。
    驅(qū)動(dòng)程序,一般指的是設(shè)備的驅(qū)動(dòng)程序主儡,可以使計(jì)算機(jī)和設(shè)備通信的特殊程序奖唯,也是一種軟件,其實(shí)也是一種接口糜值,操作系統(tǒng)可以通過這個(gè)接口操作并控制硬件設(shè)備丰捷;

2.Binder通信機(jī)制介紹

  • 1 .為什么要使用binder

      1. Android使用的Linux內(nèi)核擁有著非常多的跨進(jìn)程通信機(jī)制坯墨,管道,socket
        - 1. 性能上:廣泛的通信機(jī)制對(duì)性能有嚴(yán)格的要求
        binder相對(duì)于socket更加高效
        - 2. 安全性上瓢阴,傳統(tǒng)通信對(duì)通信雙方?jīng)]有做出嚴(yán)格的驗(yàn)證畅蹂,只有上層協(xié)議才做架構(gòu),binder對(duì)通信雙方做身份校驗(yàn)荣恐,權(quán)限模型基礎(chǔ)
    1. binder通信模型
        1. 通信錄:binder驅(qū)動(dòng)液斜。
        1. 電話基站:serviceManager
圖1

跨進(jìn)程通信時(shí):客戶端只是持有了一個(gè)服務(wù)端的代理對(duì)象引用,具體的跨進(jìn)程通信都是通過代理對(duì)象來協(xié)助完成的

  • 1 .到底什么事binder
    • 1 .通常意義下叠穆,Binder指的是一種通信機(jī)制
    • 2 .對(duì)于Server進(jìn)程來說少漆,Binder指的是Binder本地對(duì)象
      • 1 .對(duì)Client來說,Binder指的是Binder的代理對(duì)象
      • 2 .對(duì)處于同一個(gè)進(jìn)程來說硼被,客戶端Binder也是本地對(duì)象
      • 3 . 客戶端對(duì)象和服務(wù)端對(duì)象是無法交互的示损,只有使用binder通過ServiceManager才能交互
    • 3 .對(duì)于傳輸過程而言,Binder是可以進(jìn)行跨進(jìn)程傳遞的對(duì)象
      • binder驅(qū)動(dòng)會(huì)對(duì)具有跨進(jìn)程傳入能力的對(duì)象(不是嚷硫。检访。繼承了PacexxBle,沒搞清)做特殊處理仔掸,自動(dòng)會(huì)完成對(duì)代理對(duì)象和服務(wù)端對(duì)象的轉(zhuǎn)換
  • 3 . binder通信機(jī)制原理

3.AIDL實(shí)現(xiàn)(Binder的實(shí)例)

圖2

圖3
圖4
圖5
圖6
圖7
圖8
圖9

生成一個(gè)靜態(tài)Stub類脆贵,繼承android.os.Binder,實(shí)現(xiàn)本地定義的AIDL接口

  • 說明是一個(gè)Binder本地對(duì)象,具有遠(yuǎn)程服務(wù)端承諾給客戶端遠(yuǎn)程傳遞數(shù)據(jù)的能力起暮。
  • 又由于Stub這個(gè)抽象類是個(gè)抽象的卖氨,具體的實(shí)現(xiàn)需要自己來。這個(gè)是java中的一個(gè)策略模式负懦。
  • 首先asInterface(android.os.IBinder obj):這是一個(gè)接口筒捺,代表了跨進(jìn)程傳輸?shù)哪芰Γ灰獙?shí)現(xiàn)了這個(gè)接口就能將這個(gè)對(duì)象跨進(jìn)程傳遞纸厉,驅(qū)動(dòng)底層支持的系吭,驅(qū)動(dòng)會(huì)識(shí)別支持IBinder類型的數(shù)據(jù)

其中:

public static 自定義的AIDL接口名稱 asInterface(android.os.IBinder obj){
        if(obj == null){return null;}
        android.os.IInterface iin = obj.queryLocalInterface(DESCRIPOR);
        if(((iin!=null)&&)(iin instanceof 自定義的AIDL接口名稱))){
            return ((自定義的AIDL接口名稱)iin)
        }
        return new 自定義的接口名稱.Stub.Proxy(obj);
    }
    //如果是同一個(gè)進(jìn)程的話就使用iin,如果不是同一個(gè)進(jìn)程的話就會(huì)使用使用它的代理對(duì)象

    在這個(gè)Stub類中颗品,實(shí)現(xiàn)了compute方法
    public int compute(int a,int b)throw android.os.RemoteException{
        android.os.Parcel _data = android.os.Parcel.obtain();
        android.os.Parcel _reply = android.os.Parcel.obtain();
        int _result;
        try{
            _data.writeInterfaceToken(DESCRIPTIOR);
            _data.writeInt(a);
            _data.write(b);
            mRemote.transat(Stub.TRANSACTION_compute,_data,_reply,0);
            _reply.readExcption();
            _result = _reply.readInt();
        }
        finally{
        _reply.recycle();
        _data_recycle();
        }
        return _result;
    
    }
    
    IBinder類中:
        public boolean transact(int code,Parcel data,Prarcel reply,int flags) throw RemoteException;
            其實(shí)是一個(gè)native層的方法肯尺,最終會(huì)調(diào)用到onTransat方法
    看Stub實(shí)現(xiàn)
        根據(jù)調(diào)用號(hào),調(diào)用剛才寫的compute跨進(jìn)程調(diào)用方法
        public boolean onTransact(int code,android.os.Parcel data,android.os.Parcel reply,int flags)throw android.os.xxException{
            switch(code){
                case INTERFACE_TRANSACTION:{
                    reply.writeString(DESCRIPTOR);
                }
                case TREANSACTION_compute:{
                    data.enforceInterface(DESCRIPTOR);
                    int _arg0;
                    _arg0 = data.readInt();
                    int _arg1;
                    _arg1 = data.readInt();
                    int _result = this.compute(_arg0,_arg1);
                    reply.writeNoException();
                    reply.writeInt(_result);
                    return true;
                }

            }
            return super.onTransact(code,data,reply,flags);
            

        }
  1. 先用Parcel將數(shù)據(jù)序列化
  2. 然后調(diào)用transact方法抛猫,最終會(huì)調(diào)用的onTransat方法蟆盹,然后根據(jù)調(diào)用號(hào)孩灯,調(diào)用到compute 自定義的AIDL方法
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末闺金,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子峰档,更是在濱河造成了極大的恐慌败匹,老刑警劉巖寨昙,帶你破解...
    沈念sama閱讀 222,464評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異掀亩,居然都是意外死亡舔哪,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門槽棍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捉蚤,“玉大人,你說我怎么就攤上這事炼七±虑桑” “怎么了?”我有些...
    開封第一講書人閱讀 169,078評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵豌拙,是天一觀的道長陕悬。 經(jīng)常有香客問我,道長按傅,這世上最難降的妖魔是什么捉超? 我笑而不...
    開封第一講書人閱讀 59,979評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮唯绍,結(jié)果婚禮上拼岳,老公的妹妹穿的比我還像新娘。我一直安慰自己推捐,他們只是感情好裂问,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著牛柒,像睡著了一般堪簿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上皮壁,一...
    開封第一講書人閱讀 52,584評(píng)論 1 312
  • 那天椭更,我揣著相機(jī)與錄音,去河邊找鬼蛾魄。 笑死虑瀑,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的滴须。 我是一名探鬼主播舌狗,決...
    沈念sama閱讀 41,085評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼扔水!你這毒婦竟也來了痛侍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,023評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤魔市,失蹤者是張志新(化名)和其女友劉穎主届,沒想到半個(gè)月后赵哲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,555評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡君丁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評(píng)論 3 342
  • 正文 我和宋清朗相戀三年枫夺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绘闷。...
    茶點(diǎn)故事閱讀 40,769評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡橡庞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出印蔗,到底是詐尸還是另有隱情毙死,我是刑警寧澤,帶...
    沈念sama閱讀 36,439評(píng)論 5 351
  • 正文 年R本政府宣布喻鳄,位于F島的核電站扼倘,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏除呵。R本人自食惡果不足惜再菊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望颜曾。 院中可真熱鬧纠拔,春花似錦、人聲如沸泛豪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽诡曙。三九已至臀叙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間价卤,已是汗流浹背劝萤。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評(píng)論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留慎璧,地道東北人床嫌。 一個(gè)月前我還...
    沈念sama閱讀 49,191評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像胸私,于是被迫代替她去往敵國和親厌处。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 原文鏈接: http://weishu.me/2016/01/12/binder-index-for-newer/...
    miniminiming閱讀 727評(píng)論 1 6
  • Android跨進(jìn)程通信IPC整體內(nèi)容如下 1岁疼、Android跨進(jìn)程通信IPC之1——Linux基礎(chǔ)2阔涉、Andro...
    隔壁老李頭閱讀 11,930評(píng)論 11 56
  • 給大家發(fā)個(gè)好圖,每點(diǎn)擊一個(gè),就會(huì)出現(xiàn)一片絕美風(fēng)景洒敏,令你心曠神怡。請(qǐng)大家慢慢欣賞[微笑] 一共準(zhǔn)備了16片疙驾,會(huì)讓你心...
    龍宮點(diǎn)燈閱讀 972評(píng)論 0 0
  • 秋意漸濃凶伙,漫步在北京的街頭,微風(fēng)吹過它碎,帶著一絲涼意函荣,很舒適的感覺。 “現(xiàn)在去哪里呢扳肛?”傻挂,時(shí)間還早,蘇鋆不想馬上投身...
    悠一一閱讀 169評(píng)論 0 2
  • 1.股票投機(jī)主要就是A試圖判斷B挖息、C金拒、D會(huì)怎么想,而B套腹、C绪抛、D反過來也做著同樣的判斷。 2.沃倫大概是班上年紀(jì)最小...
    Towain閱讀 221評(píng)論 0 0