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
- Zygote详解
- zygote详解
- Zygote进程详解
- 安卓Zygote详解
- Zygote进程启动详解
- Android之Zygote启动详解
- Android之Zygote启动详解
- zygote
- Zygote
- ZYgote
- Zygote
- Zygote
- Android入门进阶教程(15)-进程创建zygote 详解
- Android启动过程详解(3)——Zygote
- Zygote Service
- Zygote 分析
- zygote-->system_server
- Zygote分析
- spring-ws中使用xmlbeans记录
- 苹果为精选App添加概括功能 部分开发者不认可
- 给Repeater控件里添加序号的5种方法
- 机器学习学习笔记(二)-- 梯度下降
- 创建iOS滑动菜单
- Zygote详解
- ofbiz启动eclipse,Problems报ERROR
- 感悟
- 毛玻璃
- org.apache.commons.beanutils.ConversionException: No value specified for 'Date'
- edit distance---计算2个单词之间的距离
- uva1030 - Image Is Everything 六视图方块 模拟
- vmlinux_32.lds.S
- iptables学习