안드로이드 앱 프레임워크 학습(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::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;
}
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를 호출시켜주는 것을 보았습니다
감사합니다!
'안드로이드 > 안드로이드 프레임워크' 카테고리의 다른 글
안드로이드 인풋 프레임워크 학습(InputManager) 1 (0) | 2024.11.07 |
---|---|
안드로이드 앱 프레임워크 학습(ActivityManager) 3 (0) | 2024.03.10 |
안드로이드 앱 프레임워크 학습(ActivityManager) 1 (0) | 2024.03.01 |
안드로이드 앱 프레임워크 학습(WindowManager) 3 (0) | 2024.03.01 |
안드로이드 앱 프레임워크 학습(WindowManager) 2 (0) | 2024.02.29 |