Android启动初探

init进程

  • ServiceManager
  • zygote

Android系统基于Linux内核,而在Linux系统中,所有的进程都是init进程的子孙进程,都是直接或间接由init进程fork出来的。
Zygote是在系统启动的过程中,由init进程创建的。

zygoet

zygote本身是一个应用层的程序,和驱动,内核模块之类的没任何关系。
zygote是Android系统中创建Java世界的盘古,它创建了第一个Java虚拟机,同时它又是女娲,它成功繁殖了framework的核心system_server进程。

zygote主要包含两个模块:

  1. Socket服务端,主要用来接收启动新的Dalvik进程的命令。
  2. Framework共享类及共享资源。每一个进程都是一个Dalvik虚拟机。当zygote进程启动时,会装载一些共享当类和资源,其中共享类在proload-classes文件中被定义,共享资源在preload-resources中被定义。这些类和资源实际上就是SDK中定义的大部分类和资源。因为zygotez进程用于孵化出其他Dalvik进程,所以,这些类和资源装载后,新的Dalvik进程就不需要再装载这些类和资源类,只需要去装载APK自身包含的类和资源即可,这也就是所谓的共享。

zygote创建java世界的步骤:

  1. 创建AppRuntime对象,并调用它的start,此后的活动由AppRuntime来控制。
  2. 调用startVm创建java虚拟机,然后调用startReg来注册JNI函数
  3. 通过JNI调用com.android.internal.os.ZygoteInit类的main函数,从此进入了java的世界。
  4. 调用registerZygoteSocket。通过这个函数,它可以响应子孙后代的请求。同时zygote调用preloadClassed和preloadResources,为java世界添砖加瓦。
  5. zygote觉得自己压力太大,通过调用startSystemServer分裂类一个子进程system_server来为Java世界服务。
  6. zygote完成来初创java世界的工作,调用runSelectLoopMode后,沉沉睡去。之后,一直守护着,接到子孙后代的请求时,随时被唤醒。

ActivityManagerService

一个Activity所属进程的创建过程,是由ActivityManagerService发请求给zygote,然后由zygote通过fork子进程的方式创建。同时,zygote的本身设置信息会被子进程全部继承。

总结

  1. 系统启动init进程会创建zygote进程,zygote进程负责后续Android应用程序框架层的其他进程的创建和启动工作
  2. zygote进程会首先创建一个SystemServer进程,SystemServer进程负责启动系统的关键服务,如包管理服务PackageManagerService和应用程序组件管理服务ActivityManagerService
  3. 当我们需要启动一个Android程序时,ActivityManagerService会通过Socket进程间通信机制,通知Zygote进程为这个应用程序创建一个新的进程