В AOSP, где реализован ServiceManager

В файле IServiceManager.cpp я вижу определение функции BnServiceManager::onTransact .

Внутри этой функции есть вызов « addService », « listServices » и т. Д.

Я не смог найти реализацию этих функций (объявленных в IServiceManager).

Может кто-нибудь, пожалуйста, скажите мне, где найти реализацию BnServiceManager.

    Он находится в service_manager.c , в рамках frameworks / base / cmds / servicemanager.

    Вы можете задаться вопросом, как они находят servicemanager, это особенность связующего, после того, как системный сервер запустит servicemanager (вызов main в service_manager.c), servicemanager зарегистрируется как context_manager связующего с помощью ioctl(bs->fd, BINDER_SET_CONTEXT_MGR, 0); , Тогда вы всегда можете получить эту услугу из связующего.

    Поэтому, когда другая служба хочет использовать диспетчер служб для просмотра, поиска или добавления службы, она defaultServiceManager метод IServiceManager.cpp в 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 начнет транзакцию связывания, и транзакция связывания, наконец, будет обработана BnCameraService, которая является CameraService.

    Вы можете выполнить поиск по всему AOSP, не существует реализации BnServiceManager, поэтому его невозможно вызвать.