首先记住一点Android系统中首先是native的世界,再由native进入到JAVA的世界!
zygote本身是一个native可执行程序,有init进程根据init.rc里面配置项创建而来。zygote最初名字为app_process。zygote执行程序对应的源代码为App_main.cpp,源代码中通过调用AppRuntime(继承于AndroidRuntime)的start方法继续执行。
AppRuntime主要依次执行以下几个步骤:
(1)创建JAVA虚拟机startVm并设置虚拟机运行参数
(2) 注册JNI函数(JNI分为主动注册和被动注册)
(3)通过JNI调用,启动JAVA世界的ZygoteInit类的main方法,从此进入JAVA的世界
JAVA世界中的ZygoteInit类依次进行以下几个关键步骤:
(1)注册zygote跟其他进程通信使用的socket。需要注意的是zygote跟系统中其他程序的通信没有使用Binder,而是采用了基于AF_UNIX类型的Socket.
(2)预加载类和资源 preloadClasses(), preloadResources(). Android系统启动较慢其中一个重要原因就是预先加载了1000多个类。
(3)根据AppRuntime给ZygoteInit传递的启动system_server参数(一般都为true)采用fork的形式启动system_server进程。
(4)zygote执行runSelectLoopMode()进行循环等待模式,等待其他进程通过socket给她发消息
SystemServer进程作为Android系统重要服务的存储地(其实Android系统里面比较重要的工作都是由system server来完成的),由于太重要了,所以她的生命都是跟zygote捆绑在一起的,zygote发现system server挂了后,也会杀死自己。重启整个zygote和system server。
SystemServer几个关键流程:
(1)Zygote通过fork创建system server进程,对应源代码为dalvik_system_Zygote.c,创建之前设置相应的信号处理函数,用来监听system server的状态
(2)调用RuntimeInit.java中的zygoteInit方法->zygoteInitNavite,启动一个线程用于Binder通信
(3)调用JAVA世界中SystemServer.class的main方法,加载libandroid_servers.so->native世界的init1方法->system_init() 初始化binder通信相关->调用init2()方法,启动android.server.ServerThread,ServerThread初始化Entropy Service, PowerManagerService, BatteryService 添加到ServiceManager, 并初始化和启动看门狗Watchdog后再启动WindowManager服务和ActivityManager服务
zygote分裂图示(引用深入理解Android邓凡平老师的一张图):
网友评论