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>
221bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian#include <SensorService.h>
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <android_runtime/AndroidRuntime.h>
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <signal.h>
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdlib.h>
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdio.h>
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <unistd.h>
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/time.h>
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <cutils/properties.h>
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectusing namespace android;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This class is used to kill this process when the runtime dies.
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass GrimReaper : public IBinder::DeathRecipient {
40d195e5ab401432ddac659791640a2927fc668699Elliott Hughespublic:
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GrimReaper() { }
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual void binderDied(const wp<IBinder>& who)
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LOGI("Grim Reaper killing system_server...");
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        kill(getpid(), SIGKILL);
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} // namespace android
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectextern "C" status_t system_init()
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOGI("Entered system_init()");
57d195e5ab401432ddac659791640a2927fc668699Elliott Hughes
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<ProcessState> proc(ProcessState::self());
59d195e5ab401432ddac659791640a2927fc668699Elliott Hughes
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<IServiceManager> sm = defaultServiceManager();
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOGI("ServiceManager: %p\n", sm.get());
62d195e5ab401432ddac659791640a2927fc668699Elliott Hughes
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<GrimReaper> grim = new GrimReaper();
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sm->asBinder()->linkToDeath(grim, grim.get(), 0);
65d195e5ab401432ddac659791640a2927fc668699Elliott Hughes
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    char propBuf[PROPERTY_VALUE_MAX];
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    property_get("system_init.startsurfaceflinger", propBuf, "1");
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (strcmp(propBuf, "1") == 0) {
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Start the SurfaceFlinger
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SurfaceFlinger::instantiate();
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
73c12b7ba81ec3b486f21394810d827258ba888ee4Mathias Agopian    property_get("system_init.startsensorservice", propBuf, "1");
74c12b7ba81ec3b486f21394810d827258ba888ee4Mathias Agopian    if (strcmp(propBuf, "1") == 0) {
75c12b7ba81ec3b486f21394810d827258ba888ee4Mathias Agopian        // Start the sensor service
76c12b7ba81ec3b486f21394810d827258ba888ee4Mathias Agopian        SensorService::instantiate();
77c12b7ba81ec3b486f21394810d827258ba888ee4Mathias Agopian    }
781bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // And now start the Android runtime.  We have to do this bit
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // of nastiness because the Android runtime initialization requires
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // some of the core system services to already be started.
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // All other servers should just start the Android runtime at
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // the beginning of their processes's main(), before calling
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // the init function.
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOGI("System server: starting Android runtime.\n");
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AndroidRuntime* runtime = AndroidRuntime::getRuntime();
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOGI("System server: starting Android services.\n");
89d195e5ab401432ddac659791640a2927fc668699Elliott Hughes    JNIEnv* env = runtime->getJNIEnv();
90d195e5ab401432ddac659791640a2927fc668699Elliott Hughes    if (env == NULL) {
91d195e5ab401432ddac659791640a2927fc668699Elliott Hughes        return UNKNOWN_ERROR;
92d195e5ab401432ddac659791640a2927fc668699Elliott Hughes    }
93d195e5ab401432ddac659791640a2927fc668699Elliott Hughes    jclass clazz = env->FindClass("com/android/server/SystemServer");
94d195e5ab401432ddac659791640a2927fc668699Elliott Hughes    if (clazz == NULL) {
95d195e5ab401432ddac659791640a2927fc668699Elliott Hughes        return UNKNOWN_ERROR;
96d195e5ab401432ddac659791640a2927fc668699Elliott Hughes    }
97d195e5ab401432ddac659791640a2927fc668699Elliott Hughes    jmethodID methodId = env->GetStaticMethodID(clazz, "init2", "()V");
98d195e5ab401432ddac659791640a2927fc668699Elliott Hughes    if (methodId == NULL) {
99d195e5ab401432ddac659791640a2927fc668699Elliott Hughes        return UNKNOWN_ERROR;
100d195e5ab401432ddac659791640a2927fc668699Elliott Hughes    }
101d195e5ab401432ddac659791640a2927fc668699Elliott Hughes    env->CallStaticVoidMethod(clazz, methodId);
102d195e5ab401432ddac659791640a2927fc668699Elliott Hughes
10310e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown    LOGI("System server: entering thread pool.\n");
10410e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown    ProcessState::self()->startThreadPool();
10510e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown    IPCThreadState::self()->joinThreadPool();
10610e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown    LOGI("System server: exiting thread pool.\n");
10710e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return NO_ERROR;
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
110