Tabla de contenido
Registrar servicio del sistema
introducción:
Antes de registrarse o utilizar un servicio, debe encontrar el servicio correspondiente a través de ServiceManager, el DNS. Entonces, ¿cómo se encuentra el ServiceManager?
¿Cómo registrar el servicio del sistema?
¿Cómo obtener servicios del sistema?
ObtenerServiceManager
marco/nativo/libs/binder/
- Estado de proceso.cpp
- BpBinder.cpp
- Carpeta.cpp
- IServiceManager.cpp
marco/nativo/incluir/aglutinante/
-IServiceManager.h
- IInterfaz.h
Obtenga el objeto gDefaultServiceManager mediante el método defaultServiceManager. Si el objeto existe, regresa directamente, y si el objeto no existe, lo crea.
El proceso de creación: abra el controlador de carpeta, mmap asigna el espacio de direcciones del kernel e ingresa al bucle de mensajes
diagrama de flujo
El proceso de creación de gDefaultServiceManager se puede descomponer en los siguientes tres pasos:
1) ProcessState::self(): se utiliza para obtener el objeto ProcessState (también modo singleton), cada proceso tiene un y solo un objeto ProcessState, si existe, se devolverá directamente, si no existe, se creará ; 2) getContextObject(): se usa para
obtener el objeto BpBinder, para el objeto BpBinder con handle=0, si existe, se devolverá directamente, si no existe, se creará; 3) interface_cast<IServiceManager>
( ): utilizado para obtener el objeto BpServiceManager;
defaultServiceManager es equivalente a new BpServiceManager(new BpBinder(0));
El trabajo principal de ProcessState::self():
llamar a open() para abrir el dispositivo de disco /dev/binder;
luego usar mmap() para crear un espacio de direcciones de memoria con un tamaño de 1M-8K;
establecer el número máximo de concurrentes Hilos de carpeta en el proceso actual El número es 16.
BpServiceManager integra inteligentemente la lógica de la capa de comunicación y la capa empresarial:
La función de lógica de negocios en la interfaz se realiza heredando la interfaz IServiceManager; el
trabajo de comunicación de Binder se realiza a través de la variable miembro mRemote=new BpBinder (0).
BpBinder apunta al BBinder correspondiente a través del controlador. En todo el sistema Binder, handle = 0 representa el BBinder correspondiente al ServiceManager.
Registrar servicio del sistema
framework/native/libs/binder/
- Binder.cpp
- BpBinder.cpp
- IPCThreadState.cpp
- ProcessState.cpp
- IServiceManager.cpp
- IInterface.cpp
- Parcel.cpp
frameworks/native/include/binder/
- IInterface.h (包括BnInterface, BpInterface)