• 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 <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 
33 using namespace android;
34 
35 namespace android {
36 /**
37  * This class is used to kill this process when the runtime dies.
38  */
39 class GrimReaper : public IBinder::DeathRecipient {
40 public:
GrimReaper()41     GrimReaper() { }
42 
binderDied(const wp<IBinder> & who)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 
system_init()54 extern "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     // Start the sensor service
74     SensorService::instantiate();
75 
76     // On the simulator, audioflinger et al don't get started the
77     // same way as on the device, and we need to start them here
78     if (!proc->supportsProcesses()) {
79 
80         // Start the AudioFlinger
81         AudioFlinger::instantiate();
82 
83         // Start the media playback service
84         MediaPlayerService::instantiate();
85 
86         // Start the camera service
87         CameraService::instantiate();
88 
89         // Start the audio policy service
90         AudioPolicyService::instantiate();
91     }
92 
93     // And now start the Android runtime.  We have to do this bit
94     // of nastiness because the Android runtime initialization requires
95     // some of the core system services to already be started.
96     // All other servers should just start the Android runtime at
97     // the beginning of their processes's main(), before calling
98     // the init function.
99     LOGI("System server: starting Android runtime.\n");
100 
101     AndroidRuntime* runtime = AndroidRuntime::getRuntime();
102 
103     LOGI("System server: starting Android services.\n");
104     runtime->callStatic("com/android/server/SystemServer", "init2");
105 
106     // If running in our own process, just go into the thread
107     // pool.  Otherwise, call the initialization finished
108     // func to let this process continue its initilization.
109     if (proc->supportsProcesses()) {
110         LOGI("System server: entering thread pool.\n");
111         ProcessState::self()->startThreadPool();
112         IPCThreadState::self()->joinThreadPool();
113         LOGI("System server: exiting thread pool.\n");
114     }
115     return NO_ERROR;
116 }
117 
118