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ć.
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
Dzięki za miłe wyjaśnienie – Chakkra
Istnienie BnServiceManager również bardzo mnie niepokoi. Dzięki twojemu eleganckiemu i jasnemu wyjaśnieniu. ~~ –