O Zygote é um processo no sistema operacional Android que atua como a raiz de todos os processos do sistema e de apps com a mesma interface binária de aplicativo (ABI, na sigla em inglês).
Em dispositivos modernos, como o Pixel 7 e versões mais recentes, há um processo Zygote de 64 bits. Além disso, há o WebView Zygote para a ABI principal, que é um Zygote especializado que contém bibliotecas e recursos específicos para processos que executam WebViews.
Confira as tarefas que o Zygote realiza:
O daemon init gera o processo Zygote quando o SO Android é inicializado. Em alguns sistemas de arquitetura dupla, dois processos Zygote (de 64 e 32 bits) são gerados. Esta página abrange apenas sistemas de arquitetura única.
O Zygote pode gerar imediatamente processos chamados de processos de app não especializados (USAP, na sigla em inglês) ou esperar para gerar processos conforme necessário pelos aplicativos. A primeira opção precisa ser ativada por uma propriedade do sistema ou um comando do Android Debug Bridge. Para mais informações sobre como configurar o Zygote para gerar processos imediatamente, consulte Ativar o pool de processos de apps não especializados .
Se o pool da USAP estiver ativado no seu dispositivo:
- O servidor do sistema usa um soquete de domínio Unix para se conectar a um USAP disponível de um pool. O servidor do sistema solicita que a USAP seja pré-configurada para uso do aplicativo mudando o ID do processo (PID), o cgroup e outras informações.
- Quando a USAP termina a pré-configuração, ela responde ao servidor do sistema com o PID.
- Quando um aplicativo ocupa um desses USAPs, ele não faz mais parte do pool. Quando o pool atinge um ou menos USAPs, o Zygote o preenche com novos USAPs.
Se o Zygote gerar processos usando avaliação lenta:
- O servidor do sistema recebe um comando de que um app precisa de um processo.
- O servidor do sistema usa um soquete de domínio Unix para enviar um comando ao Zygote apropriado.
- O Zygote bifurca o processo e muda o PID, o cgroup e outras informações.
- Quando o processo é concluído, ele envia o PID de volta ao Zygote, que o transmite de volta ao servidor do sistema.
Ativar o pool USAP
Para ativar o uso do pool USAP, faça o seguinte:
Defina a propriedade do sistema
dalvik.vm.usap_pool_enabledcomotrueem/build/make/target/product/runtime_libart.mk.Execute este comando:
adb shell am broadcast -a \"com.google.android.gms.phenotype.FLAG_OVERRIDE\" --es package \"com.google.android.platform.runtime_native\" --es user \"\*\" --esa flags \"usap_pool_enabled\" --esa values \"true\" --esa types \"string\" com.google.android.gms
Quando esse recurso está ativado, cada Zygote mantém um pool de processos bifurcados que executam as partes independentes do aplicativo do processo de inicialização do aplicativo.
Resolver problemas do Zygote
Esta seção contém soluções para problemas relacionados ao Zygote.
O Zygote está falhando
Se o dispositivo não reiniciar corretamente e os registros ou relatórios de falha mostrarem problemas com o Zygote, provavelmente é porque você fez uma mudança recente que causa falha no initd ou no servidor do sistema. Corrigir o código deve resolver o problema.
Negações do SELinux ou falhas de E/S
O Zygote é específico sobre a higiene do descritor de arquivo em limites de processo. Quando os descritores de arquivo estão presentes no momento da ramificação, mas não em uma lista de permissões, usamos uma chamada de sistema dup para /dev/null e evitamos que os descritores de arquivo armazenados em cache sejam usados sem querer para acessar arquivos recém-abertos.
Se você estiver fazendo mudanças no framework que incluem tentar carregar recursos no Zygote e estiver recebendo negações do SELinux ou falhas de E/S:
Para descritores de arquivo sem nome, inclua-os no vetor
fds_to_ignorequandoRestatfor chamado.Para descritores de arquivos nomeados:
- Editar
WORKING_DIRECTORY/frameworks/base/core/jni/fd_utils.cpp. - Adicione o caminho à lista de permissões para arquivos abertos.
- Editar