2013-03-19 12 views
5

In der IServiceManager.cpp Datei, sehe ich die BnServiceManager::onTransact Funktionsdefinition.In AOSP, wo ist der ServiceManager implementiert

Innerhalb dieser Funktion gibt es einen Aufruf zu „addService“, „listServices“ usw.

ich nicht die Implementierung für diese Funktionen finden konnte (die unter IServiceManager deklariert werden).

Kann mir bitte jemand sagen, wo die Implementierung von BnServiceManager zu finden ist.

Antwort

8

Es ist in service_manager.c, unter Frameworks/Base/cmds/servicemanager.

Sie wundern sich vielleicht, wie sie die Servicemanager zu finden, ist es ein Merkmal des Bindemittels nach dem systemserver Start Servicemanager (Call Haupt in service_manager.c), der Servicemanager selbst als context_manager des Bindemittels durch ioctl(bs->fd, BINDER_SET_CONTEXT_MGR, 0); registriert. Dann können Sie diesen Service immer von Binder bekommen.

Wenn also ein anderer Dienst den Dienst-Manager zum Auflisten, Suchen oder Hinzufügen eines Dienstes verwenden möchte, ruft er defaultServiceManager in IServiceManager.cpp auf. Diese Methode sucht nach dem Handle 0, um den BpServiceManager zu erhalten. Wenn Sie BpServiceManager->addService verwenden, ruft es BnServiceManager nicht auf, das ist etwas anders mit anderem Dienst wie CameraService. Der Binder analysiert den Transaktionscode direkt und ruft do_add_service in service_manager.c auf. Möglicherweise stellen Sie fest, dass der Transaktionscode, der von BpServiceManager verwandt wird, genau mit dem in svcmgr_handler verwandt wird.

//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, 
    }; 

Nur Servicemanager wie das funktioniert, werden andere BpService nennen ihre BnService, zum Beispiel die CameraService die BnCameraService erstreckt, so dass er der eigentliche Server-Seite von CameraService ist. Der BpCameraService startet eine Bindertransaktion, und die Bindertransaktion wird schließlich von BnCameraService, dem CameraService, verarbeitet.

Sie können den gesamten AOSP durchsuchen, es gibt keine Implementierung von BnServiceManager, daher ist es nicht möglich, dass er aufgerufen wird.

+0

Hallo, danke für die Antwort. Ich ging durch die Datei service_manager.c. Ich sehe, dass der service_manager sich an den Binder mit Handle '0' reigisters, um anzugeben, dass es der Service-Manager ist. Also, wenn eine Dienstanforderung (getService) an BpServiceManager geht, meinen Sie , dass die Sammelmappe nicht den BnServiceManager :: onTransact aufrufen wird, sondern den in service_manager.c registrierten svcmgr_handler aufrufen? In diesem Fall, kann ich wissen, warum der BnServiceManager definiert wurde? Bitte korrigieren Sie mich, wenn mein Verständnis falsch ist. – Chakkra

+0

Danke für die nette Erklärung – Chakkra

+0

Die Existenz von BnServiceManager stört mich auch sehr. Dank Ihrer eleganten und klaren Erklärung. ~~ –

Verwandte Themen