>

Zygote 프로세스를 추적합니다. ZygoteInit.java main () 함수로 점프합니다. 이 주 함수에서는 registerZygoteSocket () 함수를 호출합니다. 이 함수는 C ++ 레벨에서 청취 함수를 호출합니다. 구글이 ZygoInit.java 메인 함수로 뛰어 들기 전에 청취를 실행하기 위해 프로세스를 변경하면 궁금합니다. 더 합리적이고 빠릅니다. 권리? 이 디자인에 대한 이유가 있습니까?


  • 답변 # 1

    일반적으로 메모리 효율성을 위해 실제로 필요할 때까지 리소스 사용을 지연합니까? 여기에도 동일하게 적용됩니다. 접합 소켓은 청취를 시작하기 직전에 등록됩니다. 또한 zygote가 수용 할 준비가 될 때까지 어떤 명령도 소켓에 쓰여질 것으로 기대하지 않습니다.

  • 답변 # 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가 생성되고 모든 서비스가 생성 된 후에 만 ​​바인더가 모든 해당 서비스에 바인딩 될 수 있습니다.

  • 이전 jquery - codeigniter 및 ajax - 자바 스크립트의 조건문
  • 다음 nativescript iOS 빌드 실패