You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
android-notes/blogs/Android/Framework/源代码情景分析/Service 组件的启动过程.md

26 lines
3.3 KiB

---
Service 组件的启动过程
---
Service 组件是在 Service 进程中运行。Service 进程在启动时,会首先将它里面的 Service 组件注册到 ServiceManager 中,接着在启动一个 Binder 线程池来等待和处理 Client 进程的通信请求。
#### 注册 Service 组件
在将 Service 组件注册到 ServiceManager 之前,我们首先要获得一个 ServiceManager 代理对象,然后才可以通过它将该 Service 组件注册到 ServiceManager 中。
函数 defaultServiceManager 返回的 ServiceManager 代理对象的类型为 BpServiceManager,然后调用它的 addService 函数来注册自己。
Client 进程和 Service 进程的一次进程间通信过程可以划分为如下五个步骤:
1. Client 进程将进程间通信数据封装成一个 Parcel 对象,以便可以将进程间通信数据传递给 Binder 驱动程序。
2. Client 进程向 Binder 驱动程序发送一个 BC_TRANSACTION 命令协议。Binder 驱动程序根据协议内容找到目标 Service 进程之后,就会向 Client 进程发送一个 BR_TRANSACTION_COMPLETE 返回协议,表示它的进程间通信请求已经被接受。Client 进程接收到 Binder 驱动程序发送给它的 BR_TRANSACTION_COMPLETE 返回协议,并且对它进程处理之后,就会再次进入 Binder 驱动程序中去等待目标 Service 进程返回进程间通信结果。
3. Binder 驱动程序再向 Client 进程发送 BR_TRANSACTION_COMPLETE 返回协议的同时,也会向目标 Server 进程发送一个 BR_TRANSACTION 返回协议,请求目标 Service 进程处理该进程间通信请求。
4. Service 进程接收到 Binder 驱动程序发来的 BR_TRANSACTION 返回协议,并且对它进行处理之后,就会向 Binder 驱动程序发送一个 BC_REPLY 命令协议。Binder 驱动程序根据协议内容找到目标 Client 进程之后,就会向 Service 进程发送一个 BC_REPLY 命令协议。Binder 驱动程序根据协议内容找到目标 Client 进程之后,就会向 Service 进程发送一个 BR_TRANSACTION_COMPLETE 返回协议,表示它返回的进程间通信结果已经收到了。Service 进程接收到 Binder 驱动程序发送给它的 BR_TRANSACTION_COMPLETE 返回协议,并且对它进行处理之后,一次进程间通信过程就结束了。接着它会再次进入到 Binder 驱动程序中去等待下一次进程间通信请求。
5. Binder 驱动程序向 Service 进程发送 BR_TRANSACTION_COMPLETE 返回协议的同时,也会向目标 Client 进程发送一个 BR_REPLY 返回协议,表示 Service 进程已经处理完它的进程间通信请求了,并且将进程间通信结果返回给它。
为什么 Binder 驱动程序要发送一个 BR_TRANSACTION_COMPLETE 返回协议来响应 Client 进程和 Service 进程的 BC_TRANSACTION 与 BC_REPLY 命令协议呢?Client 进程和 Service 进程其实并不需要对 BR_TRANSACTION_COMPLETE 返回协议做特殊处理。这样做其实是为了让 Client 进程和 Service 进程在执行进程间通信的过程中,有机会返回到用户空间去做其他事情,从而增加它们的并发处理能力。
在接下来的内容中,我们将根据上述五个步骤来分析 BpServiceManager 类的成员函数 addService 的实现。
**封装进程间通信数据**