[컴][안드로이드] zygote 와 app_process

 

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() 를 호출하고, 이 함수의 내부에서

  1. JNI_CreateJavaVM() 를 실행하고,
  2. JNI 함수를 등록(register) 하고,
  3. FindClass(), Get<*>ID, CallStaticVoidMethod() 를 호출해서
  4. 지정된 java class 를 실행 해 준다.

 

Reference

  1. 인사이드 안드로이드

댓글 없음:

댓글 쓰기