美文网首页
IBinder接口及其实现

IBinder接口及其实现

作者: JasonHwang | 来源:发表于2020-01-17 16:29 被阅读0次

    1、IPC通信

    当我们启动某一支应用程序(App)时,android系统里的Zygote服务孵化(Fork)一个新的进程(progress)给它,然后将它(App)加载到这个新诞生的进程里。一个进程是一个独立的执行空间,不会被正在其他进程里的程序锁侵犯。跨越两个进程之间的通信称为跨进程通信 IPC。

    2、进程

    每个进程都有一个虚拟机(VM)对象,用来执行java代码,也引导JNI本地程序的执行实现Java与C/C++的沟通。一个进程只摆放一支App,一支App可以占用多个进程。

    每个进程诞生时,都会产生一个主线程(Main Thread)一个Looper类对象一级一个MQ(Message Queue)数据结构。每当主线程做完事情就会执行Looper类,此时,不断观察MQ的动态。

    3、IBinder接口及其实现

    ICP通信主要通过IBinder接口的transact()函数实现。IBinder接口的实现Binder和BinderProxy。

    IBinder接口源码

    Binder --- service端  ; BinderProxy --- client端。

    3.1 Binder基类的主要目的是支持跨进程调用Service,也就是让远程的Client可以跨进程调用某个Service

    Binder基类源码 Binder基类方法UML图

    • transact()函数--- 用来实现IBinder的transact()函数接口。

    • execTransact()函数--- 其角色与transact()函数是相同的,只是这是用来让C/C++本地程序来調用的。

    • onTransact()函数--- 这是一个抽象函数,让应用子类来重写(Override)的。上述的transact()和execTransact()两者都是調用onTransact()函数      来实现反向調用(IoC, Inversion ofControl)的。

    • init()函数--- 这是一个本地(Native)函数,让JNI模块来实现这个函数。Binder()构造函数(Constructor)会調用这个init()本地函数。

    3.2 BinderProxy :在Client进程里,担任Service端的分身(Proxy)

    由于跨进程沟通时,并不是从Java层直接沟通的,而是透过底层的Binder Driver驱动来沟通的,所以Client端的Java类别(如Activity)必须透过BinderProxy分身的IBinder接口,转而調用JNI本地模块来衔接到底层Binder Driver驱动服务,进而調用到正在另一个进程里执行的Service。

    BinderProxy源码

    当Client透过IBinder接口而調用到BinderProxy的transact()函数,就調用到其 JNI本地模块的transact()函数,就能进而衔接到底层Binder Driver驱动服务了。

    相关文章

      网友评论

          本文标题:IBinder接口及其实现

          本文链接:https://www.haomeiwen.com/subject/acvczctx.html