为什么Android进程间通信有时候用Binder有时候用Socket

讲解这个问题之前我们先来看看这个问题“为什么进程间不能直接进行通信,而需要借助Binder或者Socket通信”, 其实这个问题只要了解过虚拟机的同学大概都会明白怎么回事:

由于在安卓系统中一个进程对应一个虚拟机实例,而在Java虚拟机实例中只存在一个堆区和一个方法区,并且被所有线程共享,所以能够直接通信的只有在虚拟机内部堆区和方法区,进程间通信属于虚拟机对象间通信不能直接通信,当然大家还应该明白一个机器只有一个虚拟机创建多个虚拟机实例来实现多进程也就是多应用。至于栈区、堆区、方法区各自存储的是什么,这就需要同学们认真的去了解一下虚拟机,这里就不做过多详解了。

sunshineBoy

好了言归正传,再回来聊聊为什么Android进程间通信有时候用Binder有时候用Socket,其实这也是跟Java虚拟机有关的。安卓系统中进程间通信使用Socket通信的,system_server进程与zygote进程通信的时候用到了Socket,system_server进程通过LocalSocket连接zygote进程的serverSocket传递参数ActivityThread,通知zygote进程fork出Android应用进程执行ActivityThread的main()方法。由于zygote进程是所有Android应用进程的父进程,system_server进程也是由zygote进程fork出来的大儿子基于Dalvik(ART) VM虚拟机实例,而zygote进程是基于JVM虚拟机实例,所以zygote进程与system_server进程是父子关系只能使用socket通信(主要原因还是因为JVM是基于Java api,DVM基于Android api,JVM中不存在Binder驱动),Binder通信属于基于Dalvik(ART) VM虚拟机两个进程兄弟之间的通信方式。

init进程是Linux系统开机最先启动基础进程之一的用户进程,Linux Kernel启动后,会调用/system/core/init/Init.cpp的main()方法,可决定用户级别,Android系统其它进程都是由init进程创建和控制的;

zygote进程是init进程fork出的第一个子进程,由init进程的service通过socket通信开启进程,然后zygote进程调用startVm函数创建JVM虚拟机实例注册JNI主要用来与Dalvik(ART)虚拟机通信,所有Dalvik(ART)虚拟机都是有zygote进程孵化器fork出来的,所谓fork其实就是复制zygote进程,这样创建速度快且能够共享系统和框架的资源。

system_server进程是zygote进程通过startSystemServer方法fork出的第一个子进程,主要用于启动Android系统中的服务,常见的比如WindowManagerServer(WMS)、ActivityManagerSystemService(AMS)、 PackageManagerServer(PMS)等,PackageManagerServer主要是安装apk是用来解析AndroidManifest.xml获取Activity、Service、Broadcast Receiver、Content Provider以及权限信息存储Binder中,并以友好的方式在桌面上展现出来(快捷图标的形式);ActivityManagerSystemService管理所有Activity,WindowManagerService管理所有窗口。

Application进程就是应用进程也就是我们安装的应用,点击桌面luncher图标,通过ActivityManagerSystemService通知system_server进程LocalSocket连接zygote进程serverSocket传递ActivityThread参数,然后system_server进程fork出当前Application应用进程并调度ActivityThread的main()函数启动应用程序,当然这个流程也就是App的启动流程。

 

 

猜你喜欢

转载自blog.csdn.net/xhf_123/article/details/108471394