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> 181bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian#include <SensorService.h> 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <android_runtime/AndroidRuntime.h> 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <signal.h> 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdlib.h> 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdio.h> 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <unistd.h> 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/time.h> 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <cutils/properties.h> 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectusing namespace android; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This class is used to kill this process when the runtime dies. 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass GrimReaper : public IBinder::DeathRecipient { 36d195e5ab401432ddac659791640a2927fc668699Elliott Hughespublic: 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GrimReaper() { } 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void binderDied(const wp<IBinder>& who) 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 416215d3ff4b5dfa52a5d8b9a42e343051f31066a5Steve Block ALOGI("Grim Reaper killing system_server..."); 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project kill(getpid(), SIGKILL); 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} // namespace android 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectextern "C" status_t system_init() 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 526215d3ff4b5dfa52a5d8b9a42e343051f31066a5Steve Block ALOGI("Entered system_init()"); 53d195e5ab401432ddac659791640a2927fc668699Elliott Hughes 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<ProcessState> proc(ProcessState::self()); 55d195e5ab401432ddac659791640a2927fc668699Elliott Hughes 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IServiceManager> sm = defaultServiceManager(); 576215d3ff4b5dfa52a5d8b9a42e343051f31066a5Steve Block ALOGI("ServiceManager: %p\n", sm.get()); 58d195e5ab401432ddac659791640a2927fc668699Elliott Hughes 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<GrimReaper> grim = new GrimReaper(); 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sm->asBinder()->linkToDeath(grim, grim.get(), 0); 61d195e5ab401432ddac659791640a2927fc668699Elliott Hughes 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char propBuf[PROPERTY_VALUE_MAX]; 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project property_get("system_init.startsurfaceflinger", propBuf, "1"); 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strcmp(propBuf, "1") == 0) { 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Start the SurfaceFlinger 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SurfaceFlinger::instantiate(); 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 69c12b7ba81ec3b486f21394810d827258ba888ee4Mathias Agopian property_get("system_init.startsensorservice", propBuf, "1"); 70c12b7ba81ec3b486f21394810d827258ba888ee4Mathias Agopian if (strcmp(propBuf, "1") == 0) { 71c12b7ba81ec3b486f21394810d827258ba888ee4Mathias Agopian // Start the sensor service 72c12b7ba81ec3b486f21394810d827258ba888ee4Mathias Agopian SensorService::instantiate(); 73c12b7ba81ec3b486f21394810d827258ba888ee4Mathias Agopian } 741bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // And now start the Android runtime. We have to do this bit 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // of nastiness because the Android runtime initialization requires 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // some of the core system services to already be started. 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // All other servers should just start the Android runtime at 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the beginning of their processes's main(), before calling 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the init function. 816215d3ff4b5dfa52a5d8b9a42e343051f31066a5Steve Block ALOGI("System server: starting Android runtime.\n"); 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AndroidRuntime* runtime = AndroidRuntime::getRuntime(); 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 846215d3ff4b5dfa52a5d8b9a42e343051f31066a5Steve Block ALOGI("System server: starting Android services.\n"); 85d195e5ab401432ddac659791640a2927fc668699Elliott Hughes JNIEnv* env = runtime->getJNIEnv(); 86d195e5ab401432ddac659791640a2927fc668699Elliott Hughes if (env == NULL) { 87d195e5ab401432ddac659791640a2927fc668699Elliott Hughes return UNKNOWN_ERROR; 88d195e5ab401432ddac659791640a2927fc668699Elliott Hughes } 89d195e5ab401432ddac659791640a2927fc668699Elliott Hughes jclass clazz = env->FindClass("com/android/server/SystemServer"); 90d195e5ab401432ddac659791640a2927fc668699Elliott Hughes if (clazz == NULL) { 91d195e5ab401432ddac659791640a2927fc668699Elliott Hughes return UNKNOWN_ERROR; 92d195e5ab401432ddac659791640a2927fc668699Elliott Hughes } 93d195e5ab401432ddac659791640a2927fc668699Elliott Hughes jmethodID methodId = env->GetStaticMethodID(clazz, "init2", "()V"); 94d195e5ab401432ddac659791640a2927fc668699Elliott Hughes if (methodId == NULL) { 95d195e5ab401432ddac659791640a2927fc668699Elliott Hughes return UNKNOWN_ERROR; 96d195e5ab401432ddac659791640a2927fc668699Elliott Hughes } 97d195e5ab401432ddac659791640a2927fc668699Elliott Hughes env->CallStaticVoidMethod(clazz, methodId); 98d195e5ab401432ddac659791640a2927fc668699Elliott Hughes 996215d3ff4b5dfa52a5d8b9a42e343051f31066a5Steve Block ALOGI("System server: entering thread pool.\n"); 10010e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown ProcessState::self()->startThreadPool(); 10110e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown IPCThreadState::self()->joinThreadPool(); 1026215d3ff4b5dfa52a5d8b9a42e343051f31066a5Steve Block ALOGI("System server: exiting thread pool.\n"); 10310e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 106