前言
還記得我剛工作半年時(shí)候,因?yàn)楣镜募軜?gòu)調(diào)整,我從應(yīng)用組換到了Framework組,當(dāng)時(shí)我的領(lǐng)導(dǎo)讓我看一下Binder,當(dāng)時(shí)也是一臉悶逼,各種百度,各種買(mǎi)書(shū)來(lái)看,但是總是迷迷糊糊,由于對(duì)JNI和C語(yǔ)言的欠缺,一直沒(méi)有真正的搞明白,工作兩年之后才算整理上理解,接下來(lái)給各位講講我的理解。
Android系統(tǒng)為什么需要Binder機(jī)制
因?yàn)楦鱾€(gè)進(jìn)程都在自己的虛擬地址空間,進(jìn)程A無(wú)法直接調(diào)用進(jìn)程B的方法。為了能讓進(jìn)程A調(diào)用進(jìn)程B的方法,有什么辦法,我們自己也可以想想。我自己想了一個(gè)簡(jiǎn)單粗暴的方法,進(jìn)程B在SD卡中創(chuàng)建一個(gè)文件"sdcard/B",然后每隔一秒,去讀這個(gè)文件,進(jìn)程A寫(xiě)一個(gè)方法名和參數(shù)到SD卡中的文件"sdcard/B",進(jìn)程A每隔1秒去讀這個(gè)文件"sdcard/B",進(jìn)程B發(fā)現(xiàn)文件"sdcard/B"內(nèi)容有更新,讀到了方法名和參數(shù),然后根據(jù)方法名調(diào)進(jìn)程B的方法,再將返回的結(jié)果寫(xiě)到這個(gè)文件"sdcard/B"中。進(jìn)程A發(fā)現(xiàn)文件"sdcard/B"內(nèi)容有更新就讀取返回結(jié)果,這樣子就完成了一次跨進(jìn)程通信。雖然我這個(gè)方案,從易用性和性能來(lái)說(shuō)都有一點(diǎn)差,但是Binder機(jī)制本質(zhì)上就是類(lèi)似這樣子的方式。
Binder機(jī)制中的四大重要組成部分
1.Binder驅(qū)動(dòng)
2.ServiceManager(本質(zhì)上就是Server端,世界上第一個(gè)Server端)
3.Server端
4.Client端
1.Binder驅(qū)動(dòng)
這里有很多概念,牽涉到源碼很多,我不想和各位聊聊源碼,在上一個(gè)小編自己實(shí)現(xiàn)的跨進(jìn)行通信方案,能否有一定的改進(jìn),創(chuàng)建SD卡的文件,讀寫(xiě)SD卡的文件,監(jiān)聽(tīng)SD卡的文件,SD卡的文件格式,這些東西能否形成一個(gè)套通用的接口方便各個(gè)進(jìn)程來(lái)使用呢,其實(shí)Binder驅(qū)動(dòng)就是這個(gè)通用的接口。
2.ServiceManager
大家發(fā)現(xiàn)一個(gè)問(wèn)題沒(méi)有,進(jìn)程A要調(diào)用進(jìn)程B,首先要找到進(jìn)程B在SD中創(chuàng)建的文件,那進(jìn)程A如何找到這個(gè)文件呢?這個(gè)Binder機(jī)制,早就幫你考慮好了,開(kāi)機(jī)會(huì)啟動(dòng)一個(gè)進(jìn)程,叫做ServiceManager(SM),SM會(huì)創(chuàng)建第一個(gè)SD文件(這個(gè)文件的地址是sdcard/0,固定),并對(duì)這個(gè)文件進(jìn)行監(jiān)聽(tīng)
3.Server端
進(jìn)程B就是Server端,在進(jìn)程B在創(chuàng)建文件"sdcard/B"后,把注冊(cè)進(jìn)程B信息和文件名,寫(xiě)到SM的文件中,SM把進(jìn)程B的信息和文件名存在SM進(jìn)程中內(nèi)部的一個(gè)紅黑樹(shù),方便查詢。
4.Client端
進(jìn)程A就是Client端,當(dāng)進(jìn)程A要調(diào)用進(jìn)程B的方法時(shí)候,首先進(jìn)程A去把自己的查詢B的請(qǐng)求寫(xiě)到SM的文件中,SM根據(jù)進(jìn)程A的請(qǐng)求,返回進(jìn)程B的信息和文件名,然后A根據(jù)進(jìn)程B的信息和文件名去把方法名和參數(shù)寫(xiě)到進(jìn)程B的"sdcard/B"文件中,然后進(jìn)行一個(gè)跨進(jìn)程通信。
小結(jié)
小編自己實(shí)現(xiàn)一個(gè)類(lèi)Binder的機(jī)制,并提出了四個(gè)重要概念,接下來(lái)小編會(huì)繼續(xù)來(lái)分析這四個(gè)重要概念,敬請(qǐng)期待。