上一次說了android的啟動原理,這次說下android的進程間的通信。
linux 本身是提供了通信機制的。大概有7種左右。然后但是為什么android不用。反而要自己搞一套。主要分析到2個方面: 安全性 和性能。因為前期的移動手機性能不高。還有就是繞開Linux內(nèi)核的開源限制。
總結(jié)就是----避免內(nèi)核空間到數(shù)據(jù)接受端的直接的數(shù)據(jù)拷貝;數(shù)據(jù)接受端接收數(shù)據(jù)的時候,由于數(shù)據(jù)大小不確定,要么分配一個很大的空間裝數(shù)據(jù),要么動態(tài)擴容;兩種方式都有問題;Binder使用mmap直接把接受端的內(nèi)存映射到內(nèi)存空間,避免了數(shù)據(jù)的直接拷貝;另外通過data_buffer等方式讓數(shù)據(jù)僅包含定長的消息頭,解決了接受端內(nèi)存分配的問題.
android內(nèi)部的進程間的通信都是通過binlder 來實現(xiàn)的。這個是很重要的一點。
我們面試問道的 aild Content Provider 調(diào)用撥打電話 Intent跳轉(zhuǎn) 其底層都是調(diào)用的bindler機制.
關(guān)于binlder的運行原理 我只寫一個大概。
在其底層的Linux中 /etc/bindler/ 有這個c 文件 就是binlder 的程序文件了。其內(nèi)部是采用的引用計數(shù)器來為何對象。要知道 我們的bindler是支持多進程。如何一個service端要對應(yīng)多個客戶端 也就是說要實現(xiàn)多對多。在看內(nèi)部源碼的時候我發(fā)現(xiàn)其內(nèi)部是用2個紅黑樹來維持 一個service 對專門提供一個客戶端調(diào)用。如果還有其他的客戶端調(diào)用就在生成一個servicebindler 對象來提供調(diào)用 然后根據(jù)內(nèi)存管理的引用計數(shù)器來回收掉不需要的servicebindler對象。
如果你想深究 我推薦這個http://0xcc0xcd.com/p/index.php
Android 內(nèi)核分析 bindler
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
- Android跨進程通信IPC整體內(nèi)容如下 1、Android跨進程通信IPC之1——Linux基礎(chǔ)2、Andro...
- 1:InputChannel提供函數(shù)創(chuàng)建底層的Pipe對象 2: 1)客戶端需要新建窗口 2)new ViewRo...
- Android跨進程通信IPC整體內(nèi)容如下 1、Android跨進程通信IPC之1——Linux基礎(chǔ)2、Andro...
- 【R 原文片段】 如果你不在談話技巧上花心思,很容易表現(xiàn)的咄咄逼人,使談話陷入僵局,因此需要改變你的談話方式。我的...