Android 的跨进程通信为Binder ,采用共享内存的方式 达到高效,较安全的IPC
首先 要有两个进程在系统中 ,在安卓系统中,基本可以认为就是运行在 VM 上的多个process构成,
桌面 LauncherActivity 进程,等等,
以打开微信为例:
1、首先用户在Launcher进程中执行操作,点击微信图标。这时通过LaucherActivity所在进程发起了一个 startactivity的操作,并在当前进程中获取Zygote 来向内核层发起请求来fork一个新的进程来转载新activity的线程。
2、当新的进程fork成功以后,进行相关初始化,此时也加载了Android 的类库到当前进程中。
3、拿到AMS 的系统服务的引用创建Application以及activity等
我们知道,当我们进行跨进程通信时是通过ServiceManager这个系统服务来进行,而上面说过,ServiceManager 与 LaucherActivity或其他Application也是运行在不同进程中的,那么最初的ServiceManager引用是如何获取的呢?
实际上在每个process创建的时候 就会加载Java层的ServiceManager类对象,而在内核层,由于内存共享的性质,对应的ServiceManager(Native层)只有一个,每个Java层的ServiceManager都会与这个唯一的Native层ServiceManager建立引用关系。画个图来直观的看一下。
也就是说 Framework层会在Process创建的时候就进驻到进程的内存空间中,这样我们的Application 就可以在相同的内容空间中获取ServiceManager的引用,从而控制native层的ServiceManager,而系统中的其他服务也会通过各自进程的ServiceManager引用将自己注册到native层的ServiceManager中,Application就可以在各自的进程中通过ServiceManager 获取其他进程服务的映射引用了。