system_init.cpp revision a553c25b33c99b345cf1c8688f8df0ed8df14e5a
1/*
2 * System server main initialization.
3 *
4 * The system server is responsible for becoming the Binder
5 * context manager, supplying the root ServiceManager object
6 * through which other services can be found.
7 */
8
9#define LOG_TAG "sysproc"
10
11#include <binder/IPCThreadState.h>
12#include <binder/ProcessState.h>
13#include <binder/IServiceManager.h>
14#include <utils/TextOutput.h>
15#include <utils/Log.h>
16
17#include <SurfaceFlinger.h>
18#include <AudioFlinger.h>
19#include <CameraService.h>
20#include <AudioPolicyService.h>
21#include <MediaPlayerService.h>
22
23#include <android_runtime/AndroidRuntime.h>
24
25#include <signal.h>
26#include <stdlib.h>
27#include <stdio.h>
28#include <unistd.h>
29#include <sys/time.h>
30#include <cutils/properties.h>
31
32using namespace android;
33
34namespace android {
35/**
36 * This class is used to kill this process when the runtime dies.
37 */
38class GrimReaper : public IBinder::DeathRecipient {
39public:
40    GrimReaper() { }
41
42    virtual void binderDied(const wp<IBinder>& who)
43    {
44        LOGI("Grim Reaper killing system_server...");
45        kill(getpid(), SIGKILL);
46    }
47};
48
49} // namespace android
50
51
52
53extern "C" status_t system_init()
54{
55    LOGI("Entered system_init()");
56
57    sp<ProcessState> proc(ProcessState::self());
58
59    sp<IServiceManager> sm = defaultServiceManager();
60    LOGI("ServiceManager: %p\n", sm.get());
61
62    sp<GrimReaper> grim = new GrimReaper();
63    sm->asBinder()->linkToDeath(grim, grim.get(), 0);
64
65    char propBuf[PROPERTY_VALUE_MAX];
66    property_get("system_init.startsurfaceflinger", propBuf, "1");
67    if (strcmp(propBuf, "1") == 0) {
68        // Start the SurfaceFlinger
69        SurfaceFlinger::instantiate();
70    }
71
72    // On the simulator, audioflinger et al don't get started the
73    // same way as on the device, and we need to start them here
74    if (!proc->supportsProcesses()) {
75
76        // Start the AudioFlinger
77        AudioFlinger::instantiate();
78
79        // Start the media playback service
80        MediaPlayerService::instantiate();
81
82        // Start the camera service
83        CameraService::instantiate();
84
85        // Start the audio policy service
86        AudioPolicyService::instantiate();
87    }
88
89    // And now start the Android runtime.  We have to do this bit
90    // of nastiness because the Android runtime initialization requires
91    // some of the core system services to already be started.
92    // All other servers should just start the Android runtime at
93    // the beginning of their processes's main(), before calling
94    // the init function.
95    LOGI("System server: starting Android runtime.\n");
96
97    AndroidRuntime* runtime = AndroidRuntime::getRuntime();
98
99    LOGI("System server: starting Android services.\n");
100    runtime->callStatic("com/android/server/SystemServer", "init2");
101
102    // If running in our own process, just go into the thread
103    // pool.  Otherwise, call the initialization finished
104    // func to let this process continue its initilization.
105    if (proc->supportsProcesses()) {
106        LOGI("System server: entering thread pool.\n");
107        ProcessState::self()->startThreadPool();
108        IPCThreadState::self()->joinThreadPool();
109        LOGI("System server: exiting thread pool.\n");
110    }
111    return NO_ERROR;
112}
113
114