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驱动服务了。
网友评论