diff options
Diffstat (limited to 'cmds')
-rw-r--r-- | cmds/app_process/app_main.cpp | 61 | ||||
-rw-r--r-- | cmds/runtime/main_runtime.cpp | 39 | ||||
-rw-r--r-- | cmds/system_server/library/system_init.cpp | 28 |
3 files changed, 79 insertions, 49 deletions
diff --git a/cmds/app_process/app_main.cpp b/cmds/app_process/app_main.cpp index 0159edd..371268f 100644 --- a/cmds/app_process/app_main.cpp +++ b/cmds/app_process/app_main.cpp @@ -1,8 +1,8 @@ /* * Main entry of app process. - * + * * Starts the interpreted runtime, then starts up the application. - * + * */ #define LOG_TAG "appproc" @@ -25,23 +25,13 @@ void app_usage() "Usage: app_process [java-options] cmd-dir start-class-name [options]\n"); } -status_t app_init(const char* className, int argc, const char* const argv[]) -{ - LOGV("Entered app_init()!\n"); - - AndroidRuntime* jr = AndroidRuntime::getRuntime(); - jr->callMain(className, argc, argv); - - LOGV("Exiting app_init()!\n"); - return NO_ERROR; -} - class AppRuntime : public AndroidRuntime { public: AppRuntime() : mParentDir(NULL) , mClassName(NULL) + , mClass(NULL) , mArgC(0) , mArgV(NULL) { @@ -60,6 +50,35 @@ public: return mClassName; } + virtual void onVmCreated(JNIEnv* env) + { + if (mClassName == NULL) { + return; // Zygote. Nothing to do here. + } + + /* + * This is a little awkward because the JNI FindClass call uses the + * class loader associated with the native method we're executing in. + * If called in onStarted (from RuntimeInit.finishInit because we're + * launching "am", for example), FindClass would see that we're calling + * from a boot class' native method, and so wouldn't look for the class + * we're trying to look up in CLASSPATH. Unfortunately it needs to, + * because the "am" classes are not boot classes. + * + * The easiest fix is to call FindClass here, early on before we start + * executing boot class Java code and thereby deny ourselves access to + * non-boot classes. + */ + char* slashClassName = toSlashClassName(mClassName); + mClass = env->FindClass(slashClassName); + if (mClass == NULL) { + LOGE("ERROR: could not find class '%s'\n", mClassName); + } + free(slashClassName); + + mClass = reinterpret_cast<jclass>(env->NewGlobalRef(mClass)); + } + virtual void onStarted() { sp<ProcessState> proc = ProcessState::self(); @@ -67,8 +86,9 @@ public: LOGV("App process: starting thread pool.\n"); proc->startThreadPool(); } - - app_init(mClassName, mArgC, mArgV); + + AndroidRuntime* ar = AndroidRuntime::getRuntime(); + ar->callMain(mClassName, mClass, mArgC, mArgV); if (ProcessState::self()->supportsProcesses()) { IPCThreadState::self()->stopProcess(); @@ -81,7 +101,7 @@ public: if (proc->supportsProcesses()) { LOGV("App process: starting thread pool.\n"); proc->startThreadPool(); - } + } } virtual void onExit(int code) @@ -96,9 +116,10 @@ public: AndroidRuntime::onExit(code); } - + const char* mParentDir; const char* mClassName; + jclass mClass; int mArgC; const char* const* mArgV; }; @@ -120,7 +141,7 @@ int main(int argc, const char* const argv[]) // These are global variables in ProcessState.cpp mArgC = argc; mArgV = argv; - + mArgLen = 0; for (int i=0; i<argc; i++) { mArgLen += strlen(argv[i]) + 1; @@ -139,7 +160,7 @@ int main(int argc, const char* const argv[]) argv++; // Everything up to '--' or first non '-' arg goes to the vm - + int i = runtime.addVmArguments(argc, argv); // Next arg is parent directory @@ -151,7 +172,7 @@ int main(int argc, const char* const argv[]) if (i < argc) { arg = argv[i++]; if (0 == strcmp("--zygote", arg)) { - bool startSystemServer = (i < argc) ? + bool startSystemServer = (i < argc) ? strcmp(argv[i], "--start-system-server") == 0 : false; setArgv0(argv0, "zygote"); set_process_name("zygote"); diff --git a/cmds/runtime/main_runtime.cpp b/cmds/runtime/main_runtime.cpp index 83cb533..785e4cc 100644 --- a/cmds/runtime/main_runtime.cpp +++ b/cmds/runtime/main_runtime.cpp @@ -12,7 +12,7 @@ #include <binder/IPCThreadState.h> #include <binder/ProcessState.h> -#include <utils/Log.h> +#include <utils/Log.h> #include <cutils/zygote.h> #include <cutils/properties.h> @@ -41,7 +41,7 @@ #undef LOG_TAG #define LOG_TAG "runtime" -static const char* ZYGOTE_ARGV[] = { +static const char* ZYGOTE_ARGV[] = { "--setuid=1000", "--setgid=1000", "--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,3001,3002,3003", @@ -68,7 +68,6 @@ extern Condition gEventQCondition; namespace android { -extern status_t app_init(const char* className); extern void set_finish_init_func(void (*func)()); @@ -76,7 +75,7 @@ extern void set_finish_init_func(void (*func)()); * This class is used to kill this process (runtime) when the system_server dies. */ class GrimReaper : public IBinder::DeathRecipient { -public: +public: GrimReaper() { } virtual void binderDied(const wp<IBinder>& who) @@ -170,7 +169,7 @@ LOGI("run() sending FIRST_CALL_TRANSACTION to activity manager"); /* * Post-system-process initialization. - * + * * This function continues initialization after the system process * has been initialized. It needs to be separate because the system * initialization needs to care of starting the Android runtime if it is not @@ -210,17 +209,17 @@ static bool contextChecker( static void boot_init() { LOGI("Entered boot_init()!\n"); - + sp<ProcessState> proc(ProcessState::self()); LOGD("ProcessState: %p\n", proc.get()); proc->becomeContextManager(contextChecker, NULL); - + if (proc->supportsProcesses()) { LOGI("Binder driver opened. Multiprocess enabled.\n"); } else { LOGI("Binder driver not found. Processes not supported.\n"); } - + sp<BServiceManager> sm = new BServiceManager; proc->setContextObject(sm); } @@ -258,7 +257,7 @@ static void validateTime() int res; time_t min_time = 1167652800; // jan 1 2007, type 'date -ud "1/1 12:00" +%s' to get value for current year struct timespec ts; - + fd = open("/dev/alarm", O_RDWR); if(fd < 0) { LOGW("Unable to open alarm driver: %s\n", strerror(errno)); @@ -346,14 +345,14 @@ int main(int argc, char* const argv[]) int ic; int result = 1; pid_t systemPid; - + sp<ProcessState> proc; #ifndef HAVE_ANDROID_OS /* Set stdout/stderr to unbuffered for MinGW/MSYS. */ //setvbuf(stdout, NULL, _IONBF, 0); //setvbuf(stderr, NULL, _IONBF, 0); - + LOGI("commandline args:\n"); for (int i = 0; i < argc; i++) LOGI(" %2d: '%s'\n", i, argv[i]); @@ -455,7 +454,7 @@ int main(int argc, char* const argv[]) #if 0 // Hack to keep libc from beating the filesystem to death. It's - // hitting /etc/localtime frequently, + // hitting /etc/localtime frequently, // // This statement locks us into Pacific time. We could do better, // but there's not much point until we're sure that the library @@ -467,15 +466,15 @@ int main(int argc, char* const argv[]) /* track our progress through the boot sequence */ const int LOG_BOOT_PROGRESS_START = 3000; - LOG_EVENT_LONG(LOG_BOOT_PROGRESS_START, + LOG_EVENT_LONG(LOG_BOOT_PROGRESS_START, ns2ms(systemTime(SYSTEM_TIME_MONOTONIC))); validateTime(); proc = ProcessState::self(); - + boot_init(); - + /* If we are in multiprocess mode, have zygote spawn the system * server process and call system_init(). If we are running in * single process mode just call system_init() directly. @@ -488,8 +487,8 @@ int main(int argc, char* const argv[]) property_get("log.redirect-stdio", propBuf, ""); logStdio = (strcmp(propBuf, "true") == 0); - zygote_run_oneshot((int)(!logStdio), - sizeof(ZYGOTE_ARGV) / sizeof(ZYGOTE_ARGV[0]), + zygote_run_oneshot((int)(!logStdio), + sizeof(ZYGOTE_ARGV) / sizeof(ZYGOTE_ARGV[0]), ZYGOTE_ARGV); //start_process("/system/bin/mediaserver"); @@ -497,7 +496,7 @@ int main(int argc, char* const argv[]) } else { #ifndef HAVE_ANDROID_OS QuickRuntime* runt = new QuickRuntime(); - runt->start("com/android/server/SystemServer", + runt->start("com/android/server/SystemServer", false /* spontaneously fork system server from zygote */); #endif } @@ -506,11 +505,11 @@ int main(int argc, char* const argv[]) finish_system_init(proc); run(proc); - + bail: if (proc != NULL) { proc->setContextObject(NULL); } - + return 0; } diff --git a/cmds/system_server/library/system_init.cpp b/cmds/system_server/library/system_init.cpp index a29ba73..b615764 100644 --- a/cmds/system_server/library/system_init.cpp +++ b/cmds/system_server/library/system_init.cpp @@ -37,7 +37,7 @@ namespace android { * This class is used to kill this process when the runtime dies. */ class GrimReaper : public IBinder::DeathRecipient { -public: +public: GrimReaper() { } virtual void binderDied(const wp<IBinder>& who) @@ -54,15 +54,15 @@ public: extern "C" status_t system_init() { LOGI("Entered system_init()"); - + sp<ProcessState> proc(ProcessState::self()); - + sp<IServiceManager> sm = defaultServiceManager(); LOGI("ServiceManager: %p\n", sm.get()); - + sp<GrimReaper> grim = new GrimReaper(); sm->asBinder()->linkToDeath(grim, grim.get(), 0); - + char propBuf[PROPERTY_VALUE_MAX]; property_get("system_init.startsurfaceflinger", propBuf, "1"); if (strcmp(propBuf, "1") == 0) { @@ -97,12 +97,23 @@ extern "C" status_t system_init() // the beginning of their processes's main(), before calling // the init function. LOGI("System server: starting Android runtime.\n"); - AndroidRuntime* runtime = AndroidRuntime::getRuntime(); LOGI("System server: starting Android services.\n"); - runtime->callStatic("com/android/server/SystemServer", "init2"); - + JNIEnv* env = runtime->getJNIEnv(); + if (env == NULL) { + return UNKNOWN_ERROR; + } + jclass clazz = env->FindClass("com/android/server/SystemServer"); + if (clazz == NULL) { + return UNKNOWN_ERROR; + } + jmethodID methodId = env->GetStaticMethodID(clazz, "init2", "()V"); + if (methodId == NULL) { + return UNKNOWN_ERROR; + } + env->CallStaticVoidMethod(clazz, methodId); + // If running in our own process, just go into the thread // pool. Otherwise, call the initialization finished // func to let this process continue its initilization. @@ -114,4 +125,3 @@ extern "C" status_t system_init() } return NO_ERROR; } - |