A partir do Android 11, os serviços AIDL nativos em execução na partição do sistema podem ser iniciados e interrompidos dinamicamente conforme necessário. Os serviços dinâmicos são iniciados quando solicitados pela primeira vez e param automaticamente quando não estão mais em uso.
Serviços que podem ser executados dinamicamente
Esse recurso está disponível apenas para serviços nativos com ciclos de vida que podem ser
controlado por init
e servicemanager
. Os serviços em pacotes de apps não têm
suporte e precisam usar serviços vinculados.
O desligamento dinâmico funciona desativando o processo em que o serviço é executado. Se vários serviços existirem no mesmo processo, todos eles precisarão ser registrados como dinâmicos para serem compatíveis com esse recurso. Esse processo será encerrado quando todos os serviços estiverem inativos.
Configurar o arquivo init .rc de um serviço
Para executar um serviço dinamicamente, adicione as seguintes opções ao init do serviço
.rc
após a linha service <name> <cmd>
inicial.
interface aidl serviceName
disabled
oneshot
Essas opções fazem o seguinte:
interface aidl serviceName
: permite queservicemanager
encontre o serviço. Se o serviço usar várias interfaces, declare cada uma delas sozinha linha Esses nomes precisam ser exatamente o queservicemanager
espera e podem diferir do nome do processo.disabled
: impede que o serviço seja iniciado automaticamente na inicialização.oneshot
: impede que o serviço seja reiniciado automaticamente toda vez que é executado. seja interrompida.
Para mais informações, consulte a documentação Android Init Language Leiame no AOSP.
Exemplos:
Registrar um serviço
Cada serviço é criado e registrado com servicemanager
. Faça o registro com frequência
ocorre em um arquivo chamado main.cpp
, mas a implementação pode variar. O
registro geralmente tem esta aparência:
using android::defaultServiceManager;
defaultServiceManager()->addService(serviceName, service);
Às vezes, o registro é cancelado por BinderService::publish
ou
BinderService::instantiate
, que chamam o código acima.
Para registrar um serviço como dinâmico, substitua seu código de registro pelo seguintes:
#include <binder/LazyServiceRegistrar.h>
using android::binder::LazyServiceRegistrar;
auto lazyRegistrar = LazyServiceRegistrar::getInstance();
lazyRegistrar.registerService(service, serviceName);
O servicemanager
se comunica com LazyServiceRegistrar
para encerrar os serviços
com base nas contagens de referência deles.
Exemplos:
Configurar clientes de serviço da AIDL
Acessar o serviço
Para recuperar um serviço preguiçoso, ele precisa ser iniciado e recuperado.
Chamar getService
no gerenciador de serviços iniciará o serviço, mas geralmente
você quer o serviço assim que ele estiver disponível e waitForService
variantes devem ser usadas. Consulte a documentação específica do
back-end
para saber como usá-los.
Liberar o serviço
O desligamento dinâmico é baseado na contagem de referências. Portanto, os clientes não podem manter o serviço quando ele não está em uso.
Exemplos:
Desativar temporariamente o desligamento
Se você quer que um serviço seja executado de forma independente até que certas tarefas sejam concluídas
e mudar para o comportamento dinâmico,
LazyServiceRegistrar::forcePersist
para ativar e desativar o encerramento dinâmico. Se
for chamado no lado do servidor, deverá ser chamado antes
registerService
.
Exemplo: apexservice