A partir de Android 11, los servicios de AIDL nativos que se ejecutan en la partición del sistema puede iniciarse y detenerse dinámicamente según sea necesario. Los servicios dinámicos comienzan cuando se solicitan por primera vez y se detienen automáticamente cuando ya no están en uso.
Servicios que pueden ejecutarse de forma dinámica
Esta función solo está disponible para los servicios nativos cuyos ciclos de vida se pueden controlar con init
y servicemanager
. Los servicios dentro de los paquetes de apps no se admiten y, en su lugar, deben usar servicios vinculados.
El cierre dinámico funciona apagando el proceso en el que se ejecuta el servicio. Si existen varios servicios en el mismo proceso, todos deben estar registrados. sean dinámicos para ser compatibles con esta función. Luego, ese proceso se cerrará cuando no se usen todos los servicios.
Configura el archivo .rc init de un servicio
Para ejecutar un servicio de forma dinámica, agrega las siguientes opciones al archivo .rc
de inicio del servicio después de la línea service <name> <cmd>
inicial.
interface aidl serviceName
disabled
oneshot
Estas opciones hacen lo siguiente:
interface aidl serviceName
: Permite queservicemanager
encuentre el servicio. Si el servicio usa varias interfaces, declara cada una en su propia línea. Estos nombres deben ser exactamente lo queservicemanager
espera y pueden difiere del nombre del proceso.disabled
: Impide que el servicio se inicie automáticamente durante el inicio.oneshot
: Evita que el servicio se reinicie automáticamente cada vez que se detuvo.
Para obtener más información, consulta el documento de Android Init Language Léame en el AOSP.
Ejemplos:
Registra un servicio
Cada servicio se crea y registra con servicemanager
. Registro frecuente
se produce en un archivo llamado main.cpp
, pero la implementación puede variar. El
por lo general, se ve de la siguiente manera:
using android::defaultServiceManager;
defaultServiceManager()->addService(serviceName, service);
A veces, BinderService::publish
o BinderService::instantiate
abstraen el registro, que llama al código anterior.
Para registrar un servicio como dinámico, reemplaza su código de registro por lo siguiente:
#include <binder/LazyServiceRegistrar.h>
using android::binder::LazyServiceRegistrar;
auto lazyRegistrar = LazyServiceRegistrar::getInstance();
lazyRegistrar.registerService(service, serviceName);
servicemanager
se comunica con LazyServiceRegistrar
para cerrar servicios
según sus recuentos de referencias.
Ejemplos:
Configura clientes de servicios AIDL
Cómo obtener el servicio
Para recuperar un servicio diferido, primero debes iniciarlo y, luego, recuperarlo.
Una llamada a getService
en el administrador del servicio iniciará el servicio, pero, por lo general,
deseas obtener el servicio en cuanto esté disponible y waitForService
se deberían usar variantes de producto. Consulta la página backend-específica
documentación
sobre cómo usarlas.
Libera el servicio
El cierre dinámico se basa en el recuento de referencias, por lo que los clientes no deben conservar el servicio cuando no está en uso.
Ejemplos:
Inhabilitar temporalmente el cierre
Si deseas que un servicio se ejecute de forma independiente hasta que se completen ciertas tareas y, luego, cambie al comportamiento dinámico, puedes usar LazyServiceRegistrar::forcePersist
para activar o desactivar el cierre dinámico. Si se llama a esto desde el servidor, se debe llamar antes de registerService
.
Ejemplo: apexservice