Android Binder機(jī)制

Binder機(jī)制的核心原理

Binder架構(gòu)圖.png

首先這里會有一個服務(wù)端,服務(wù)端會有一個Binder對象,這個Binder對象需要我們自己去定義.
這個Binder對象指向Native層的BBinder,BBinder需要注冊服務(wù),注冊服務(wù)時需要跟Native層的ServiceManager去打交道,然后會調(diào)用ioctl去做一些數(shù)據(jù)的處理.

Kernel層

Binder驅(qū)動 binder.c

http://androidxref.com/kernel_3.18/xref/drivers/staging/android/binder.c#0

四個核心方法

  1. 初始化binder_init()
    Binder設(shè)備的初始化
  2. open
    打開Binder設(shè)備
  3. mmap
    內(nèi)存映射
  4. ioctl
    數(shù)據(jù)操作

Native層

Service Manager

關(guān)于Service Manager,需要了解
Service Manager是怎么啟動的,
怎么把服務(wù)注冊到Service Manager當(dāng)中,
Service Manager怎么獲取


啟動ServiceManager時序圖.jpg
  1. 啟動
    http://androidxref.com/9.0.0_r3/xref/frameworks/native/cmds/servicemanager/service_manager.c

service_manager.c中main()函數(shù)中調(diào)用binder_open()打開Binder驅(qū)動
binder_become_context_manager()注冊成為binder服務(wù)的大管家
binder_loop(),進(jìn)入無限循環(huán),處理客戶端發(fā)來的請求

  1. 獲取ServiceManager
    http://androidxref.com/9.0.0_r3/xref/frameworks/native/libs/binder/IServiceManager.cpp
    通過IserviceManager.cpp中的defaultServiceManager()函數(shù)獲取
    ProcessState::self() 獲取ProcessState對象
    getContextObject() 獲取BpBinder對象
    interface_cast<IServiceManager> 獲取BpServiceManager對象

  2. 注冊服務(wù)


    注冊服務(wù)C.jpg

通過IServicemanager.cpp中的addService()函數(shù)注冊服務(wù)

  1. 查詢服務(wù)
    do_find_service()
    通過IServicemanager.cpp中的checkService()函數(shù)查詢服務(wù)


    核心類圖.png

JNI層和FrameWork層分析

初始化

http://androidxref.com/9.0.0_r3/xref/frameworks/base/core/jni/AndroidRuntime.cpp

AndroidRuntime.cpp

運(yùn)行時需要去注冊一些東西,比如說Binder

android_util_Binder.cpp

http://androidxref.com/9.0.0_r3/xref/frameworks/base/core/jni/android_util_Binder.cpp
android_util_Binder.cpp中的register_android_os_Binder()

int_register_android_os_Binder()
int_register_android_os_BinderInternal()
int_register_android_os_BinderProxy()

注冊

注冊是在我們的ServiceManager.java中
http://androidxref.com/9.0.0_r3/xref/frameworks/base/core/java/android/os/ServiceManager.java
addService()方法

ServicemanagerNative.java 通過JNI層調(diào)用Native層的方法
http://androidxref.com/9.0.0_r3/xref/frameworks/base/core/java/android/os/ServiceManagerNative.java

獲取服務(wù)

ServiceManager.java中的getService()
BinderProxy

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末椭更,一起剝皮案震驚了整個濱河市撒轮,隨后出現(xiàn)的幾起案子虽缕,更是在濱河造成了極大的恐慌人乓,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辱志,死亡現(xiàn)場離奇詭異云石,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)求妹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進(jìn)店門乏盐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人制恍,你說我怎么就攤上這事父能。” “怎么了净神?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵何吝,是天一觀的道長。 經(jīng)常有香客問我鹃唯,道長爱榕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任俯渤,我火速辦了婚禮呆细,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘八匠。我一直安慰自己絮爷,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布梨树。 她就那樣靜靜地躺著坑夯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪抡四。 梳的紋絲不亂的頭發(fā)上柜蜈,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天仗谆,我揣著相機(jī)與錄音,去河邊找鬼淑履。 笑死隶垮,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的秘噪。 我是一名探鬼主播狸吞,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼指煎!你這毒婦竟也來了蹋偏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤至壤,失蹤者是張志新(化名)和其女友劉穎威始,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體像街,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡黎棠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了镰绎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片葫掉。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖跟狱,靈堂內(nèi)的尸體忽然破棺而出俭厚,到底是詐尸還是另有隱情,我是刑警寧澤驶臊,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布挪挤,位于F島的核電站,受9級特大地震影響关翎,放射性物質(zhì)發(fā)生泄漏扛门。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一纵寝、第九天 我趴在偏房一處隱蔽的房頂上張望论寨。 院中可真熱鬧,春花似錦爽茴、人聲如沸葬凳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽火焰。三九已至,卻和暖如春胧沫,著一層夾襖步出監(jiān)牢的瞬間昌简,已是汗流浹背占业。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留纯赎,地道東北人谦疾。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像犬金,于是被迫代替她去往敵國和親餐蔬。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,969評論 2 355

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