zygote服务启动
来源:互联网 发布:微信秀是什么软件 编辑:程序博客网 时间:2024/06/07 04:44
zygote是android启动及其运行时非常重要的一个服务进程,下面是它在启动过程中函数执行路线,比较简略,后面将上图。
zygote, app_process, main()
--> runtime[AppRuntime<AndroidRuntime>].start("com.android.internal.os.ZygoteInit", startSystemServer)
// startSystemServer = true 表示将会在后面启动systemserver进程
--> startVm(&mJavaVM, &env) // 新建一个虚拟机
--> startReg(env) // 注册frameworks/base/core/jni/下的所有jni接口
--> 虚拟机启动之前构造java形式的参数数组,strArray[0] = “com.android.internal.os.ZygoteInit,strArry[1] = “true”
--> 根据上面包名提供的路径找到这个包
--> 在这个包中找到静态main函数,然后调用它,这个时候就成功调用了java程序,也是在前面新建的虚拟机中运行的。
// frameworks/base/core/java/com/android/internal/os/ZygoteInit.java 中的main函数
--> startSystemServer()
--> Zygote.forkSystemServer()// 父进程直接返回true,子进程执行handleSystemServerProcess()
/********** 子进程-转下 ****************/
/********** 父进程 ****************/
--> return true;
--> runSelectLoopMode() // zygote进程进入死循环,通过socket接收消息,fork虚拟机
while (true) {
...
while(true){
...
try {
fdArray = fds.toArray(fdArray);
index = selectReadable(fdArray);
}
...
if (index < 0) {
throw new RuntimeException("Error in select()");
} else if (index == 0) {
ZygoteConnection newPeer = acceptCommandPeer();
// Waits for and accepts a single command connection
peers.add(newPeer);
fds.add(newPeer.getFileDesciptor());
} else {
boolean done;
done = peers.get(index).runOnce();
/* 调用 ZygoteConnecttion的runOnce函数,在runOnce函数中调用
Zygote.forkAndSpecialize(parsedArgs.uid, parsedArgs.gid, parsedArgs.gids,
parsedArgs.debugFlags, rlimits),Forks a new VM instance。
然后,在runOnce函数中通过 if (pid == 0) {
// in child
handleChildProc(parsedArgs, descriptors, newStderr);
在子进程中处理相关的操作,而父进程继续在 runSelectLoopMode的while(true)循环中select等待。*/
if (done) {
peers.remove(index);
fds.remove(index);
}
}
}
}
/********** 父进程 ****************/
/********** 子进程-接上 ****************/
--> handleSystemServerProcess()
--> RuntimeInit.zygoteInit(parsedArgs.remainingArgs)
// "--nice-name=system_server com.android.server.SystemServer"
--> invokeStaticMain(startClass, startArgs)
--> ZygoteInit.MethodAndArgsCaller(m, argv) // 找到com.android.server.SystemServer包的main函数执行
// frameworks/base/services/java/com/android/server/SystemServer.java
--> System.loadLibrary("android_servers")
--> init1(args)
// jni调用,最终调用到c++部分:frameworks\base\cmds\system_server\library\System_init.cpp
// 启动一些本地服务:AudioFlinger 、MediaPlayerService 、CameraService 、AudioPolicyService 等
--> init2() // init2函数开启一个ServerThread线程, SystemServer.java
--> start()
--> run()
// 启动系统中java services,之后执行xxx.systemReady()通知系统已经准备就绪
// 接下来就启动home进程了
--> (ActivityManagerNative.getDefault()).systemReady(callback)
--> resumeTopActivityLocked()
--> startHomeActivityLocked()
--> startActivityLocked() // 启动home
--> Looper.loop() // msg queue
启动图:
图原型来自:http://blog.csdn.net/maxleng/article/details/5508372
- zygote服务启动
- Android init启动和Zygote服务
- 启动zygote
- Android 初始化ini.rc中启动zygote服务
- Android本地服务的启动 - zygote服务及Dalvik环境启动
- Android本地服务的启动 - zygote服务及Dalvik环境启动
- Android本地服务的启动 - zygote服务及Dalvik环境启动
- Android研究-Android的init启动到launcher启动-主要分析zygote服务
- Android研究-Android的init启动到launcher启动-主要分析zygote服务
- Android研究-Android的init启动到launcher启动-主要分析zygote服务
- zygote启动分析
- zygote system_server的启动
- Android zygote启动流程
- Zygote启动主要函数
- Zygote启动分析
- Zygote进程的启动
- Zygote 启动过程
- Zygote的启动过程
- VNC Server 安装与配置
- InvalidateRect()、UpdateWindow()、RedrawWindow()区别
- 程序猿装B指南
- JTable操作
- 如何防止apache显示文件列表
- zygote服务启动
- How_To_Build_The_First_SYS
- libtool的使用 linux下的so、o、lo、a、la文件有什么区别
- Java栈与堆
- 对语言演进的理解
- 软件设计原则----LisKov替换原则(LSP)
- 在BlackBerry上使用OpenGL绘图(汇总)
- 分析Android 根文件系统启动过程(init守护进程分析)
- 数据库迁移之pipe+imp/exp