Sobre os processos do Zigoto

O Zygote é 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, 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.

Estas são as tarefas que o Zygote executa:

  1. 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.

  2. O Zigoto pode gerar processos imediatamente, 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 da ponte de depuração do Android. 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 do USAP estiver ativado no dispositivo:

      1. 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.
      2. Quando a USAP termina a pré-configuração, ela responde ao servidor do sistema com o PID.
      3. 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:

      1. O servidor do sistema recebe um comando informando que um app precisa de um processo.
      2. O servidor do sistema usa um soquete de domínio Unix para enviar um comando ao Zygote apropriado.
      3. O Zygote bifurca o processo e muda o PID, o cgroup e outras informações.
      4. 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_enabled como true 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 Zygote

Esta seção contém soluções para problemas relacionados ao Zygote.

O zigoto está falhando

Se o dispositivo não for reinicializado corretamente e os registros ou relatórios de falha mostrarem problemas com o Zygote, provavelmente você fez uma mudança recente que causa uma 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 arquivos em todos os limites de processo. Quando os descritores de arquivo estão presentes no momento da bifurcação, mas não estão em uma lista de permissões, usamos uma chamada de sistema dup para /dev/null para evitar que os descritores de arquivo armazenados em cache sejam usados acidentalmente para acessar arquivos recém-abertos.

Se você estiver fazendo mudanças no framework que incluem a tentativa de carregar recursos no Zygote e receber negações do SELinux ou falhas de E/S:

  • Para descritores de arquivos sem nome, inclua os descritores de arquivos no vetor fds_to_ignore quando Restat for chamado.

  • Para descritores de arquivos nomeados:

    1. Editar WORKING_DIRECTORY/frameworks/base/core/jni/fd_utils.cpp.
    2. Adicione o caminho à lista de permissões para arquivos abertos.