/* * System server main initialization. * * The system server is responsible for becoming the Binder * context manager, supplying the root ServiceManager object * through which other services can be found. */ #define LOG_TAG "sysproc" #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace android; namespace android { /** * This class is used to kill this process when the runtime dies. */ class GrimReaper : public IBinder::DeathRecipient { public: GrimReaper() { } virtual void binderDied(const wp& who) { ALOGI("Grim Reaper killing system_server..."); kill(getpid(), SIGKILL); } }; } // namespace android extern "C" status_t system_init() { ALOGI("Entered system_init()"); sp proc(ProcessState::self()); sp sm = defaultServiceManager(); ALOGI("ServiceManager: %p\n", sm.get()); sp grim = new GrimReaper(); sm->asBinder()->linkToDeath(grim, grim.get(), 0); char propBuf[PROPERTY_VALUE_MAX]; property_get("system_init.startsensorservice", propBuf, "1"); if (strcmp(propBuf, "1") == 0) { // Start the sensor service SensorService::instantiate(); } // And now start the Android runtime. We have to do this bit // of nastiness because the Android runtime initialization requires // some of the core system services to already be started. // All other servers should just start the Android runtime at // the beginning of their processes's main(), before calling // the init function. ALOGI("System server: starting Android runtime.\n"); AndroidRuntime* runtime = AndroidRuntime::getRuntime(); ALOGI("System server: starting Android services.\n"); JNIEnv* env = runtime->getJNIEnv(); if (env == NULL) { return UNKNOWN_ERROR; } jclass clazz = env->FindClass("com/android/server/SystemServer"); if (clazz == NULL) { return UNKNOWN_ERROR; } jmethodID methodId = env->GetStaticMethodID(clazz, "init2", "()V"); if (methodId == NULL) { return UNKNOWN_ERROR; } ALOGI("System server: entering thread pool."); ProcessState::self()->startThreadPool(); // This is the main thread of the system server, and will never exit. env->CallStaticVoidMethod(clazz, methodId); return NO_ERROR; }