Mecanismo de carpeta basado en IPC de Android

IPC

Concepto : La comunicación entre procesos o la comunicación entre procesos se refiere al proceso de intercambio de datos entre dos procesos.
Origen : La premisa de que dos objetos pueden acceder directamente entre sí es que ambos objetos existen en el mismo espacio de direcciones de memoria. Dos objetos existen en dos procesos diferentes, por lo que los dos objetos no pueden llamarse entre sí directamente, y se requiere tecnología de comunicación entre procesos

Mecanismo de encuadernación

Binder es una clase en Android que implementa la interfaz IBinder. En el desarrollo de Android, Binder se utiliza principalmente en el servicio, incluidos AIDL y Messenger. Binder en el servicio normal no implica comunicación entre procesos, y la capa inferior de Messenger es en realidad AIDL; todas las interfaces que se pueden transmitir en Binder deben integrar el Interfaz de interfaz

  • Desde la perspectiva de IPC, Binder es un método de comunicación entre procesos en Android. Binder puede entenderse como un dispositivo físico virtual. Su controlador de dispositivo es / dev / binder, que no está disponible en Linux.
  • Desde la perspectiva de Android Framework, Binder es un puente entre ServiceManager para conectar varios administradores (ActivityManager, WindowManager, etc.) y el correspondiente ManagerService
  • Desde la capa de aplicación de Android, Binder es el medio de comunicación entre el cliente y el servidor. Cuando bindService, el servidor devolverá un objeto Binder que contiene las llamadas comerciales del lado del servidor. A través de este objeto Binder, el cliente puede obtener el servidor Servicios o datos proporcionados, los servicios aquí incluyen servidores ordinarios y servicios basados ​​en AIDL

Composición aglutinante


Inserte la descripción de la imagen aquí
Ilustración de cuatro módulos importantes involucrados en Binder: Cliente, Servidor, Administrador del servidor y Controlador de Binder :

  1. El controlador Binder está ubicado en el espacio del kernel, registrado como tipo misc en el dispositivo de caracteres, se comunica con el controlador Binder a través de las funciones de operación de archivos abiertos y ioctl, y es el principal responsable del establecimiento de la comunicación Binder, así como de su transferencia. entre procesos y gestión de recuento de referencias de Binder / gestión de paquetes de datos
  2. La comunicación entre procesos entre el cliente de Binder y el servidor de Binder se procesa y reenvía de manera uniforme a través del controlador de Binder.
  3. El nombre del Binder utilizado por el Cliente Binder y la entidad Binder se hace referencia en ServerManager en el n. ° 0, y la referencia del Binder se obtiene accediendo al Administrador del servidor a través del número de referencia (la referencia del Binder la convierte el Administrador del servidor ), y entonces se puede llamar al método de la entidad Binder; Binder Client consulta la interfaz del servidor Binder a través de ServerManager.
  4. Cuando el servidor Binder genera una entidad Binder, le asigna un nombre y lo encapsula en un paquete de datos y lo pasa al controlador Binder. Una vez que el controlador Binder recibe el paquete de datos, si encuentra que el Binder se ha entregado recientemente, it Será un nodo de entidad de Binder (Binder_node) y una referencia de nodo de entidad (Binder_ref) en el espacio del kernel. Una vez completada la creación, el controlador de Binder pasará la referencia al ServerManager y el ServerManager sacará el nombre del Binder. y La referencia se inserta en una tabla de datos.

Nota: ServerManager es un servidor Binder estándar y se acuerda en Android que su identificador único en el proceso de comunicación de Binder es 0

Administrador del servidor

La función principal es convertir el nombre de Binder en caracteres en una referencia

 public interface IServiceManager extends IInterface
30{
31    
36    IBinder getService(String name) throws RemoteException;
38  
42    IBinder checkService(String name) throws RemoteException;
43
48    void addService(String name, IBinder service, boolean allowIsolated, int dumpFlags)
49            throws RemoteException;
50
54    String[] listServices(int dumpFlags) throws RemoteException;

60    void setPermissionController(IPermissionController controller)
61            throws RemoteException;
62
63    static final String descriptor = "android.os.IServiceManager";
64
65    int GET_SERVICE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION;
66    int CHECK_SERVICE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+1;
67    int ADD_SERVICE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+2;
68    int LIST_SERVICES_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+3;
69    int CHECK_SERVICES_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+4;
70    int SET_PERMISSION_CONTROLLER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+5;
90}

Para ServiceManagerNative y ServiceManagerProxy en el lado del cliente, esta interfaz está implementada.

Supongo que te gusta

Origin blog.csdn.net/xufei5789651/article/details/99061840
Recomendado
Clasificación