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

更多相关文章

  1. 一款霸榜 GitHub 的开源 Linux 资源监视器!
  2. android全屏问题(隐藏虚拟按键)
  3. android常用的工具类——将图形变成圆形
  4. binder机制底层驱动浅析
  5. 学习Android(一)
  6. android sqlite用法
  7. [置顶] Android(安卓)NDK中结合汇编分析Crash行为
  8. Android(安卓)Binder机制(3) 本地服务注册过程
  9. Android聊天软件开发(基于网易云IM即时通讯)——环境搭建(一)

随机推荐

  1. Android(安卓)Duplicate files copied in
  2. 在Android中查看和管理sqlite数据库
  3. Android启动画面
  4. Android入门教程 MediaPlayer教程【使用
  5. Android中Hook Instrumentation 的实现
  6. UnityAndroid(2) Android加载Unity
  7. android:inputType 属性及其支持的取值
  8. Android的移动存储解决方案之SharedPrefe
  9. 在Android中使用Html5
  10. Android中广播注册与接收流程