안드로이드/안드로이드 프레임워크

안드로이드 앱 프레임워크 학습(ActivityManager) 2

냥냥냥냥냥냥 2024. 3. 3. 00:01

안드로이드 앱 프레임워크 학습(ActivityManager) 1 (tistory.com)

 

안드로이드 앱 프레임워크 학습(ActivityManager) 1

이전에 StartActivity 호출 순서를 블로그로 써본적이 있었는데 (자세한 건 아래 참조 부탁드립니다) Android framework StartActivity 호출 순서 (tistory.com) Android framework StartActivity 호출 순서 안녕하세요, 개

nyaang.tistory.com

여기서는 앱이 실행 될 때, RemoteAnimation, Leash 부분에 대해서 좀 알아봤는데 

이번 글에서는 animation 쪽이 아닌 activity, process관리 부분을 한 번 알아보려고 합니다 

 

startProcessLocked sequence


ProcessList 관련 sequence

// ProcessList::startProcessLocked
            // Start the process.  It will either succeed and return a result containing
            // the PID of the new process, or else throw a RuntimeException.
            final String entryPoint = "android.app.ActivityThread";

            return startProcessLocked(hostingRecord, entryPoint, app, uid, gids,
                    runtimeFlags, zygotePolicyFlags, mountExternal, seInfo, requiredAbi,
                    instructionSet, invokeWith, startTime);

ProcessList에서 메서드를 불러주기 전에 entryPoint를 ActivityThread로 설정해서 넘겨줍니다

그렇기에 Zygote의 socket 통신을 통해 넘겨서 실행시켜주는 포인트는 ActivityThread의 main을 실행시켜주게 합니다

아래는 ZygoteProcess에서의 Socket 관련 정보들입니다

// ZygoteProcess.java
    public ZygoteProcess() {
        mZygoteSocketAddress =
                new LocalSocketAddress(Zygote.PRIMARY_SOCKET_NAME,
                                       LocalSocketAddress.Namespace.RESERVED);
        mZygoteSecondarySocketAddress =
                new LocalSocketAddress(Zygote.SECONDARY_SOCKET_NAME,
                                       LocalSocketAddress.Namespace.RESERVED);

        mUsapPoolSocketAddress =
                new LocalSocketAddress(Zygote.USAP_POOL_PRIMARY_SOCKET_NAME,
                                       LocalSocketAddress.Namespace.RESERVED);
        mUsapPoolSecondarySocketAddress =
                new LocalSocketAddress(Zygote.USAP_POOL_SECONDARY_SOCKET_NAME,
                                       LocalSocketAddress.Namespace.RESERVED);

        // This constructor is used to create the primary and secondary Zygotes, which can support
        // Unspecialized App Process Pools.
        mUsapPoolSupported = true;
    }

 

application이 onCreate 될 때 까지 sequence

ActivityManagerService에서 attachApplicationLocked를 호출해 줄 때, ProcessList에 process관련된 정보를 넘기고

ActivityManagerService내의 mPidSelfLocked에도 pid와 app 관련 해서 저장을 해둡니다

아래는, ActivityThread 관련해서 seq를 저장해두는 부분 코드입니다

// ActivityThread::main
        // Find the value for {@link #PROC_START_SEQ_IDENT} if provided on the command line.
        // It will be in the format "seq=114"
        long startSeq = 0;
        if (args != null) {
            for (int i = args.length - 1; i >= 0; --i) {
                if (args[i] != null && args[i].startsWith(PROC_START_SEQ_IDENT)) {
                    startSeq = Long.parseLong(
                            args[i].substring(PROC_START_SEQ_IDENT.length()));
                }
            }
        }

결국, 안드로이드에서는 Process를 실행할 떄 Zygote를 통한다는 것을 코드 부분을 통해 봤고

실행할 process 관련된 정보는 ActivityThread를 통해서 attach, bind를 통해서 그 정보들을 넘겨주고 주고 받은 후

그 과정이 끝나면 Application의 onCreate를 호출시켜주는 것을 보았습니다

 

감사합니다!