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
32 using namespace android;
33
34 namespace android {
35 /**
36 * This class is used to kill this process when the runtime dies.
37 */
38 class GrimReaper : public IBinder::DeathRecipient {
39 public:
GrimReaper()40 GrimReaper() { }
41
binderDied(const wp<IBinder> & who)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
system_init()53 extern "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