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