Zygote 프로세스 정보

Zygote 는 동일한 애플리케이션 바이너리 인터페이스 (ABI)를 사용하는 모든 시스템 및 앱 프로세스의 루트 역할을 하는 Android 운영체제의 프로세스입니다.

Pixel 7과 같은 최신 기기에는 64비트 Zygote 프로세스가 있습니다. 또한 WebView를 실행하는 프로세스에 특정한 라이브러리와 리소스가 포함된 특수 Zygote인 기본 ABI용 WebView Zygote 가 있습니다.

다음은 Zygote가 실행하는 작업입니다.

  1. Android OS가 초기화되면 init 데몬이 Zygote 프로세스를 생성합니다. 일부 듀얼 아키텍처 시스템에서는 두 개의 Zygote 프로세스 (64비트 및 32비트)가 생성됩니다. 이 페이지에서는 단일 아키텍처 시스템만 다룹니다.

  2. Zygote는 특수화되지 않은 앱 프로세스 (USAP) 라는 프로세스를 즉시 생성하거나 애플리케이션에 필요한 프로세스를 생성할 때까지 기다릴 수 있습니다. 전자는 시스템 속성 또는 Android 디버그 브리지 명령어를 통해 사용 설정해야 합니다. 프로세스를 즉시 생성하도록 Zygote를 구성하는 방법에 관한 자세한 내용은 특수화되지 않은 앱 프로세스 풀 사용 설정 을 참고하세요.

    • 기기에서 USAP 풀이 사용 설정된 경우:

      1. 시스템 서버는 Unix 도메인 소켓을 사용하여 풀에서 사용 가능한 USAP에 연결합니다. 시스템 서버는 프로세스의 ID (PID), cgroup 및 기타 정보를 변경하여 애플리케이션에서 사용할 수 있도록 USAP를 사전 구성하도록 요청합니다.
      2. USAP가 사전 구성을 완료하면 PID로 시스템 서버에 응답합니다.
      3. 애플리케이션이 이러한 USAP 중 하나를 차지하면 USAP는 더 이상 풀의 일부가 아닙니다. 풀에 USAP가 하나 이하로 남으면 Zygote는 새 USAP로 풀을 보충합니다.
    • Zygote가 지연 평가를 사용하여 프로세스를 생성하는 경우:

      1. 시스템 서버는 앱에 프로세스가 필요하다는 명령어를 수신합니다.
      2. 시스템 서버는 Unix 도메인 소켓을 사용하여 적절한 Zygote에 명령어를 전송합니다.
      3. Zygote는 프로세스를 포크하고 PID, cgroup 및 기타 정보를 변경합니다.
      4. 프로세스가 완료되면 PID를 Zygote에 다시 전송하고 Zygote는 이를 시스템 서버에 다시 전달합니다.

USAP 풀 사용 설정

USAP 풀을 사용 설정하려면 다음 중 하나를 실행하세요.

  • dalvik.vm.usap_pool_enabled 시스템 속성을 /build/make/target/product/runtime_libart.mk에서 true로 설정합니다.

  • 다음 명령어를 실행합니다.

    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
    

이 기능을 사용 설정하면 각 Zygote는 애플리케이션 시작 프로세스의 애플리케이션 독립적인 부분을 실행하는 포크된 프로세스 풀을 유지합니다.

Zygote 문제 해결

이 섹션에는 Zygote 관련 문제의 해결 방법이 포함되어 있습니다.

Zygote가 비정상 종료됨

기기가 제대로 재부팅되지 않고 로그 또는 비정상 종료 보고서에 Zygote 관련 문제가 표시되면 최근에 initd 또는 시스템 서버가 비정상 종료되는 변경사항을 적용했기 때문일 수 있습니다. 코드를 수정하면 문제가 해결됩니다.

SELinux 거부 또는 IO 실패

Zygote는 프로세스 경계 전반에서 파일 설명자 위생에 특히 주의합니다. 포크 시점에 파일 설명자가 있지만 허용 목록에 없는 경우 dup 시스템 호출을 /dev/null에 사용하여 캐시된 파일 설명자가 의도치 않게 새로 열린 파일에 액세스하는 것을 방지합니다.

Zygote에 리소스를 로드하려고 시도하는 프레임워크 변경사항을 적용하고 SELinux 거부 또는 IO 실패가 발생하는 경우 다음을 실행하세요.

  • 이름이 지정되지 않은 파일 설명자의 경우 Restat이 호출될 때 fds_to_ignore 벡터에 파일 설명자를 포함합니다.

  • 이름이 지정된 파일 설명자의 경우:

    1. WORKING_DIRECTORY/frameworks/base/core/jni/fd_utils.cpp를 수정합니다.
    2. 열린 파일의 허용 목록에 경로를 추가합니다.