자두맛쭝이 2011. 4. 15. 10:51

init.rc 에 등록 된 순서에 따라 서비스 실행

/system/core/rootdir/init.rc

   

  1. zygete 를 실행

service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server

   

  1. mediaserver 실행

service media /system/bin/mediaserver

   

ps 결과

   

   

  • zygote - PID : 1925, PPID : 1 ( init 프로세스에서 생성 )
  • mediaserver - PID : 1926, PPID : 1 ( init 프로세스에서 생성 )
  • system_server - PID : 1941, PPID : 1925 ( zygote 프로세스에서 생성 )
    • 참고 : zygote - ZygoteInit ( 4. startSystemServer )

   

mediaserver

   

/frameworks/base/media/mediaserver/main_mediaserver.cpp

AudioFlinger, MediaPlayerService, CameraService, AudioPolicyService 실행

   

SystemServer

   

startSystemServer 함수에 의해 systemserver 호출

   

/frameworks/base/core/java/com/android/internal/os/ZygoteInit.java

   

"com.android.server.SystemServer" 시스템 서버 클래스를 이용하여

SystemServer.java 실행

   

/frameworks/base/services/java/com/android/server/SystemServer.java

   

init1 의 실제 함수인 system_init() 함수 호출 (/frameworks/base/cmds/system_server/library/system_init.cpp)

   

(/frameworks/base/services/jni/com_android_server_SysetmServer.cpp)

extern "C" status_t system_init()

{

sp<ProcessState> proc(ProcessState::self());

sp<IServiceManager> sm = defaultServiceManager();

// SurfaceFlinger() 실행

property_get("system_init.startsurfaceflinger", propBuf, "1");

if (strcmp(propBuf, "1") == 0) {

SurfaceFlinger::instantiate();

}

// init2() 함수 호출

AndroidRuntime* runtime = AndroidRuntime::getRuntime();

runtime->callStatic("com/android/server/SystemServer", "init2");

...

}

   

( /frameworks/base/services/java/com/android/server/SystemServer.java)

public static final void init2() {

Thread thr = new ServerThread();

thr.setName("android.server.ServerThread");

// ServerThread 의 run() 메소드 호출

thr.start();

}

   

init2 함수에서 thread 를 이용하여 AlarmManagerService, SensorService, ActivityManager 등

대부분의 java 로 작성 된 서비스를 생성, 등록 시킨다.

   

정리