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