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> 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <android_runtime/AndroidRuntime.h> 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <signal.h> 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdlib.h> 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdio.h> 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <unistd.h> 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/time.h> 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <cutils/properties.h> 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectusing namespace android; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This class is used to kill this process when the runtime dies. 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass GrimReaper : public IBinder::DeathRecipient { 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GrimReaper() { } 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void binderDied(const wp<IBinder>& who) 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGI("Grim Reaper killing system_server..."); 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project kill(getpid(), SIGKILL); 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} // namespace android 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectextern "C" status_t system_init() 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGI("Entered system_init()"); 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<ProcessState> proc(ProcessState::self()); 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IServiceManager> sm = defaultServiceManager(); 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGI("ServiceManager: %p\n", sm.get()); 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<GrimReaper> grim = new GrimReaper(); 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sm->asBinder()->linkToDeath(grim, grim.get(), 0); 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char propBuf[PROPERTY_VALUE_MAX]; 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project property_get("system_init.startsurfaceflinger", propBuf, "1"); 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strcmp(propBuf, "1") == 0) { 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Start the SurfaceFlinger 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SurfaceFlinger::instantiate(); 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // On the simulator, audioflinger et al don't get started the 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // same way as on the device, and we need to start them here 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!proc->supportsProcesses()) { 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Start the AudioFlinger 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioFlinger::instantiate(); 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Start the media playback service 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MediaPlayerService::instantiate(); 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Start the camera service 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CameraService::instantiate(); 84a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 85a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent // Start the audio policy service 86a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent AudioPolicyService::instantiate(); 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // And now start the Android runtime. We have to do this bit 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // of nastiness because the Android runtime initialization requires 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // some of the core system services to already be started. 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // All other servers should just start the Android runtime at 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the beginning of their processes's main(), before calling 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the init function. 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGI("System server: starting Android runtime.\n"); 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AndroidRuntime* runtime = AndroidRuntime::getRuntime(); 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGI("System server: starting Android services.\n"); 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project runtime->callStatic("com/android/server/SystemServer", "init2"); 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If running in our own process, just go into the thread 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // pool. Otherwise, call the initialization finished 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // func to let this process continue its initilization. 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (proc->supportsProcesses()) { 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGI("System server: entering thread pool.\n"); 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ProcessState::self()->startThreadPool(); 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IPCThreadState::self()->joinThreadPool(); 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGI("System server: exiting thread pool.\n"); 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 114