IServiceManager.cpp
ファイルには、BnServiceManager::onTransact
関数定義が表示されます。
その関数内で、" addService
"、" listServices
" などの呼び出しがあります。
これらの関数 (IServiceManager で宣言されている) の実装が見つかりませんでした。
BnServiceManager の実装の場所を教えてください。
IServiceManager.cpp
ファイルには、BnServiceManager::onTransact
関数定義が表示されます。
その関数内で、" addService
"、" listServices
" などの呼び出しがあります。
これらの関数 (IServiceManager で宣言されている) の実装が見つかりませんでした。
BnServiceManager の実装の場所を教えてください。
これは、frameworks/base/cmds/servicemanager の下のservice_manager.cにあります。
servicemanager をどのように見つけるのか疑問に思うかもしれませんが、これはバインダーの機能です。systemserver が servicemanager を開始した後 (service_manager.c で main を呼び出します)、servicemanager は自分自身をバインダーの context_manager として登録しioctl(bs->fd, BINDER_SET_CONTEXT_MGR, 0);
ます。その後、いつでもバインダーからそのサービスを取得できます。
そのため、他のサービスがサービス マネージャーを使用してサービスを一覧表示、検索、または追加する場合は、 のdefaultServiceManager
メソッドを呼び出しますIServiceManager.cpp
。このメソッドは、ハンドル 0 を検索して BpServiceManager を取得します。を使用するBpServiceManager->addService
と、 は呼び出されませんBnServiceManager
。これは、CameraService などの他のサービスとは少し異なります。バインダーはトランザクション コードを直接解析し、 のdo_add_service
メソッドを呼び出しますservice_manager.c
。BpServiceManager によって使用されるトランザクション コードが svcmgr_handler のものとまったく同じであることに気付くかもしれません。
//transaction code used by svcmgr_handler
enum {
SVC_MGR_GET_SERVICE = 1,
SVC_MGR_CHECK_SERVICE,
SVC_MGR_ADD_SERVICE,
SVC_MGR_LIST_SERVICES,
};
//transaction code used by BpServiceManager.
enum {
GET_SERVICE_TRANSACTION = IBinder::FIRST_CALL_TRANSACTION, //0x00000001
CHECK_SERVICE_TRANSACTION,
ADD_SERVICE_TRANSACTION,
LIST_SERVICES_TRANSACTION,
};
servicemanager のみがこのように機能し、他の BpService は BnService を呼び出します。たとえば、CameraService は BnCameraService を拡張するため、CameraService の実際のサーバー側です。BpCameraService はバインダー トランザクションを開始し、バインダー トランザクションは最終的に CameraService である BnCameraService によって処理されます。
AOSP 全体を検索できますが、BnServiceManager の実装がないため、呼び出されることはありません。