system_init.cpp revision c12b7ba81ec3b486f21394810d827258ba888ee4
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#include <SensorService.h>
23
24#include <android_runtime/AndroidRuntime.h>
25
26#include <signal.h>
27#include <stdlib.h>
28#include <stdio.h>
29#include <unistd.h>
30#include <sys/time.h>
31#include <cutils/properties.h>
32
33using namespace android;
34
35namespace android {
36/**
37 * This class is used to kill this process when the runtime dies.
38 */
39class GrimReaper : public IBinder::DeathRecipient {
40public:
41    GrimReaper() { }
42
43    virtual void binderDied(const wp<IBinder>& who)
44    {
45        LOGI("Grim Reaper killing system_server...");
46        kill(getpid(), SIGKILL);
47    }
48};
49
50} // namespace android
51
52
53
54extern "C" status_t system_init()
55{
56    LOGI("Entered system_init()");
57
58    sp<ProcessState> proc(ProcessState::self());
59
60    sp<IServiceManager> sm = defaultServiceManager();
61    LOGI("ServiceManager: %p\n", sm.get());
62
63    sp<GrimReaper> grim = new GrimReaper();
64    sm->asBinder()->linkToDeath(grim, grim.get(), 0);
65
66    char propBuf[PROPERTY_VALUE_MAX];
67    property_get("system_init.startsurfaceflinger", propBuf, "1");
68    if (strcmp(propBuf, "1") == 0) {
69        // Start the SurfaceFlinger
70        SurfaceFlinger::instantiate();
71    }
72
73    property_get("system_init.startsensorservice", propBuf, "1");
74    if (strcmp(propBuf, "1") == 0) {
75        // Start the sensor service
76        SensorService::instantiate();
77    }
78
79    // On the simulator, audioflinger et al don't get started the
80    // same way as on the device, and we need to start them here
81    if (!proc->supportsProcesses()) {
82
83        // Start the AudioFlinger
84        AudioFlinger::instantiate();
85
86        // Start the media playback service
87        MediaPlayerService::instantiate();
88
89        // Start the camera service
90        CameraService::instantiate();
91
92        // Start the audio policy service
93        AudioPolicyService::instantiate();
94    }
95
96    // And now start the Android runtime.  We have to do this bit
97    // of nastiness because the Android runtime initialization requires
98    // some of the core system services to already be started.
99    // All other servers should just start the Android runtime at
100    // the beginning of their processes's main(), before calling
101    // the init function.
102    LOGI("System server: starting Android runtime.\n");
103    AndroidRuntime* runtime = AndroidRuntime::getRuntime();
104
105    LOGI("System server: starting Android services.\n");
106    JNIEnv* env = runtime->getJNIEnv();
107    if (env == NULL) {
108        return UNKNOWN_ERROR;
109    }
110    jclass clazz = env->FindClass("com/android/server/SystemServer");
111    if (clazz == NULL) {
112        return UNKNOWN_ERROR;
113    }
114    jmethodID methodId = env->GetStaticMethodID(clazz, "init2", "()V");
115    if (methodId == NULL) {
116        return UNKNOWN_ERROR;
117    }
118    env->CallStaticVoidMethod(clazz, methodId);
119
120    // If running in our own process, just go into the thread
121    // pool.  Otherwise, call the initialization finished
122    // func to let this process continue its initilization.
123    if (proc->supportsProcesses()) {
124        LOGI("System server: entering thread pool.\n");
125        ProcessState::self()->startThreadPool();
126        IPCThreadState::self()->joinThreadPool();
127        LOGI("System server: exiting thread pool.\n");
128    }
129    return NO_ERROR;
130}
131