App_process用来启动Android runtime。
源代码位于:frameworks/base/cmds/app_process。
Zygote、SystemServer其实都是app_process 进程。
app_process的命令行参数分为四部分:
- 传给虚拟机,所有直到“--” 或者不是“-”开头的参数
- 父目录,在虚拟机参数后的第一个参数,目前没有使用
- 内部参数,一到多个
- --zygote 使用孵化器模式启动
- --start-system-server 启动系统服务
- --application 单独模式启动
- --nice-name 进程名称
- 其他参数
- 孵化器模式,传给孵化器main方法
- 非孵化器模式,类名以及其main方法的参数
Runtime的启动由AndroidRuntime类(C++类,libandroid_runtime库中)实现,该类定义实现在:
- frameworks/base/include/android_runtime/AndroidRuntime.h
- frameworks/base/core/jni/AndroidRuntime.cpp
AndroidRuntime初始化虚拟机完成后,会进入下面两个类之一的main方法:
- com.android.internal.os.ZygoteInit
- com.android.internal.os.RuntimeInit
源代码位于:frameworks/base/core/java/com/android/internal/os。
流程- main中初始化并启动AppRuntime(继承AndroidRuntime)
- AppRuntime::AppRuntime()
- AndroidRuntime::AndroidRuntime()
- SkGraphics::Init()【UI系统初始化】
- gCurRuntime = this【用于java层回调虚拟方法】
- AndroidRuntime::AndroidRuntime()
- runtime.addVmArguments()【记录传给虚拟机的参数】
- 【分析内部参数】
- if (!className.isEmpty())
- runtime.setClassNameAndArgs()【AppRuntime记录类名和参数】
- else
- 【参数通过AndroidRuntime start方法传递】
- if (niceName && *niceName)
- runtime.setArgv0()【直接修改命令行块,假设命令行是连续内存块】
- set_process_name()【libcutils】
- prctl(PR_SET_NAME)
- runtime.start()【类名是ZygoteInit或者RuntimeInit】
- AndroidRuntime启动java运行时(start)
- AndroidRuntime::startVm()
- JNI_CreateJavaVM()
- AppRuntime::onVmCreated()【虚拟方法,AppRuntime实现】
- env->FindClass【找到目标类】
- AndroidRuntime::startReg()
- androidSetCreateThreadFunc()【设置启动线程函数javaCreateThreadEtc,该函数会在新线程attach java vm】
- register_jni_procs()【注册rumtime所有jni函数】
- 【将className(ZygoteInit或者RuntimeInit)作为main方法的第一个参数】
- env->FindClass()【查找类ZygoteInit或者RuntimeInit】
- env->GetStaticMethodID()【获取main方法】
- env->CallStaticVoidMethod()【调用main方法】
- mJavaVM->DetachCurrentThread()
- mJavaVM->DestroyJavaVM()【销毁java vm】
- RuntimeInit的主方法(main)
上面调用ZygoteInit或者RuntimeInit的main方法,这里只看RuntimeInit,ZygoteInit在zygote小节中分析。推算下来main参数为:
RuntimeInit application|tool
- RuntimeInit.main()
- if 【如果argv[1] == “application”】
- redirectLogStreams()【重定向java系统输出流】
- System.setOut(new AndroidPrintStream)
- System.setErr(new AndroidPrintStream)
- redirectLogStreams()【重定向java系统输出流】
- else
- tool模式,不需要日志
- commonInit()
- Thread.setDefaultUncaughtExceptionHandler(new UncaughtHandler())
- TimezoneGetter.setInstance()
- LogManager.getLogManager().reset()
- new AndroidConfig【增加AndroidHandler的日志系统】
- Logger.getLogger("").addHandler(new AndroidHandler())
- nativeFinishInit()
- com_android_internal_os_RuntimeInit_nativeFinishInit()
- gCurRuntime->onStarted()【调用到AppRuntime虚方法】
- ProcessState::startThreadPool()
- AndroidRuntime::callMain()【调用目标类的main方法】
- env->CallStaticVoidMethod()
- IPCThreadState::stopProcess()
- gCurRuntime->onStarted()【调用到AppRuntime虚方法】
- com_android_internal_os_RuntimeInit_nativeFinishInit()
- if 【如果argv[1] == “application”】
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)