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>
181bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian#include <SensorService.h>
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <android_runtime/AndroidRuntime.h>
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <signal.h>
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdlib.h>
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdio.h>
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <unistd.h>
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/time.h>
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <cutils/properties.h>
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectusing namespace android;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This class is used to kill this process when the runtime dies.
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass GrimReaper : public IBinder::DeathRecipient {
36d195e5ab401432ddac659791640a2927fc668699Elliott Hughespublic:
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    GrimReaper() { }
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual void binderDied(const wp<IBinder>& who)
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
416215d3ff4b5dfa52a5d8b9a42e343051f31066a5Steve Block        ALOGI("Grim Reaper killing system_server...");
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        kill(getpid(), SIGKILL);
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} // namespace android
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectextern "C" status_t system_init()
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
526215d3ff4b5dfa52a5d8b9a42e343051f31066a5Steve Block    ALOGI("Entered system_init()");
53d195e5ab401432ddac659791640a2927fc668699Elliott Hughes
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<ProcessState> proc(ProcessState::self());
55d195e5ab401432ddac659791640a2927fc668699Elliott Hughes
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<IServiceManager> sm = defaultServiceManager();
576215d3ff4b5dfa52a5d8b9a42e343051f31066a5Steve Block    ALOGI("ServiceManager: %p\n", sm.get());
58d195e5ab401432ddac659791640a2927fc668699Elliott Hughes
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<GrimReaper> grim = new GrimReaper();
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sm->asBinder()->linkToDeath(grim, grim.get(), 0);
61d195e5ab401432ddac659791640a2927fc668699Elliott Hughes
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    char propBuf[PROPERTY_VALUE_MAX];
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    property_get("system_init.startsurfaceflinger", propBuf, "1");
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (strcmp(propBuf, "1") == 0) {
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Start the SurfaceFlinger
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SurfaceFlinger::instantiate();
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
69c12b7ba81ec3b486f21394810d827258ba888ee4Mathias Agopian    property_get("system_init.startsensorservice", propBuf, "1");
70c12b7ba81ec3b486f21394810d827258ba888ee4Mathias Agopian    if (strcmp(propBuf, "1") == 0) {
71c12b7ba81ec3b486f21394810d827258ba888ee4Mathias Agopian        // Start the sensor service
72c12b7ba81ec3b486f21394810d827258ba888ee4Mathias Agopian        SensorService::instantiate();
73c12b7ba81ec3b486f21394810d827258ba888ee4Mathias Agopian    }
741bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // And now start the Android runtime.  We have to do this bit
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // of nastiness because the Android runtime initialization requires
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // some of the core system services to already be started.
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // All other servers should just start the Android runtime at
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // the beginning of their processes's main(), before calling
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // the init function.
816215d3ff4b5dfa52a5d8b9a42e343051f31066a5Steve Block    ALOGI("System server: starting Android runtime.\n");
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AndroidRuntime* runtime = AndroidRuntime::getRuntime();
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
846215d3ff4b5dfa52a5d8b9a42e343051f31066a5Steve Block    ALOGI("System server: starting Android services.\n");
85d195e5ab401432ddac659791640a2927fc668699Elliott Hughes    JNIEnv* env = runtime->getJNIEnv();
86d195e5ab401432ddac659791640a2927fc668699Elliott Hughes    if (env == NULL) {
87d195e5ab401432ddac659791640a2927fc668699Elliott Hughes        return UNKNOWN_ERROR;
88d195e5ab401432ddac659791640a2927fc668699Elliott Hughes    }
89d195e5ab401432ddac659791640a2927fc668699Elliott Hughes    jclass clazz = env->FindClass("com/android/server/SystemServer");
90d195e5ab401432ddac659791640a2927fc668699Elliott Hughes    if (clazz == NULL) {
91d195e5ab401432ddac659791640a2927fc668699Elliott Hughes        return UNKNOWN_ERROR;
92d195e5ab401432ddac659791640a2927fc668699Elliott Hughes    }
93d195e5ab401432ddac659791640a2927fc668699Elliott Hughes    jmethodID methodId = env->GetStaticMethodID(clazz, "init2", "()V");
94d195e5ab401432ddac659791640a2927fc668699Elliott Hughes    if (methodId == NULL) {
95d195e5ab401432ddac659791640a2927fc668699Elliott Hughes        return UNKNOWN_ERROR;
96d195e5ab401432ddac659791640a2927fc668699Elliott Hughes    }
97d195e5ab401432ddac659791640a2927fc668699Elliott Hughes    env->CallStaticVoidMethod(clazz, methodId);
98d195e5ab401432ddac659791640a2927fc668699Elliott Hughes
996215d3ff4b5dfa52a5d8b9a42e343051f31066a5Steve Block    ALOGI("System server: entering thread pool.\n");
10010e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown    ProcessState::self()->startThreadPool();
10110e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown    IPCThreadState::self()->joinThreadPool();
1026215d3ff4b5dfa52a5d8b9a42e343051f31066a5Steve Block    ALOGI("System server: exiting thread pool.\n");
10310e89712863f5b91a2982dc1783fbdfe39c1485dJeff Brown
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return NO_ERROR;
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
106