1.Java和C++中的Binder
從前一篇 Binder機(jī)制,從Java到C (5. IBinder對(duì)象傳遞形式) 中可以看到,使用Binder的Java代碼,到最后都會(huì)進(jìn)入到Native環(huán)境,將具體的分發(fā)工作交給執(zhí)行效率更高的Native代碼。 而這些Native的實(shí)現(xiàn)都會(huì)統(tǒng)一到一個(gè)lib:libbinder。 在前面的講述中,我們已經(jīng)接觸到了native中的JavaBBinder,BBinder,JavaBBinderHolder
把一些相關(guān)的類整理一下,可以得到下面Java和C++代碼的關(guān)系:
Java環(huán)境里的Binder的對(duì)象,會(huì)通過JNI 調(diào)用init()方法,創(chuàng)建一個(gè)JavaBBinderHolder,從而使自己映射到Native環(huán)境里的BBinder。將兩個(gè)環(huán)境里的Binder對(duì)象映射在一起。
2.transact() BinderProxy中的transact()是以JNI的方式實(shí)現(xiàn)的,那它就是Java層和C++層的溝通紐帶,Java通過它可以進(jìn)一步和native交互。
Java環(huán)境里的的Binder,有一個(gè)private 的execTransact()方法,其實(shí)就是Native環(huán)境的callback,也就是C++層回到Java層的一個(gè)入口。
JNI代碼在執(zhí)行Native環(huán)境的onTransact()方法時(shí),會(huì)通過回調(diào)Java環(huán)境里的execTransact()方法,從而回調(diào)到Java里實(shí)現(xiàn)的onTransact()方法。
3.libinder
Binder在Java環(huán)境中大量使用了面向?qū)ο蟮闹貥?gòu)技巧,盡可能的實(shí)現(xiàn)通用操作。于是,為了支持給Java環(huán)境提供的靈活功能,在Native層的Binder,也需要具備面向?qū)ο蟮哪芰?。libbinder的文件路徑: /framework/native/include/binder/ Binder.h BinderService.h BpBinder.h Ibinder.h IInterface.h IPCThreadState.h IpermissionController.h IserviceManager.h MemoryBase.h MemoryDealer.h MemoryHeapBase.h Parcel.h PermissionCache.h ProcessState.h /framework/native/lib/binder/binder/ Binder.cpp BpBinder.cpp Iinterface.cpp Imemory.cpp IPCThreadState.cpp IpermissionController.cpp IserviceManager.cpp MemoryBase.cpp MemoryDealer.cpp MemoryHeapBase.cpp Parcel.cpp PermissionCache.cpp ProcessState.cpp Static.cpp
為了能映射Java代碼,C++實(shí)現(xiàn)的Binder庫會(huì)和Java環(huán)境里的Binder概念有相似互通之處:
IInterface.h,定義IInterface接口類。與Java的IInterface接口類對(duì)應(yīng),但與Java環(huán)境不同,C++環(huán)境里需要提供Binder通信實(shí)現(xiàn),所以在內(nèi)部被進(jìn)一步拆分成BpInterface(Proxy端對(duì)象)、BnInterface(Stub端對(duì)象)兩個(gè)模板,從而使用不同模板參數(shù),可以使用對(duì)同一IInterface接口的訪問,得到不同功能實(shí)現(xiàn)。
IBinder.h,定義IBinder接口類。與Java環(huán)境的IBinder對(duì)應(yīng),提供Binder引用,并定義Binder對(duì)象所應(yīng)實(shí)現(xiàn)的方法。跟Java環(huán)境一樣,IBinder對(duì)象會(huì)是分別引用到Proxy對(duì)象或是Stub對(duì)象。
Binder.h,定義BBinder類。BBinder類與Java環(huán)境里的Binder類對(duì)應(yīng),是Binder的Stub實(shí)現(xiàn),通過onTransact()回調(diào)方法接收與處理Binder事件。但它更屬于Binder通訊的基礎(chǔ)類,并不會(huì)被直接使用,系統(tǒng)只會(huì)通過BBinder類的派生類進(jìn)行通信,所以它的類名是BBinder,Base Binder的意思。
BpBinder.h,定義BpBinder類。與Java環(huán)境里的Stub.Proxy對(duì)象對(duì)應(yīng),是Binder的Proxy端實(shí)現(xiàn)。作為Proxy端,又是Binder最底層的封裝,這一類的本質(zhì)作用只是提供一個(gè)transact()方法,從而給上層封裝的IPC請(qǐng)求提供最終的Binder通信接口。
Parcel.h,定義Parcel類。雖然概念上與Java里實(shí)現(xiàn)序列化的Parcel類是對(duì)應(yīng)的,也提供同樣的操作方法。但在實(shí)現(xiàn)上,Native環(huán)境里的Parcel是提供Java環(huán)境里的Parcel概念的一種基礎(chǔ),所有的Parcel的read|write_*()系列的方法,底層全是由Native代碼來實(shí)現(xiàn)具體的讀寫操作。
4.Binder通信類
那有了Binder通信封裝的類,如何操作Binder 驅(qū)動(dòng)來通信呢? 在libbinder里,有兩個(gè)專門的類來完成真正的Binder消息的讀寫操作 : ProcessState和IPCThreadState。
ProcessState.h,定義ProcessState類。正如這個(gè)類的名字所表述的,這個(gè)類的作用就是維護(hù)和IPC相關(guān)的process state,對(duì)于任一使用Binder的進(jìn)程而言,進(jìn)程空間里只會(huì)有一個(gè)ProcessState對(duì)象。
IPCThreadState.h,定義類IPCThreadState。這個(gè)類描述以thread為基礎(chǔ)的IPC傳輸狀態(tài),Binder通信的讀寫過程便在這個(gè)類里完成。在IPCThreadState里,是以thread pool的方式來維護(hù)Binder的通信請(qǐng)求。
下面這個(gè)圖就是整個(gè)通信的流程,藍(lán)色部分是在Java里的,Java中通過BinderProxy的JNI調(diào)用,進(jìn)入到Native層,然后通過IPCThreadState的talkwithDriver()和Binder驅(qū)動(dòng)通信,Binder驅(qū)動(dòng)在做了一系列處理后,找到目標(biāo)進(jìn)程,也是從talkwithDriver()方法回去,然后走到JavaBBinder的transact(),這里就會(huì)去調(diào)用進(jìn)入Java層的入口函數(shù)execTransact()。再回到具體的執(zhí)行函數(shù)。
5.輔助類
libbinder里會(huì)實(shí)現(xiàn)一些C++環(huán)境里的輔助類:
Imemory.h,生成兩個(gè)遠(yuǎn)程接口類,IMemory和IMemoryHeap,分別用于使用內(nèi)存和分配內(nèi)存。對(duì)于內(nèi)存使用兩個(gè)基于IBinder的接口類,就意味著申請(qǐng)內(nèi)存和分配內(nèi)存可以分別由單獨(dú)的process來提供。
MemoryDealer.h,定義一個(gè)默認(rèn)的分配內(nèi)存的MemoryDealer類。在這個(gè)類里有一個(gè)簡單的內(nèi)存管理算法,需要提供內(nèi)存分配部分的時(shí)候,可以使用這個(gè)類來創(chuàng)建內(nèi)存空間,并通過IMemoryHeap共享出去。
MemoryBase.h,提供IMemory接口類的Stub端實(shí)現(xiàn)。這個(gè)類是用在使用內(nèi)存上的,可以通過它的getMemory()的方法返回一個(gè)IMemoryHeap實(shí)例。這個(gè)類是個(gè)基類,如果要使用IMemory接口,可以繼承這個(gè)類。
MemoryHeapBase.h,提供IMemoryHeap接口類的Stub端。用于遠(yuǎn)程共享的堆空間分配,根據(jù)不同的情況分配不同類型的內(nèi)存。
MemoryHeapPmem.h,實(shí)現(xiàn)基于Pmem機(jī)制(為了實(shí)現(xiàn)共享大尺寸連續(xù)物理內(nèi)存而開發(fā)的一種機(jī)制)并實(shí)現(xiàn)了IMemoryHeap接口。如果有特殊內(nèi)存堆的使用需求,可以通過MemoryHeadBase類派生出新的MemoryHead類,就像這個(gè)MemoryHeapPmem。
|