Zygote
zygote 는 java program 이다. 그래서 zygote 도 Dalvik Virtual Machine(DVM) 이 필요하다.
zygote 가 실행되는 과정에서는 아래 3가지가 memory 에 load 된다.
- DVM
- 미리 load해야 하는 classes
- 미리 load 해야 하는 resources
이렇게 생성된 zygote process 를 application 이 실행될 때마다 를 fork 해서 사용하게 된다.
fork 를 하면 "memory 의 구성정보", "공유 라이브러리에 대한 링크 정보"를 똑같이 가져오게 된다.
처음에는 메모리 주소만 복사해서 사용하다가 write 가 일어날 때 메모리정보를 copy 해 오게 된다.(Copy on Write)
이 상태에서 application 을 실행하게 되면,
- DVM
- 미리 load해야 하는 classes
- 미리 load 해야 하는 resources
- application
이 메모리에 올라가게 된다.
app_process
kernel 에서 java program 을 실행하기 위해서는 JNI 를 이용해야 한다. (참고: JNI 이용법)이 JNI 함수를 호출하는 녀석이 app_process 라는 녀석이다.
$root>/system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
app_process 는 내부에서
- AppRuntime :: AndroidRuntime
이라는 class 를 이용하는데, DVM을 초기화 하고 app 을 실행시켜주는 class 이다.
위와 같은 command 로 app_process 가 zygote 를 실행시키도록 하는데, app_process 내부에서 이 AppRuntime.start() 를 호출하고, 이 함수의 내부에서
- JNI_CreateJavaVM() 를 실행하고,
- JNI 함수를 등록(register) 하고,
- FindClass(), Get<*>ID, CallStaticVoidMethod() 를 호출해서
- 지정된 java class 를 실행 해 준다.
댓글 없음:
댓글 쓰기