Home | History | Annotate | Download | only in library
      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:
     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 
     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