在Android系統中,每一個應用程序都是由一些Activity和Service組成的,這些Activity和Service有可能運行在同一個進程中,也有可能運行在不同的進程中。那么,不在同一個進程的Activity或者Service是如何通信的呢?這就是本文中要介紹的Binder進程間通信機制了。
?? ? ? ?我們知道,Android系統是基于Linux內核的,而Linux內核繼承和兼容了豐富的Unix系統進程間通信(IPC)機制。有傳統的管道(Pipe)、信號(Signal)和跟蹤(Trace),這三項通信手段只能用于父進程與子進程之間,或者兄弟進程之間;后來又增加了命令管道(Named Pipe),使得進程間通信不再局限于父子進程或者兄弟進程之間;為了更好地支持商業應用中的事務處理,在AT&T的Unix系統V中,又增加了三種稱為“System V IPC”的進程間通信機制,分別是報文隊列(Message)、共享內存(Share Memory)和信號量(Semaphore);后來BSD Unix對“System V IPC”機制進行了重要的擴充,提供了一種稱為插口(Socket)的進程間通信機制。若想進一步詳細了解這些進程間通信機制,建議參考Android學習啟動篇一文中提到《Linux內核源代碼情景分析》一書。
?? ? ? ?但是,Android系統沒有采用上述提到的各種進程間通信機制,而是采用Binder機制,難道是因為考慮到了移動設備硬件性能較差、內存較低的特點?不得而知。Binder其實也不是Android提出來的一套新的進程間通信機制,它是基于OpenBinder來實現的。OpenBinder最先是由Be Inc.開發的,接著Palm Inc.也跟著使用。現在OpenBinder的作者Dianne Hackborn就是在Google工作,負責Android平臺的開發工作。
?? ? ? ?前面一再提到,Binder是一種進程間通信機制,它是一種類似于COM和CORBA分布式組件架構,通俗一點,其實是提供遠程過程調用(RPC)功能。從英文字面上意思看,Binder具有粘結劑的意思,那么它把什么東西粘結在一起呢?在Android系統的Binder機制中,由一系統組件組成,分別是Client、Server、Service Manager和Binder驅動程序,其中Client、Server和Service Manager運行在用戶空間,Binder驅動程序運行內核空間。Binder就是一種把這四個組件粘合在一起的粘結劑了,其中,核心組件便是Binder驅動程序了,Service Manager提供了輔助管理的功能,Client和Server正是在Binder驅動和Service Manager提供的基礎設施上,進行Client-Server之間的通信。Service Manager和Binder驅動已經在Android平臺中實現好,開發者只要按照規范實現自己的Client和Server組件就可以了。說起來簡單,做起難,對初學者來說,Android系統的Binder機制是最難理解的了,而Binder機制無論從系統開發還是應用開發的角度來看,都是Android系統中最重要的組成,因此,很有必要深入了解Binder的工作方式。要深入了解Binder的工作方式,最好的方式莫過于是閱讀Binder相關的源代碼了,Linux的鼻祖Linus Torvalds曾經曰過一句名言RTFSC:Read The Fucking Source Code。
?? ? ? ?雖說閱讀Binder的源代碼是學習Binder機制的最好的方式,但是也絕不能打無準備之仗,因為Binder的相關源代碼是比較枯燥無味而且比較難以理解的,如果能夠輔予一些理論知識,那就更好了。閑話少說,網上關于Binder機制的資料還是不少的,這里就不想再詳細寫一遍了,強烈推薦下面兩篇文章:
?? ? ? ?Android深入淺出之Binder機制
?? ? ? ?Android Binder設計與實現 – 設計篇
?? ? ? ?Android深入淺出之Binder機制一文從情景出發,深入地介紹了Binder在用戶空間的三個組件Client、Server和Service Manager的相互關系,Android Binder設計與實現一文則是詳細地介紹了內核空間的Binder驅動程序的數據結構和設計原理。非常感謝這兩位作者給我們帶來這么好的Binder學習資料。總結一下,Android系統Binder機制中的四個組件Client、Server、Service Manager和Binder驅動程序的關系如下圖所示:
?? ? ? ?
?? ? ? ?1. Client、Server和Service Manager實現在用戶空間中,Binder驅動程序實現在內核空間中
?? ? ? ?2. Binder驅動程序和Service Manager在Android平臺中已經實現,開發者只需要在用戶空間實現自己的Client和Server
?? ? ? ?3. Binder驅動程序提供設備文件/dev/binder與用戶空間交互,Client、Server和Service Manager通過open和ioctl文件操作函數與Binder驅動程序進行通信
?? ? ? ?4. Client和Server之間的進程間通信通過Binder驅動程序間接實現
?? ? ? ?5. Service Manager是一個守護進程,用來管理Server,并向Client提供查詢Server接口的能力
?? ? ? ?至此,對Binder機制總算是有了一個感性的認識,但仍然感到不能很好地從上到下貫穿整個IPC通信過程,于是,打算通過下面四個情景來分析Binder源代碼,以進一步理解Binder機制:
?? ? ? ?1.?Service Manager是如何成為一個守護進程的?即Service Manager是如何告知Binder驅動程序它是Binder機制的上下文管理者。
?? ? ? ?2.?Server和Client是如何獲得Service Manager接口的?即defaultServiceManager接口是如何實現的。
?? ? ? ?3.?Server是如何把自己的服務啟動起來的?Service Manager在Server啟動的過程中是如何為Server提供服務的?即IServiceManager::addService接口是如何實現的。
?? ? ? ?4 ?Service Manager是如何為Client提供服務的?即IServiceManager::getService接口是如何實現的。
?? ? ? ?在接下來的四篇文章中,將按照這四個情景來分析Binder源代碼,都將會涉及到用戶空間到內核空間的Binder相關源代碼。這里為什么沒有Client和Server是如何進行進程間通信的情景呢? 這是因為Service Manager在作為守護進程的同時,它也充當Server角色。因此,只要我們能夠理解第三和第四個情景,也就理解了Binder機制中Client和Server是如何通過Binder驅動程序進行進程間通信的了。
?? ? ? ?為了方便描述Android系統進程間通信Binder機制的原理和實現,在接下來的四篇文章中,我們都是基于C/C++語言來介紹Binder機制的實現的,但是,我們在Android系統開發應用程序時,都是基于Java語言的,因此,我們會在最后一篇文章中,詳細介紹Android系統進程間通信Binder機制在應用程序框架層的Java接口實現:
?? ? ? ?5.?Android系統進程間通信Binder機制在應用程序框架層的Java接口源代碼分析。
老羅的新浪微博:http://weibo.com/shengyangluo,歡迎關注!
頂
183 踩
9 上一篇 Android日志系統Logcat源代碼簡要分析 下一篇 淺談Service Manager成為Android進程間通信(IPC)機制Binder守護進程之路 我的同類文章 Android(175) ? Chromium擴展(Extension)的頁面(Page)加載過程分析2016-09-19 閱讀967 ? Chromium擴展(Extension)機制簡要介紹和學習計劃2016-09-05 閱讀14606 ? Chromium為視頻標簽<video>渲染視頻畫面的過程分析2016-08-22 閱讀2328 ? Chromium視頻標簽<video>簡要介紹和學習計劃2016-08-08 閱讀2510 ? Chromium網頁滑動和捏合手勢處理過程分析2016-07-11 閱讀5373 ? Chromium網頁輸入事件處理機制簡要介紹和學習計劃2016-06-27 閱讀5352 ? Chromium擴展(Extension)加載過程分析2016-09-12 閱讀3707 ? Chromium為視頻標簽<video>全屏播放的過程分析2016-08-29 閱讀2486 ? Chromium為視頻標簽<video>創建播放器的過程分析2016-08-15 閱讀6431 ? Chromium分發輸入事件給WebKit處理的過程分析2016-07-25 閱讀3490 ? Chromium網頁輸入事件捕捉和手勢檢測過程分析2016-07-04 閱讀7027 更多文章
參考知識庫
猜你在找 Android移植基礎 話說linux內核-uboot和系統移植第14部分 CentOS7 Linux系統管理實戰視頻課程 紅帽Linux系統企業內部實訓 嵌入式Linux系統移植入門 Android進程間通信IPC機制Binder簡要介紹和學習計劃 Android進程間通信IPC機制Binder簡要介紹和學習計劃 Android進程間通信IPC機制Binder簡要介紹和學習計劃 Android進程間通信IPC機制Binder簡要介紹和學習計劃 Android進程間通信IPC機制Binder簡要介紹和學習計劃
66樓?
devwang_com?2016-08-29 19:32發表 ?[回復] 棒棒棒~ 65樓?
novas-meng?2016-05-12 07:54發表 ?[回復] 羅老師,信號(Signal)這個不光對父子進程有效吧 64樓?
oTingFengXiYu?2016-05-09 14:50發表 ?[回復] 太高深了,完全看不懂,也沒看到想要的答案,最后進程跟進程間是如何實現通信的例子呢,這個倒像是一個學術報告。就好比經濟學家可以把商品的價格體現這種問題能分析出十幾頁,但是說白了用物以稀為貴就能說明白的問題了。代碼呢,到底是怎么實現的,我們可以在代碼里面根據自己想要的答案繼續深究下去,而不是一籮筐的吧里面鋼筋水泥全露出來,最后你告訴我鋼筋水泥都在這了,混一下糊上去就行了。。。。 Re:?羅升陽?2016-05-09 17:52發表 ?[回復] 回復oTingFengXiYu:別噴了,省點力氣,先把這個系列的文章看完了再說,要例子去找書看。 Re:?sandy84n?2016-06-08 17:25發表 ?[回復] 回復Luoshengyang:對于這種人,老羅不必太在意 63樓?
衛星是我朋友?2016-03-29 17:02發表 ?[回復] 羅大哥,佩服~學android就要有你這樣的精神! 62樓?
杭州山不高?2016-03-25 18:31發表 ?[回復] 看過,頂過! 61樓?
feng_zhi_chao?2015-10-17 21:25發表 ?[回復] 謝謝樓主,好文章啊! 60樓?
小白james?2015-09-22 17:06發表 ?[回復] 新手,完全看不懂啊,老羅,請問如何學習研究android源碼 Re:?Traxer?2015-12-27 16:41發表 ?[回復] 回復u011747761:從博主的第一篇文章開始邊看邊分析吧,文章都寫的很詳細的,分析完幾篇會好一些了 59樓?
real的IT之路?2015-06-05 22:20發表 ?[回復] 羅老師的分析太高深了,以至于有些地方根本看不懂。要同時具備c++ java 還有linux操作系統內核的知識,同時掌握的人很少的,同時也是比較牛的人。 58樓?
ziyang3721?2015-03-06 17:02發表 ?[回復] binder_mmap 會分配內核虛擬地址空間,這塊一般只有100多M, 而基本上每個進程都會 mmap 1M,是不是說明只能同時允許 100個左右的進程? 57樓?
qw345?2015-01-20 19:09發表 ?[回復] 已投票,期待更多精彩文章 56樓?
wlbstc?2015-01-04 14:39發表 ?[回復] 學習到很多,樓主太好了。 已經投票“博客之星” 55樓?
hefeipeng1993?2014-12-18 10:47發表 ?[回復] LZ你好,我只是剛接觸Framework層的學習,菜鳥一枚,有一點不明,就是Binder對于Android Framework的意義何在?愿賜教! Re:?羅升陽?2014-12-20 01:34發表 ?[回復] 回復hefeipeng1993:意義很大,無時無刻都在用,等你慢慢深入學習framework就會體會到的了。 54樓?
小熊先生kisCode?2014-12-01 18:44發表 ?[回復] 羅老師,qq群5還沒加滿,但是不允許你任何加入了..請問下還有其他可以加入的QQ群嗎 53樓?
liuyanggofurther?2014-09-08 21:29發表 ?[回復] 第二段第三行是命名管道喲 (命令管道 Named Pipe) 52樓?
XHunterX?2014-08-18 09:39發表 ?[回復] 感謝博主的付出,向你這樣的IT人致敬! 51樓?
Dingo妹?2014-07-24 12:17發表 ?[回復] 雖然還是不懂,但是文章思路和講解很清晰,謝謝樓主。 50樓?
Dingo妹?2014-07-24 12:07發表 ?[回復] http://blog.csdn.net/universus/article/details/6211589/ 《Android Binder設計與實現 - 設計篇》可以用這個鏈接 49樓?
舊舊?2014-07-20 23:03發表 ?[回復] 好文章啊,應該早點看到的~~感謝樓主 48樓?
floatingclouds?2014-06-05 20:24發表 ?[回復] Binder機制詳解系列: Binder 機制詳解—Binder IPC 程序結構:http://www.cloudchou.com/android/post-497.html Binder 機制詳解—Binder 系統架構: http://www.cloudchou.com/android/post-507.html 本地Binder框架通信原理: http://www.cloudchou.com/android/post-534.html Binder 機制詳解—Binder 本地框架: http://www.cloudchou.com/android/post-547.html Binder 機制詳解—Binder Java框架: http://www.cloudchou.com/android/post-558.html Java層Binder框架通信原理: http://www.cloudchou.com/android/post-573.html 47樓?
floatingclouds?2014-06-05 14:02發表 ?[回復] 我博客也寫了一些Binder的博客,從入門到詳解的資料,請樓主賜教。 這些入門資料都有詳細的代碼分析,也有托管在github上的demo源碼下載。 Binder service入門–創建native binder service: http://www.cloudchou.com/android/post-332.html Binder service入門—Framework binder service: http://www.cloudchou.com/android/post-447.html Binder service入門—應用層binder service: http://www.cloudchou.com/android/post-458.html Binder service入門—框架層、應用層調用native binder service: http://www.cloudchou.com/android/post-468.html 46樓?
a2758963?2014-02-09 09:28發表 ?[回復] 每一個應用程序都是由一些Activity和Service組成的,一般Service運行在獨立的進程中 --------------------------------------------------------------------------------下面是官方文檔的說明,請博主確認: A service runs in the main thread of its hosting process—the service does not create its own thread and does not run in a separate process (unless you specify otherwise). Re:?羅升陽?2014-02-09 22:48發表 ?[回復] 回復a2758963:三年前的文章了,很久都時間梳理一下Service默認的確是運行在同一個進程里面,但是在AndroidManifest.xml可以將它們配置運行在獨立的進程里面。已經修改過來了。 45樓?
chishuideyu?2014-01-23 14:47發表 ?[回復] 太棒了,謝謝樓主,絕對收藏,寫的真好,就需要這個,哈哈哈 44樓?
漫游的民工?2014-01-04 17:19發表 ?[回復] 不得不佩服樓主很強大,受教了! 43樓?
lymallen?2013-12-26 15:42發表 ?[回復] 這一系列的文章都很好,全面分析了android的進程間通信,很不錯,多謝分享。 42樓?
zhaoshenan?2013-12-09 22:28發表 ?[回復] 很好的文章,非常感謝羅老師分享,雖然有很多地方不懂 41樓?
programmer_lxg?2013-11-05 10:38發表 ?[回復] 好得很 40樓?
liuleiblog?2013-09-18 10:58發表 ?[回復] 問下羅老師,您閱讀系統源碼用什么工具啊? 39樓?
sence?2013-09-10 14:40發表 ?[回復] 很好的文章,非常感謝樓主分享 38樓?
sxq315?2013-09-09 21:21發表 ?[回復] 不錯,收藏下 37樓?
曉之不難?2013-08-29 13:08發表 ?[回復] 貌似還不錯 36樓?
chenxiaogang_324?2013-05-29 17:43發表 ?[回復] 羅老師:有個問題想請教你一下。每個進程都有很多線程在和binder驅動通信。當兩個進程利用binder通信的時候利用的是哪個線程呢?為何這么多線程在和binder通信,但是代碼中卻始終看不到線程同步。比如在一個應用程序中啟動一個activity,這個會和activitymanagerservice進行binder通信來啟動。activitymanagerservice有自己的線程。systemserver中有很多讀取binder驅動的線程。假設其中一個binder線程接收到了這個通信,它要在activitymanagerservice中history增加一個activityrecord對象。這個時候如果其他的應用程序也要啟動一個一個activity,利用的是另外一個binde線程。這個時候找到的最頂端的activity究竟是哪個呢?這個問題困擾了我很久了,希望您能解答一下。 Re:?羅升陽?2013-05-29 18:25發表 ?[回復] 回復chenxiaogang_324:ActivityManagerService明顯是有做線程同步 35樓?
Sky_River?2013-05-20 15:38發表 ?[回復] 不好意思,可能我沒講清楚吧,我的意思是想知道在驅動中怎么樣引用到binder_node這個結構,在binder_transaction_data中的target.ptr指向的是什么樣的數據結構?我想知道的是binder實體在內核中的存在形式,不是binder對象。您能否指教下? 34樓?
Sky_River?2013-05-17 09:40發表 ?[回復] 老羅,你好!看了這篇http://disanji.net/2011/02/28/android-bnder-design/,里邊不斷提到內核中的Binder實體與用戶空間的Binder實體,在binder_transaction_data結構中有一個target域,如果是在接收方,文章里說target.ptr就是Binder對象的內存指針,我想問下這個指針具體指的是哪個數據結構?是binder_node結構么? Re:?羅升陽?2013-05-17 10:21發表 ?[回復] 回復Sky_River:這些概念確實是很容易混淆,為了方便理解,我在《Android系統源代碼情景分析》一書中對它們進行了區別: 1. 在用戶空間,運行在Server端的稱為Binder本地對象,運行在Client端的稱為Binder代理對象。 2. 在內核空間,Binder實體對象用來描述Binder本地對象,Binder引用對象用來描述Binder代理對象。 3. 上述四種對象都統稱為Binder對象。 關于這四種對象的作用和關系,《Android系統源代碼情景分析》一書講得很詳細,博客也有講,但是沒有那么詳細,這里我也很難用幾句話就說清楚。 33樓?
jia1015512573?2013-05-15 21:05發表 ?[回復] 羅哥你好,看完了這一系列的文章,受益匪淺,只是還有一個地方沒有搞明白,客戶端通過向ServiceManager查詢,得到查詢服務的結果后,是如何對binder接口進行改動的呢,因為剛開始建立的bpBInder綁定的是handle為0的ServiceManager,后來怎么又通過這個binder向Service發送數據了呢,還有就是ServiceManager管理的究竟是服務的什么東西,是服務的handle值嗎?也就是ServiceManager返回給客戶端的是Service的什么東西?希望羅哥指點小弟一番 Re:?羅升陽?2013-05-15 23:19發表 ?[回復] 回復jia1015512573:你不是一個地方沒明白,是四個地方沒明白了,呵呵,說明你看完了,但是還沒理解,那四個問題都是很基本的問題。 32樓?
red5613?2013-05-13 10:08發表 ?[回復] 學習中。。。。 31樓?
red5613?2013-05-10 18:48發表 ?[回復] 收獲中。 30樓?
rickystudio?2013-05-09 15:46發表 ?[回復] 羅老師,中間的圖是用什么工具畫的? Re:?羅升陽?2013-05-09 17:10發表 ?[回復] 回復rickystudio:word 29樓?
demonshir?2013-04-27 21:11發表 ?[回復] 老羅你好, 看你書上對binder傳遞的數據分析挺詳細的,但我還有疑問。 關于Client 獲得實名Binder的引用,會向servicemanager發送請求數據,smgr從發送的數據中取出<名字>+<引用>然后查找列表。 書上逐層的分析到了flat_binder_object這個變量,想問下這個<名字>是保存哪個變量或哪個地址空間? ptr.buffer? 比如wifi Service,在變量里是否就存儲wifiService這個字符串? 看了一些資料,但是一直沒有把這個細節搞明白,還請指點。 Re:?羅升陽?2013-04-27 23:08發表 ?[回復] 回復demonshir:是的,保存在ptr.buffer里面。最開始的時候,這個字符串通過Parcel保存在一個binder_transaction_data的ptr.buffer里面,這個ptr.buffer是位于Client端的地址空間的,經過Binder驅動的時候,就會拷貝到Server端的地址空間去。在你說的情況下,這個Server端就是ServiceManager。ServiceManager將接收到的數據保存在一個binder_txn里面。binder_txn和binder_transaction_data的結構是一樣的,也就是說,binder_txn里面的data就保存了你說的字符串。接著ServiceManager再通過一個binder_io來從binder_txn.data里面將那個字符串取出來。取出這個字符串之后,就可以得到一個對應的binder引用。這個binder引用經過Binder驅動返回給Client端的時候,又會被轉換成Client端的一個binder引用。 Re:?羅升陽?2013-04-27 23:13發表 ?[回復] 回復Luoshengyang:ServiceManager不像其它的Service/Client一樣,用Parcel來序列化和反序列化通信數據,也沒有直接用binder_transaction_data來表示通信數據,它用的是binder_txn和binder_io,也就是說,binder_txn相當于binder_transaction_data,binder_io相當于Parcel,注意一下這個點,就會比較清楚數據的流向了。 28樓?
qiuxiaolong007?2013-04-10 16:48發表 ?[回復] 老羅,你好! 由于種種原因,(客戶要求),我們做了一個非常蛋疼的項目,是Qt for Android, 大部分困難基本克服,還有一項問題,我想請問你一下,請耐心看看哈~ 簡而言之,我們需要把一些進程間通訊的操作 封裝在 /system/lib/myso.so中,這樣用Binder機制是不是可行呢? 在linux下,項目通過共享內存實現的,現在向android下移植,遇到了困難,請提供一下思路,我對android不是很熟悉。謝謝 Re:?羅升陽?2013-04-10 18:01發表 ?[回復] 回復qiuxiaolong007:可以的啊,Binder機制本身就是封裝在一個so里面給上層使用的。 27樓?
edmond999?2013-03-08 17:32發表 ?[回復] hello,老羅,想問下binder驅動會主動請求添加新的binder線程去處理事物,這是真的么? Re:?羅升陽?2013-03-09 17:32發表 ?[回復] 回復edmond999:會的,不過進程可以設置Binder驅動最多可以請求創建的Binder線程的數量,這個值默認是16. Re:?edmond999?2013-03-08 17:39發表 ?[回復] 回復edmond999:第一,看了android Messanger的實現,怎么感覺也能夠用binder實體對象的句柄創建proxy呢?這樣子行的通么? 第二,Messanger好像既能處理同一個進程之間傳遞message,也能跨進程傳遞Message,是嗎?如果第一個問題成立,那么第二個問題也就解決了。 下面這兩個個鏈接講解了一個Messanger的例子,既能進程內,也可以跨進程,呵呵,能否解答下上邊兩個問題? http://wenku.baidu.com/view/0a396802eff9aef8941e0617.html http://wenku.baidu.com/view/c2946a3e87c24028915fc313.html Re:?羅升陽?2013-03-09 17:34發表 ?[回復] 回復edmond999:1. Binder Proxy本來就是簡單地對一個Binder實體的句柄進行封裝。 2. 同一個進程的不同線程也可以使用Binder機制,不過這時候是直接調用,不用經過Binder驅動,因為Binder驅動會對這種情況進行優化。 Re:?edmond999?2013-03-11 11:38發表 ?[回復] 回復Luoshengyang:謝謝,仔細研究了一下,確實不同過binder驅動,在生成一個proxy時是用binder實體對象指針進行生成的,而不是生成一個BpXXX類型的對象,如下代碼所示。所以proxy在調用transact時是直接調用的BBinder的transact,然后調用實體binder對象的onTransact函數,從而直接調用了service端的實現函數,對于是否跨多線程還是同一線程都是可以的,android的設計確實牛哇,老羅確實也很牛哇,哈哈~~~ status_t unflatten_binder(const sp<ProcessState>& proc,? const Parcel& in, sp<IBinder>* out)? {? const flat_binder_object* flat = in.readObject(false);? if (flat) {? switch (flat->type) {? case BINDER_TYPE_BINDER:? *out = static_cast<IBinder*>(flat->cookie);? return finish_unflatten_binder(NULL, *flat, in);? case BINDER_TYPE_HANDLE:? *out = proc->getStrongProxyForHandle(flat->handle);? return finish_unflatten_binder(? static_cast<BpBinder*>(out->get()), *flat, in);? }? }? return BAD_TYPE;? } Re:?edmond999?2013-03-12 16:07發表 ?[回復] 回復edmond999:寫錯了,生成BpXXX時使用的是本進程內的binder實體對象的指針,呵呵,筆誤。如果binder實體對象在其他進程內的話就使用驅動里binder_ref結構體的uint32_t desc成員,也就是binder的引用句柄。 26樓?
sada09?2013-03-07 09:38發表 ?[回復] 受益匪淺 25樓?
BadPattern?2013-03-05 09:23發表 ?[回復] 問一個問題,java層調用service的遠程接口,雙方都持有一個相同的aidl文件,編譯的時候會根據這個aidl文件生成一些相同的類來維持通信接口的約定。 那么native層的server和client擁有的共同通信接口是不是frameworks/base/include/binder下邊的一堆頭文件?通過Binder通信的都要include這些頭文件? Re:?羅升陽?2013-03-05 10:01發表 ?[回復] 回復dr8737010:frameworks/base/include/binder和frameworks/base/libs/binder這兩個目錄是Android系統提供的Binder庫,無論是Java層的Client/Service,還是C++層的Client/Service,最終都是通過這個庫提供的接口來完成Binder進程間通信的。這個Binder庫只是對Binder驅動的封裝而已,你也可以完全不使用它來執行Binder進程間通信,不過這樣的話,你就要大費周章地寫很多代碼了。Android系統的Service Manager的實現就沒有使用Binder庫,具體可以看這篇文章:http://blog.csdn.net/luoshengyang/article/details/6621566 24樓?
pfgmylove?2012-11-29 16:32發表 ?[回復] 你好,android的binder不是rpc機制嗎? Re:?羅升陽?2012-11-29 17:09發表 ?[回復] 回復pfgmylove:IPC機制 23樓?
lidongelf?2012-11-14 16:22發表 ?[回復] 87 +v5 22樓?
stevenhu_223?2012-08-16 19:05發表 ?[回復] 頂!!! 21樓?
huangzhenyu1983?2012-07-16 11:37發表 ?[回復] android上的rpc是同步的還是異步的? Re:?羅升陽?2012-07-16 15:15發表 ?[回復] 回復huangzhenyu1983:可以是同步的,也可以是異步的。 20樓?
Fendouliuhao?2012-07-15 09:34發表 ?[回復] 學習 19樓?
ynb1687?2012-06-04 14:07發表 ?[回復] 學習了 18樓?
YUMOMO_L?2012-04-24 16:14發表 ?[回復] 表示支持~ 17樓?
jifengyu_ok?2012-04-19 20:05發表 ?[回復] 樓主太牛了,太感謝樓主了 16樓?
jindegegesun?2012-03-16 11:29發表 ?[回復] 樓主文章太霸道了,頂啊! 15樓?
后知后覺?2012-02-29 09:50發表 ?[回復] 樓主很牛 14樓?
wqhjfree?2012-02-09 11:26發表 ?[回復] 寫的很詳細, 對深入研究android有很大幫主, 頂起 13樓?
kevinhe0472?2012-02-03 16:06發表 ?[回復] 支持樓主的每一篇文章! 12樓?
無枝可依?2012-01-31 16:09發表 ?[回復] 樓主,建議你出書。 現在市面上介紹android系統結構的書幾乎沒有,就算有,也是掛羊頭賣狗肉。 跟你寫的差遠了 11樓?
androidboy365?2011-11-23 10:51發表 ?[回復] 寫的不錯,分析的很清晰啊,轉載收錄了 10樓?
小姚丹?2011-11-20 00:19發表 ?[回復] 業余得太專業了!!我最近開始學android,非常感謝您的文章 9樓?
Gongqingshuai?2011-11-15 15:59發表 ?[回復] 冒昧的問一下,樓主現在從事android哪方面的工作啊?研究andorid多久了呢?看您對android知之甚深,所以就想了解一下。 Re:?羅升陽?2011-11-15 22:46發表 ?[回復] 回復Gongqingshuai:業余研究 Re:?wqhjfree?2012-02-09 11:27發表 ?[回復] 回復Luoshengyang:業余研究都能這么專業 8樓?
winerluo?2011-11-03 18:58發表 ?[回復] 山窮水盡儗無路,柳暗花明又一村。 7樓?
wantianpei?2011-09-19 14:17發表 ?[回復] 頂. 6樓?
dulaiduqu?2011-09-05 08:43發表 ?[回復] service不是運行在獨立的進程中吧,SDK中有這樣一句話:A service runs in the main thread of its hosting process—the service does not create its own thread and does not run in a separate process (unless you specify otherwise). Re:?羅升陽?2011-09-05 10:16發表 ?[回復] 回復dulaiduqu:不過怎么理解Android中的進程,可能大家的想法會有點偏差,因為Android系統是基于Linux內核的,在Linux內核里面,沒有線程的概念,都是稱為進程或者任務,所以我這里說的進程,有時候也可以理解為線程,它和啟動它的應用程序進程是共享代碼的。 Re:?羅升陽?2011-09-05 10:10發表 ?[回復] 回復dulaiduqu:Service一般是運行在獨立的進程中,當然也可以和其它Activity運行在同一個進程中,取決于這個Service在AndroidManifest.xml文件的配置以及調用什么函數來啟動它,典型的Activity管理服務ActivityManagerService和Package管理服務PackageManagerService就是運行在獨立的進程,因為Service是沒有UI的,所以把它放在獨立的進程中來運行,做一些計算型邏輯更合理,詳細你可以參考后面一篇文章《Android系統在新進程中啟動自定義服務過程(startService)的原理分析》,接下來還會有一篇文章是描述在進程內部啟動Service的,有興趣的話可以關注一下。 5樓?
lpboss?2011-09-02 10:03發表 ?[回復] 樓主你好,剛剛開始學習android,我想請教一下,servicemanager打開binder時,后面都會把binder映射到共享內存中如: bs->fd = open("/dev/binder", O_RDWR); if (bs->fd < 0) { LOGE("binder: cannot open device (%s)\n", strerror(errno)); goto fail_open; } bs->mapsize = mapsize; bs->mapped = mmap(NULL, mapsize, PROT_READ, MAP_PRIVATE, bs->fd, 0); 兩端都有映射,但我沒有看到有哪個在使用這段共享內存的~弄得很暈。求賜教!! Re:?羅升陽?2011-09-02 11:28發表 ?[回復] 回復lpboss:如果仔細閱讀一下博客后面兩篇文章《淺談Service Manager成為Android進程間通信(IPC)機制Binder守護進程之路》和《Android系統進程間通信(IPC)機制Binder中的Server啟動過程源代碼分析》,對這個問題就會比較清楚了 4樓?
kennyirene?2011-08-30 15:52發表 ?[回復] 學習了 3樓?
black_berry?2011-07-20 22:09發表 ?[回復] 很好,轉了。辛苦了 2樓?
doumiwang?2011-07-20 14:54發表 ?[回復] 說的非常好,如果不同的應用程序,雖然用了相同的數字證書簽名,但是沒有放在同一個進程里運行,那么他們之間還能互相訪問數據嗎?還能訪問另一個程序的代碼嗎?可以看看這個鏈接,幫助解答一下,謝謝!http://doumiw.com/market/community/t!showTopic.do?topicId=24 Re:?羅升陽?2011-07-20 15:26發表 ?[回復] 回復doumiwang:以什么方來來訪問數據、訪問代碼?這個說得太抽象了,最好還是自己寫代碼來實踐一下。 還有,Android的Binder機制跟數字簽名沒有關系。 1樓?
mci2004?2011-07-20 10:28發表 ?[回復] SF LZ你寫的太好了,我們很是佩服,我們公司也是搞Android的你的文章被我們幾個新進的應屆生爭相追逐,希望LZ能盡早更新! PS:LZ身體要緊啊!2點多了還在更新文章....... Re:?羅升陽?2011-07-20 15:27發表 ?[回復] 回復mci2004:感謝關注 原文地址:?http://blog.csdn.net/luoshengyang/article/details/6618363
總結
以上是生活随笔 為你收集整理的Android进程间通信(IPC)机制Binder简要介绍和学习计划 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。