O Zigoto é um processo no sistema operacional Android que atua como a raiz de todos os processos do sistema e do app com a mesma interface binária do aplicativo (ABI).
Em dispositivos modernos, como o Pixel 7 e versões mais recentes, há um processo Zygote de 64 bits. Além disso, há o Zigoto WebView para a ABI principal, que é um Zigoto especializado que contém bibliotecas e recursos específicos para processos que executam WebViews.
Aqui estão as tarefas que o Zigoto realiza:
O daemon init gera o processo Zygote quando o SO Android é inicializado. Em alguns sistemas de arquitetura dupla, dois processos Zygote (um de 64 bits e outro de 32 bits) são gerados. Esta página abrange apenas sistemas de arquitetura única.
O Zigoto pode gerar imediatamente processos chamados de processos de apps 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 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 USAP estiver ativado no 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 o USAP seja pré-configurado 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 deixa de fazer parte do pool. Quando o pool atinge um ou menos USAPs, o Zygote reabastece o pool com novos USAPs.
Se o Zigoto gerar processos usando a avaliação lenta:
- O servidor do sistema recebe um comando informando 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 Zigoto, que o passa 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_enabled
comotrue
em/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 Zigoto mantém um pool de processos bifurcados que executam as partes independentes do aplicativo do processo de inicialização do aplicativo.
Resolver problemas do Zigoto
Esta seção contém soluções para problemas relacionados ao Zygote.
O Zygote está falhando
Se o dispositivo não for reinicializado corretamente e os registros ou relatórios de erros mostrarem problemas com o Zigoto, é provável que você tenha feito uma mudança recente que causou a falha do init ou do servidor do sistema. Corrigir o código deve resolver o problema.
Negações do SELinux ou falhas de E/S
O Zigoto é específico sobre a integridade do descritor de arquivos entre os limites do processo. Quando os descritores de arquivo estão presentes no momento da bifurcação, mas não em uma lista de permissões, usamos uma chamada do sistema dup
para /dev/null
para evitar que descritores de arquivo em cache sejam usados acidentalmente para acessar arquivos recém-abertos.
Se você estiver fazendo alterações no framework que incluem a tentativa de carregar recursos no Zigoto e estiver recebendo negações de SELinux ou falhas de E/S:
Para descritores de arquivo sem nome, inclua os descritores de arquivo no vetor
fds_to_ignore
quandoRestat
for chamado.Para descritores de arquivos nomeados:
- Edite
WORKING_DIRECTORY/frameworks/base/core/jni/fd_utils.cpp
. - Adicione o caminho à lista de permissões para arquivos abertos.
- Edite