2013-03-19 13 views
5

W pliku IServiceManager.cpp widzę definicję funkcji BnServiceManager::onTransact.W AOSP, gdzie jest ServiceManager zaimplementowany

Wewnątrz tej funkcji, nie jest to wezwanie do „addService”, „listServices” itd

nie mogłem znaleźć na realizację tych funkcji (które są zadeklarowane pod IServiceManager).

Czy ktoś może mi powiedzieć, gdzie można znaleźć implementację BnServiceManager.

Odpowiedz

8

Jest w service_manager.c, w ramach/base/cmds/servicemanager.

Być może zastanawiasz się, w jaki sposób znajdują operatora usług, jest to funkcja spoiwa, po uruchomieniu przez operatora systemu servicemanager (wywołanie główne w service_manager.c), serwisant zarejestruje się jako menedżer_ kontekstu spoiwa przez ioctl(bs->fd, BINDER_SET_CONTEXT_MGR, 0);. Wtedy zawsze możesz uzyskać tę usługę ze spoiwa.

Jeśli więc inna usługa chce użyć menedżera usług do wyświetlenia, wyszukania lub dodania usługi, zadzwoni pod numer defaultServiceManager w IServiceManager.cpp. Ta metoda wyszuka uchwyt 0, aby uzyskać BpServiceManager. Gdy używasz BpServiceManager->addService, nie wywoła ona BnServiceManager, jest to nieco inna z innymi usługami, takimi jak CameraService. Spoiwo bezpośrednio analizuje kod transakcji i wywołuje metodę do_add_service w service_manager.c. Możesz zauważyć, że kod transakcji używany przez BpServiceManager jest dokładnie taki sam jak kod w 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, 
    }; 

Tylko ServiceManager działa tak, inne BpService wezwie ich BnService, Na przykład, CameraService rozszerza BnCameraService, więc jest to rzeczywista stronie serwera CameraService. BpCameraService rozpocznie transakcję segregatorową, a transakcja wiążąca zostanie w końcu zajęta przez BnCameraService, która jest usługą CameraService.

Możesz przeszukiwać cały AOSP, nie ma implementacji BnServiceManager, więc nie można go wywołać.

+0

Cześć, dziękuję za odpowiedź. Przeszedłem przez plik service_manager.c. Widzę, że service_manager reigisters się do segregatora z uchwytem "0", aby określić, że jest to menedżer usług. Tak więc, gdy żądanie serwisowe (getService) trafia do BpServiceManager, , czy chcesz powiedzieć, że segregator nie wywoła BnServiceManager :: onTransact, zamiast tego wywoła svcmgr_handler zarejestrowany w service_manager.c? W takim przypadku, czy mogę wiedzieć, dlaczego zdefiniowano BnServiceManager? Proszę, popraw mnie, jeśli moje zrozumienie jest złe. – Chakkra

+0

Dzięki za miłe wyjaśnienie – Chakkra

+0

Istnienie BnServiceManager również bardzo mnie niepokoi. Dzięki twojemu eleganckiemu i jasnemu wyjaśnieniu. ~~ –

Powiązane problemy