Zygote详解

来源:互联网 发布:erp软件介绍 编辑:程序博客网 时间:2024/05/16 19:24

                             

                            

frameworks/base/cmds/app_process/app_main.cpp

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); //设置进程名为 zygote    }    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;    }}



class AppRuntime : public AndroidRuntime{public:    AppRuntime()        : mParentDir(NULL)        , mClassName(NULL)        , mClass(NULL)        , mArgC(0)        , mArgV(NULL)    {       }       #if 0    // this appears to be unused    const char* getParentDir() const    {        return mParentDir;    }   #endif        const char* getClassName() const    {        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         * 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) {            ALOGE("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();        ALOGV("App process: starting thread pool.\n");        proc->startThreadPool();        AndroidRuntime* ar = AndroidRuntime::getRuntime();        ar->callMain(mClassName, mClass, mArgC, mArgV);        IPCThreadState::self()->stopProcess();    }    virtual void onZygoteInit()    {        sp<ProcessState> proc = ProcessState::self();        ALOGV("App process: starting thread pool.\n");        proc->startThreadPool();    }    virtual void onExit(int code)    {        if (mClassName == NULL) {            // if zygote            IPCThreadState::self()->stopProcess();        }        AndroidRuntime::onExit(code);    }    const char* mParentDir;    const char* mClassName;    jclass mClass;    int mArgC;    const char* const* mArgV;};

1) 设置进程名为zygote

2) 初始化dalvik虚拟机

3) 执行Java 类com.android.internal.os.ZygoteInit 

4) 注册zygote socket

5) preload java class和resource

6) fork system_server进程

7) 等待fork android进程


frameworks/base/core/java/com/android/internal/os/ZygoteInit.java

frameworks/base/core/java/android/content/res/Resources.java

frameworks/base/core/java/android/content/res/AssetManager.java

frameworks/base/core/jni/android_util_AssetManager.cpp

frameworks/base/libs/androidfw/AssetManager.cpp

preloadResources-->Resource::obtainTypedArray-->ZygoteInit::preloadDrawables-->Resource::obtainTypedArray-->ZygoteInit::preloadColorStateLists

ZygoteInit::preloadDrawables-->Resource::getDrawable-->Resource::;padDrawable-->AssetManager::openNonAsset-->openNOnAssetNative


0 0