[2009-10-12 이백]

 

소스 분석중 system_servermediaserver 의 코드는 동일한 동작을 보이고 있습니다.
그래서 저번 스터디시에 혼동이 있었는데요. 훓어 보니 동일한 동작이 아니였습니다.

타겟의 ps 로 보면, mediaserver 가 system_server 보다 빨리 시작되었다는 것을 알 수 있는데, 저희는 zygote 를 따라 가다 보니 system_server 를 먼저 분석하게 되었지요.
우선 이번주 스터디를 위해서 각각의 역할을 클리어 하게 정의 되어야 할 것 같다.

프로세스의 상태를 보면 아래와 같습니다.

 

root     1     0     280   192   c00bd90c 0000c8dc S /init
 :
root     1783  1     69252 19788 c00bd90c afe0c584 S zygote
media    1784  1     16232 3620  ffffffff afe0c45c S /system/bin/mediaserver
system   1807  1783  185064 26652 ffffffff afe0c45c S system_server

 

mediaserver 는 init 에 의해서 생성 되었고,
system_server 는 zygote 에 의해서 생성 되었다.

코드를 분석하면, 먼저 system_server 를 저번 주에 보았습니다.
자세히 보면, system_server 는 SurfaceFlinger::instantiate(); 만 실행하도록 되어 있습니다.

proc->supportsProcesses() 는 true 를 리턴하도록 되어 있기 때문이지요.

이로서 저번 시간에 왜 동일한 동작을 할까??? 에 대한 부분은 해결 되었습니다.
proc->supportsProcesses() 를 false 로 되는 환경이 있나 봅니다.

 

 

// frameworks/base/cmds/system_server/library/system_init.cpp
 :
    if (strcmp(propBuf, "1") == 0) {
        // Start the SurfaceFlinger
        SurfaceFlinger::instantiate();
    }

    // On the simulator, audioflinger et al don't get started the
    // same way as on the device, and we need to start them here
    if (!proc->supportsProcesses()) {

        // Start the AudioFlinger
        AudioFlinger::instantiate();

        // Start the media playback service
        MediaPlayerService::instantiate();

        // Start the camera service
        CameraService::instantiate();
    }
 :
 
실제로 mediaserver 에서 아래 서비스 provider 들이 시작 될 것입니다.

AudioFlinger::instantiate();
MediaPlayerService::instantiate();
CameraService::instantiate();

 

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


int main(int argc, char** argv)
{
    sp<ProcessState> proc(ProcessState::self());
    sp<IServiceManager> sm = defaultServiceManager();
    LOGI("ServiceManager: %p", sm.get());
    AudioFlinger::instantiate();
    MediaPlayerService::instantiate();
    CameraService::instantiate();
    ProcessState::self()->startThreadPool();
    IPCThreadState::self()->joinThreadPool();
}