android系统启动流程之zygote(Java)启动分析

Zygote的Java启动分析, 这边需要分清一个概念,zygote进程只有一个,没有区分zygote的java进程或native进程之类的,只是进程运行时调用的代码语言不同,所以涉及C++的native或java层。

Java层的代码分析如下,不算多,但是比较重要:

ZygoteInit.main():
  //预加载(非常重要):提前加载好一些app需要的资源,这样zygote fork时就不需要再重复初始化处理了,加快进程启动
  -->preload(bootTimingsTeraceLog); 
      -->预加载一些类,加载的类在/system/etc/preloaded-classes文件中的所有类。
      -->预加载的一些资源:com.android.internal.R.xx
  
  //这个就是Zygote socket,AMS通知zygote启动app就是通过此socket发消息
  -->zygoteServer = new ZygoteServer(isPrimaryZygote); 
      -->Zygote.createManagedSocketFromInitSocket(); //在构造函数中创建zygoteSocket.

     Runnable r = forkSystemServer() ; //启动SystemServer进程。
     caller = zygoteServer.runSelect(abiList);//进入一个死循环。接收AMS传过来的消息。

zygote总结:
native层做了3件事:

  • 初始化运行时环境, 创建 JVM,这就是android的虚拟机,AndroidRuntime ART
  • 注册JNI
  • 调用zygoteinit.main()方法

java层做了以下几件事:

  • 加快进程启动的预加载:加快进程启动
  • socket:让AMS通知我
  • 启动大儿子:SystemServer.
  • 循环等待。

因此,zygote进程的所有的目的是为了生孩子 ,通过zygote启动app,而app是java层代码,它要运行,需要JVM的支持,所以zygote需要先准备好Jvm提前准备好虚拟机,并且app在启动后,可能需要调用访问C++ Native代码,这时需要JNI的支持,所以JNI的注册也放到了zygote进程中,也提前准备好了。当条件满足之后,zygote创建app后,app就能顺利的执行了。并且zygote的preload预加载资源也是出于这些目的,为了让app能够快速的运行,提前预加载了app
所需要的一些java资源,包括系统资源,系统库,classes,RES等,因为这些资源app的java都有可能去调用的。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值