start services
init.rc 에 등록 된 순서에 따라 서비스 실행
/system/core/rootdir/init.rc
- zygete 를 실행
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
…
- 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 로 작성 된 서비스를 생성, 등록 시킨다.
정리