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