• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 <SensorService.h>
19 
20 #include <android_runtime/AndroidRuntime.h>
21 
22 #include <signal.h>
23 #include <stdlib.h>
24 #include <stdio.h>
25 #include <unistd.h>
26 #include <sys/time.h>
27 #include <cutils/properties.h>
28 
29 using namespace android;
30 
31 namespace android {
32 /**
33  * This class is used to kill this process when the runtime dies.
34  */
35 class GrimReaper : public IBinder::DeathRecipient {
36 public:
GrimReaper()37     GrimReaper() { }
38 
binderDied(const wp<IBinder> & who)39     virtual void binderDied(const wp<IBinder>& who)
40     {
41         ALOGI("Grim Reaper killing system_server...");
42         kill(getpid(), SIGKILL);
43     }
44 };
45 
46 } // namespace android
47 
48 
49 
system_init()50 extern "C" status_t system_init()
51 {
52     ALOGI("Entered system_init()");
53 
54     sp<ProcessState> proc(ProcessState::self());
55 
56     sp<IServiceManager> sm = defaultServiceManager();
57     ALOGI("ServiceManager: %p\n", sm.get());
58 
59     sp<GrimReaper> grim = new GrimReaper();
60     sm->asBinder()->linkToDeath(grim, grim.get(), 0);
61 
62     char propBuf[PROPERTY_VALUE_MAX];
63     property_get("system_init.startsurfaceflinger", propBuf, "1");
64     if (strcmp(propBuf, "1") == 0) {
65         // Start the SurfaceFlinger
66         SurfaceFlinger::instantiate();
67     }
68 
69     property_get("system_init.startsensorservice", propBuf, "1");
70     if (strcmp(propBuf, "1") == 0) {
71         // Start the sensor service
72         SensorService::instantiate();
73     }
74 
75     // And now start the Android runtime.  We have to do this bit
76     // of nastiness because the Android runtime initialization requires
77     // some of the core system services to already be started.
78     // All other servers should just start the Android runtime at
79     // the beginning of their processes's main(), before calling
80     // the init function.
81     ALOGI("System server: starting Android runtime.\n");
82     AndroidRuntime* runtime = AndroidRuntime::getRuntime();
83 
84     ALOGI("System server: starting Android services.\n");
85     JNIEnv* env = runtime->getJNIEnv();
86     if (env == NULL) {
87         return UNKNOWN_ERROR;
88     }
89     jclass clazz = env->FindClass("com/android/server/SystemServer");
90     if (clazz == NULL) {
91         return UNKNOWN_ERROR;
92     }
93     jmethodID methodId = env->GetStaticMethodID(clazz, "init2", "()V");
94     if (methodId == NULL) {
95         return UNKNOWN_ERROR;
96     }
97     env->CallStaticVoidMethod(clazz, methodId);
98 
99     ALOGI("System server: entering thread pool.\n");
100     ProcessState::self()->startThreadPool();
101     IPCThreadState::self()->joinThreadPool();
102     ALOGI("System server: exiting thread pool.\n");
103 
104     return NO_ERROR;
105 }
106