19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * System server main initialization. 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The system server is responsible for becoming the Binder 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * context manager, supplying the root ServiceManager object 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * through which other services can be found. 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LOG_TAG "sysproc" 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 110795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/IPCThreadState.h> 120795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/ProcessState.h> 130795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/IServiceManager.h> 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/TextOutput.h> 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Log.h> 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <SurfaceFlinger.h> 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <AudioFlinger.h> 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <CameraService.h> 20a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent#include <AudioPolicyService.h> 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <MediaPlayerService.h> 221bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian#include <SensorService.h> 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <android_runtime/AndroidRuntime.h> 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <signal.h> 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdlib.h> 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdio.h> 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <unistd.h> 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/time.h> 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <cutils/properties.h> 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectusing namespace android; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This class is used to kill this process when the runtime dies. 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass GrimReaper : public IBinder::DeathRecipient { 40d195e5ab401432ddac659791640a2927fc668699Elliott Hughespublic: 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GrimReaper() { } 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void binderDied(const wp<IBinder>& who) 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGI("Grim Reaper killing system_server..."); 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project kill(getpid(), SIGKILL); 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} // namespace android 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectextern "C" status_t system_init() 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGI("Entered system_init()"); 57d195e5ab401432ddac659791640a2927fc668699Elliott Hughes 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<ProcessState> proc(ProcessState::self()); 59d195e5ab401432ddac659791640a2927fc668699Elliott Hughes 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IServiceManager> sm = defaultServiceManager(); 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGI("ServiceManager: %p\n", sm.get()); 62d195e5ab401432ddac659791640a2927fc668699Elliott Hughes 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<GrimReaper> grim = new GrimReaper(); 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sm->asBinder()->linkToDeath(grim, grim.get(), 0); 65d195e5ab401432ddac659791640a2927fc668699Elliott Hughes 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char propBuf[PROPERTY_VALUE_MAX]; 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project property_get("system_init.startsurfaceflinger", propBuf, "1"); 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strcmp(propBuf, "1") == 0) { 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Start the SurfaceFlinger 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SurfaceFlinger::instantiate(); 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 73c12b7ba81ec3b486f21394810d827258ba888ee4Mathias Agopian property_get("system_init.startsensorservice", propBuf, "1"); 74c12b7ba81ec3b486f21394810d827258ba888ee4Mathias Agopian if (strcmp(propBuf, "1") == 0) { 75c12b7ba81ec3b486f21394810d827258ba888ee4Mathias Agopian // Start the sensor service 76c12b7ba81ec3b486f21394810d827258ba888ee4Mathias Agopian SensorService::instantiate(); 77c12b7ba81ec3b486f21394810d827258ba888ee4Mathias Agopian } 781bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // And now start the Android runtime. We have to do this bit 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // of nastiness because the Android runtime initialization requires 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // some of the core system services to already be started. 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // All other servers should just start the Android runtime at 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the beginning of their processes's main(), before calling 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the init function. 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGI("System server: starting Android runtime.\n"); 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AndroidRuntime* runtime = AndroidRuntime::getRuntime(); 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGI("System server: starting Android services.\n"); 89d195e5ab401432ddac659791640a2927fc668699Elliott Hughes JNIEnv* env = runtime->getJNIEnv(); 90d195e5ab401432ddac659791640a2927fc668699Elliott Hughes if (env == NULL) { 91d195e5ab401432ddac659791640a2927fc668699Elliott Hughes return UNKNOWN_ERROR; 92d195e5ab401432ddac659791640a2927fc668699Elliott Hughes } 93d195e5ab401432ddac659791640a2927fc668699Elliott Hughes jclass clazz = env->FindClass("com/android/server/SystemServer"); 94d195e5ab401432ddac659791640a2927fc668699Elliott Hughes if (clazz == NULL) { 95d195e5ab401432ddac659791640a2927fc668699Elliott Hughes return UNKNOWN_ERROR; 96d195e5ab401432ddac659791640a2927fc668699Elliott Hughes } 97d195e5ab401432ddac659791640a2927fc668699Elliott Hughes jmethodID methodId = env->GetStaticMethodID(clazz, "init2", "()V"); 98d195e5ab401432ddac659791640a2927fc668699Elliott Hughes if (methodId == NULL) { 99d195e5ab401432ddac659791640a2927fc668699Elliott Hughes return UNKNOWN_ERROR; 100d195e5ab401432ddac659791640a2927fc668699Elliott Hughes } 101d195e5ab401432ddac659791640a2927fc668699Elliott Hughes env->CallStaticVoidMethod(clazz, methodId); 102d195e5ab401432ddac659791640a2927fc668699Elliott Hughes 10310e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown LOGI("System server: entering thread pool.\n"); 10410e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown ProcessState::self()->startThreadPool(); 10510e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown IPCThreadState::self()->joinThreadPool(); 10610e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown LOGI("System server: exiting thread pool.\n"); 10710e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 110