Zygote 프로세스를 추적합니다. ZygoteInit.java main () 함수로 점프합니다. 이 주 함수에서는 registerZygoteSocket () 함수를 호출합니다. 이 함수는 C ++ 레벨에서 청취 함수를 호출합니다. 구글이 ZygoInit.java 메인 함수로 뛰어 들기 전에 청취를 실행하기 위해 프로세스를 변경하면 궁금합니다. 더 합리적이고 빠릅니다. 권리? 이 디자인에 대한 이유가 있습니까?
-
답변 # 1
-
답변 # 2
app_main.cpp의 main () 함수를 확인하면 대략 이해할 수 있습니다.
if (zygote) { // Zygote process init runtime.start("com.android.internal.os.ZygoteInit", args, zygote); } else if (className) { // Application Init runtime.start("com.android.internal.os.RuntimeInit", args, zygote); } else { ... }
Zygote 프로세스 만이 ZygoteInit로 실행되고 다른 응용 프로그램 프로세스 (독립형, 비 zygote, zygote에서 분기되지 않은 응용 프로그램)는 다른 경로 RuntimeInit로 실행됩니다. 그러나 Java init을 실행하기 전에 모든 C 코드가 일반적입니다. 기본적으로 VM 생성, gc 힙 할당 및 아트 사전로드와 같은 Android 런타임 작업을 수행합니다.
분명히 안드로이드는 RuntimeInit이 ZygoteSocket을 등록하는 것을 원하지 않습니다.또 다른 증거는 응용 프로그램 프로세스가 접합자에서 분기 된 후입니다.
private Runnable handleChildProc(ZygoteArguments parsedArgs, FileDescriptor[] descriptors, FileDescriptor pipeFd, boolean isZygote) { /** * By the time we get here, the native code has closed the two actual Zygote * socket connections, and substituted /dev/null in their place. The LocalSocket * objects still need to be closed properly. */ closeSocket(); }
현재 모든 소켓을 먼저 닫습니다. 안드로이드 앱이 일반 앱의 경우 소켓이 아닌 IPC 용 바인더를 사용하기 때문에 소켓을 사용할 필요가 없으므로이 작업을 수행하는 이유는 간단해야합니다. 그러나 왜 Zygote 프로세스를 위해 소켓이 필요한가? System Server 프로세스 (Zygote 프로세스 중 하나)가 시작되기 전에 서비스가 전혀 없습니다. System Server가 생성되고 모든 서비스가 생성 된 후에 만 바인더가 모든 해당 서비스에 바인딩 될 수 있습니다.
- OpenCv의 폴더에서 여러 이미지 읽기 (python)
- 파이썬 셀레늄 모든 "href"속성 가져 오기
- git commit - 자식 - 로컬 커밋 된 파일에 대한 변경을 취소하는 방법
- html - 자바 스크립트 - 클릭 후 변경 버튼 텍스트 변경
- JSP에 대한 클래스를 컴파일 할 수 없습니다
- javascript - 현재 URL에서 특정 div 만 새로 고침/새로 고침
- jquery - JavaScript로 현재 세션 값을 얻으시겠습니까?
- javascript - swiperjs에서 정지, 재생 버튼 추가
- vue.js - axios를 사용하여 서버에 이미지를 업로드하는 방법
- python - 문자열에서 특정 문자 제거
일반적으로 메모리 효율성을 위해 실제로 필요할 때까지 리소스 사용을 지연합니까? 여기에도 동일하게 적용됩니다. 접합 소켓은 청취를 시작하기 직전에 등록됩니다. 또한 zygote가 수용 할 준비가 될 때까지 어떤 명령도 소켓에 쓰여질 것으로 기대하지 않습니다.