7

IServiceManager.cppファイルには、BnServiceManager::onTransact関数定義が表示されます。

その関数内で、" addService"、" listServices" などの呼び出しがあります。

これらの関数 (IServiceManager で宣言されている) の実装が見つかりませんでした。

BnServiceManager の実装の場所を教えてください。

4

1 に答える 1

10

これは、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 の実装がないため、呼び出されることはありません。

于 2013-03-20T00:37:08.533 に答える