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