system_init.cpp revision d195e5ab401432ddac659791640a2927fc668699
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 33using namespace android; 34 35namespace android { 36/** 37 * This class is used to kill this process when the runtime dies. 38 */ 39class GrimReaper : public IBinder::DeathRecipient { 40public: 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 54extern "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 AndroidRuntime* runtime = AndroidRuntime::getRuntime(); 101 102 LOGI("System server: starting Android services.\n"); 103 JNIEnv* env = runtime->getJNIEnv(); 104 if (env == NULL) { 105 return UNKNOWN_ERROR; 106 } 107 jclass clazz = env->FindClass("com/android/server/SystemServer"); 108 if (clazz == NULL) { 109 return UNKNOWN_ERROR; 110 } 111 jmethodID methodId = env->GetStaticMethodID(clazz, "init2", "()V"); 112 if (methodId == NULL) { 113 return UNKNOWN_ERROR; 114 } 115 env->CallStaticVoidMethod(clazz, methodId); 116 117 // If running in our own process, just go into the thread 118 // pool. Otherwise, call the initialization finished 119 // func to let this process continue its initilization. 120 if (proc->supportsProcesses()) { 121 LOGI("System server: entering thread pool.\n"); 122 ProcessState::self()->startThreadPool(); 123 IPCThreadState::self()->joinThreadPool(); 124 LOGI("System server: exiting thread pool.\n"); 125 } 126 return NO_ERROR; 127} 128