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 <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:
     37     GrimReaper() { }
     38 
     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 
     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