Binder IPC机制定义了四种角色: Service,Client,ServiceManager以及Binder驱动。这四个角色的关系和互联网类似:Service相当于服务器,Client相当于客户端,ServiceManager相当于DNS,Binder驱动相当于路由器。
Binder架构图如下所示:
在开机时,由init进程启动
init.rc
service servicemanager /system/bin/servicemanager
启动后进入循环监视
service_manager.c
binder_loop(bs, svcmgr_handler)
public static void addService(String name, IBinder service)
参数 name:要注册的服务名称
参数 service:要注册的服务
SystemServer.java
Slog.i(TAG, "Scheduling Policy");
ServiceManager.addService("scheduling_policy", new SchedulingPolicyService());
mSystemServiceManager.startService(TelecomLoaderService.class);
Slog.i(TAG, "Telephony Registry");
telephonyRegistry = new TelephonyRegistry(context);
ServiceManager.addService("telephony.registry", telephonyRegistry);
Slog.i(TAG, "Entropy Mixer");
entropyMixer = new EntropyMixer(context);
mContentResolver = context.getContentResolver();
Slog.i(TAG, "Camera Service");
mSystemServiceManager.startService(CameraService.class);
// The AccountManager must come before the ContentService
try {
// TODO: seems like this should be disable-able, but req'd by ContentService
Slog.i(TAG, "Account Manager");
accountManager = new AccountManagerService(context);
ServiceManager.addService(Context.ACCOUNT_SERVICE, accountManager);
} catch (Throwable e) {
Slog.e(TAG, "Failure starting Account Manager", e);
}
注册成功后的service,可以通过service list命令查看
130|root@local:/ # service list
Found 135 services:
0 media.widi.uibc: [intel.widi.IUibcServer]
1 cmcc_conference: [com.grandstream.convergentconference.service.IConferenceService]
2 gs_service_internal_proxy: [com.gs.service.IGsServiceInternalProxy]
3 gs_service_ucm: [com.gs.ucm.IUcmManager]
4 gs_service_ldap: [com.gs.ldap.manager.ILDAPServiceManager]
5 gs_service_guest_login: [com.gs.api.guest.IGuestLoginManager]
1.检索服务是值当客户端需要与service进行通信时,首先要通过ServiceManager检索service的Binder节点,并返回给客户端,此时客户端就知道用哪个Binder进行通信了。
2.客户端与ServiceManager之间也是通过Binder通讯的,但客户端与ServiceManager通讯之前不需要查找ServiceManager的Binder编号。因为ServiceManager的Binder编号固定为0.当客户端需要通过ServiceManager查找所需服务的Binder节点时,直接通过0号Binder。
3. public static IBinder checkService(String name)
参数name:要检索的服务名称
返回值:和name服务通讯的Binder节点。
IBinder binder = ServiceManager.getService("vibrator")
Android ServiceManager的 Binder IPC如下所示
如图上图,基本的Binder IPC与ServiceManager的Binder IPC略有不同,由Binder Driver返回的RPC
数据,基本的Binder IPC是由服务Stub处理;Binder Driver尽心循环监视,当有数据到来时,触发处理函数svcmgr_handler.请参考代码: service_manager.c binder_loop(bs, svcmgr_handler)
。