Zygote는 동일한 애플리케이션 바이너리 인터페이스 (ABI)를 사용하는 모든 시스템 및 앱 프로세스의 루트 역할을 하는 Android 운영체제의 프로세스입니다.
Pixel 7 이상과 같은 최신 기기에는 64비트 Zygote 프로세스가 있습니다. 또한 기본 ABI의 WebView Zygote가 있습니다. 이는 WebView를 실행하는 프로세스에 관한 라이브러리와 리소스가 포함된 특수 Zygote입니다.
Zygote가 실행하는 작업은 다음과 같습니다.
init 데몬은 Android OS가 초기화될 때 Zygote 프로세스를 생성합니다. 일부 이중 아키텍처 시스템에서는 두 개의 Zygote 프로세스 (64비트 및 32비트)가 생성됩니다. 이 페이지에서는 단일 아키텍처 시스템만 다룹니다.
Zygote는 전문화되지 않은 앱 프로세스 (USAP)라는 프로세스를 즉시 스폰하거나 애플리케이션에 필요한 프로세스를 스폰할 때까지 기다릴 수 있습니다. 전자는 시스템 속성 또는 Android 디버그 브리지 명령어를 통해 사용 설정해야 합니다. 프로세스를 즉시 스폰하도록 Zygote를 구성하는 방법에 관한 자세한 내용은 전문화되지 않은 앱 프로세스 풀 사용 설정 을 참고하세요.
기기에서 USAP 풀이 사용 설정된 경우:
- 시스템 서버는 Unix 도메인 소켓을 사용하여 풀에서 사용 가능한 USAP에 연결합니다. 시스템 서버는 프로세스의 ID (PID), cgroup, 기타 정보를 변경하여 USAP가 애플리케이션 사용을 위해 사전 구성되도록 요청합니다.
- USAP의 사전 구성이 완료되면 시스템 서버에 PID를 포함하여 응답합니다.
- 애플리케이션이 이러한 USAP 중 하나를 차지하면 USAP는 더 이상 풀에 포함되지 않습니다. 풀의 USAP가 1개 이하가 되면 Zygote가 새 USAP로 풀을 보충합니다.
Zygote가 지연 평가를 사용하여 프로세스를 생성하는 경우:
- 시스템 서버는 앱에 프로세스가 필요하다는 명령을 수신합니다.
- 시스템 서버는 Unix 도메인 소켓을 사용하여 적절한 Zygote에 명령어를 전송합니다.
- Zygote는 프로세스를 포크하고 PID, cgroup, 기타 정보를 변경합니다.
- 프로세스가 완료되면 PID를 Zygote로 다시 전송하고 Zygote는 이를 시스템 서버로 다시 전달합니다.
USAP 풀 사용 설정
USAP 풀을 사용 설정하려면 다음 중 하나를 수행합니다.
/build/make/target/product/runtime_libart.mk
에서dalvik.vm.usap_pool_enabled
시스템 속성을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
벡터에 파일 설명자를 포함합니다.이름이 지정된 파일 설명자의 경우:
WORKING_DIRECTORY/frameworks/base/core/jni/fd_utils.cpp
를 수정합니다.- 열린 파일의 허용 목록에 경로를 추가합니다.