static void runtimeStart(AppRuntime& runtime, const char *classname, const Vector<String8>& options, bool zygote) { #if PLATFORM_SDK_VERSION == 21 runtime.start(classname, options); #elif PLATFORM_SDK_VERSION >= 23 runtime.start(classname, options, zygote); #else // try newer variant (5.1.1_r19 and later) first void (*ptr1)(AppRuntime&, const char*, const Vector<String8>&, bool); *(void **) (&ptr1) = dlsym(RTLD_DEFAULT, "_ZN7android14AndroidRuntime5startEPKcRKNS_6VectorINS_7String8EEEb"); if (ptr1 != NULL) { ptr1(runtime, classname, options, zygote); return; } // fall back to older variant void (*ptr2)(AppRuntime&, const char*, const Vector<String8>&); *(void **) (&ptr2) = dlsym(RTLD_DEFAULT, "_ZN7android14AndroidRuntime5startEPKcRKNS_6VectorINS_7String8EEE"); if (ptr2 != NULL) { ptr2(runtime, classname, options); return; } // should not happen LOG_ALWAYS_FATAL("app_process: could not locate AndroidRuntime::start() method."); #endif }
extern "C" void android_main(android_app* app) { using namespace nit; g_AndroidJNI->init(app->activity); AppRuntime* rt = new AppRuntime(); LOG(0, "++ AppRuntime %08x created\n", rt); app->userData = NULL; // NitRuntime does not use userdata, so my app can use freely // Let the screen turn on when debug start (must call this function prior to window init) ANativeActivity_setWindowFlags(app->activity, AWINDOW_FLAG_TURN_SCREEN_ON, 0); // Consider status bar position on layout ANativeActivity_setWindowFlags(app->activity, AWINDOW_FLAG_LAYOUT_IN_SCREEN | AWINDOW_FLAG_LAYOUT_INSET_DECOR, 0); // TODO: not working rt->linkAndroidApp(app); rt->prepare(new NitAndroidApp(), "nit-test.app.cfg"); LOG(0, ".. Entering android_main thread loop\n"); rt->run(); LOG(0, ".. Leaving android_main thread loop\n"); LOG(0, ".. Detaching jni env\n"); g_AndroidJNI->getJavaVM()->DetachCurrentThread(); delete rt; LOG(0, ".. AppRuntime %08x deleted\n", rt); LogManager::getSingleton().shutdown(); // HACK: set callbacks to be NULL // so that avoid deadlock problem at callback time following ANativeActivity_finish() memset(app->activity->callbacks, 0, sizeof(*app->activity->callbacks)); ANativeActivity_finish(app->activity); }
int main(int argc, char* const argv[]) { if (argc == 2 && strcmp(argv[1], "--xposedversion") == 0) { printf("Xposed version: " XPOSED_VERSION "\n"); return 0; } #if PLATFORM_SDK_VERSION >= 16 #ifdef __arm__ /* * b/7188322 - Temporarily revert to the compat memory layout * to avoid breaking third party apps. * * THIS WILL GO AWAY IN A FUTURE ANDROID RELEASE. * * http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=7dbaa466 * changes the kernel mapping from bottom up to top-down. * This breaks some programs which improperly embed * an out of date copy of Android's linker. */ char value[PROPERTY_VALUE_MAX]; property_get("ro.kernel.qemu", value, ""); bool is_qemu = (strcmp(value, "1") == 0); if ((getenv("NO_ADDR_COMPAT_LAYOUT_FIXUP") == NULL) && !is_qemu) { int current = personality(0xFFFFFFFF); if ((current & ADDR_COMPAT_LAYOUT) == 0) { personality(current | ADDR_COMPAT_LAYOUT); setenv("NO_ADDR_COMPAT_LAYOUT_FIXUP", "1", 1); execv("/system/bin/app_process", argv); return -1; } } unsetenv("NO_ADDR_COMPAT_LAYOUT_FIXUP"); #endif #endif initTypePointers(); // 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; } mArgLen--; AppRuntime runtime; const char* argv0 = argv[0]; // Process command line arguments // ignore argv[0] argc--; argv++; // Everything up to '--' or first non '-' arg goes to the vm int i = runtime.addVmArguments(argc, argv); // Parse runtime arguments. Stop at first unrecognized option. bool zygote = false; bool startSystemServer = false; bool application = false; const char* parentDir = NULL; const char* niceName = NULL; const char* className = NULL; while (i < argc) { const char* arg = argv[i++]; if (!parentDir) { parentDir = arg; } else if (strcmp(arg, "--zygote") == 0) { zygote = true; niceName = "zygote"; } else if (strcmp(arg, "--start-system-server") == 0) { startSystemServer = true; } else if (strcmp(arg, "--application") == 0) { application = true; } else if (strncmp(arg, "--nice-name=", 12) == 0) { niceName = arg + 12; } else { className = arg; break; } } if (niceName && *niceName) { setArgv0(argv0, niceName); set_process_name(niceName); } runtime.mParentDir = parentDir; xposedInfo(); xposedEnforceDalvik(); keepLoadingXposed = !isXposedDisabled() && !xposedShouldIgnoreCommand(className, argc, argv) && addXposedToClasspath(zygote); if (zygote) { runtime.start(keepLoadingXposed ? XPOSED_CLASS_DOTS : "com.android.internal.os.ZygoteInit", startSystemServer ? "start-system-server" : ""); } else if (className) { // Remainder of args get passed to startup class main() runtime.mClassName = className; runtime.mArgC = argc - i; runtime.mArgV = argv + i; runtime.start(keepLoadingXposed ? XPOSED_CLASS_DOTS : "com.android.internal.os.RuntimeInit", application ? "application" : "tool"); } else { fprintf(stderr, "Error: no class name or --zygote supplied.\n"); app_usage(); LOG_ALWAYS_FATAL("app_process: no class name or --zygote supplied."); return 10; } }
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; } mArgLen--; AppRuntime runtime; const char* argv0 = argv[0]; // Process command line arguments // ignore argv[0] argc--; argv++; // Everything up to '--' or first non '-' arg goes to the vm int i = runtime.addVmArguments(argc, argv); // Parse runtime arguments. Stop at first unrecognized option. bool zygote = false; bool startSystemServer = false; bool application = false; const char* parentDir = NULL; const char* niceName = NULL; const char* className = NULL; while (i < argc) { const char* arg = argv[i++]; if (!parentDir) { parentDir = arg; } else if (strcmp(arg, "--zygote") == 0) { zygote = true; niceName = "zygote"; } else if (strcmp(arg, "--start-system-server") == 0) { startSystemServer = true; } else if (strcmp(arg, "--application") == 0) { application = true; } else if (strncmp(arg, "--nice-name=", 12) == 0) { niceName = arg + 12; } else { className = arg; break; } } if (niceName && *niceName) { setArgv0(argv0, niceName); set_process_name(niceName); } runtime.mParentDir = parentDir; if (zygote) { runtime.start("com.android.internal.os.ZygoteInit", startSystemServer ? "start-system-server" : ""); } else if (className) { // Remainder of args get passed to startup class main() runtime.mClassName = className; runtime.mArgC = argc - i; runtime.mArgV = argv + i; runtime.start("com.android.internal.os.RuntimeInit", application ? "application" : "tool"); } else { fprintf(stderr, "Error: no class name or --zygote supplied.\n"); app_usage(); LOG_ALWAYS_FATAL("app_process: no class name or --zygote supplied."); return 10; } }