前几节已经讲完了Android10.0的Init启动过程以及Zygote的架构。 Android 10.0系统源码取经之路——启动篇Android系统架构浅析-「Android取经之路」Android是怎么启动的-「Android取经之路」 Android 10.0系统启动之init进程(一)-「Android取经之路」Android 10.0系统启动之init进程(二)-「Android取经之路」Android 10.0系统启动之init进程(三)-「Android取经之路」 Android 10.0系统启动之init进程(四)-「Android取经之路」Android 10.0系统启动之Zygote进程(一)-「Android取经之路」 Android 10.0系统启动之Zygote进程(二)-「Android取经之路」 Android 10.0系统启动之Zygote进程(三)-「Android取经之路」 这一节开始针对于Zygote的一些问题进行分析。 Zygote架构 5.问题分析5.1 为什么SystemServer和Zygote之间通信要采用Socket进程间通信我们常用的是binder,为什么这里要采用socket呢。 主要是为了解决fork的问题: 1.UNIX上C++程序设计守则3:多线程程序里不准使用fork 2.Binder通讯是需要多线程操作的,代理对象对Binder的调用是在Binder线程,需要再通过Handler调用主线程来操作。 比如AMS与应用进程通讯,AMS的本地代理IApplicationThread通过调用ScheduleLaunchActivity,调用到的应用进程ApplicationThread的ScheduleLaunchActivity是在Binder线程, 需要再把参数封装为一个ActivityClientRecord,sendMessage发送给H类(主线程Handler,ActivityThread内部类) 主要原因:害怕父进程binder线程有锁,然后子进程的主线程一直在等其子线程(从父进程拷贝过来的子进程)的资源,但是其实父进程的子进程并没有被拷贝过来,造成死锁, 所以fork不允许存在多线程。而非常巧的是Binder通讯偏偏就是多线程,所以干脆父进程(Zgote)这个时候就不使用binder线程 5.2为什么一个java应用一个虚拟机?
5.3 什么是Zygote资源预加载预加载是指在zygote进程启动的时候就加载,这样系统只在zygote执行一次加载操作,所有APP用到该资源不需要再重新加载,减少资源加载时间,加快了应用启动速度,一般情况下,系统中App共享的资源会被列为预加载资源。 zygote fork子进程时,根据fork的copy-on-write机制可知,有些类如果不做改变,甚至都不用复制,子进程可以和父进程共享这部分数据,从而省去不少内存的占用。 5.4 Zygote为什么要预加载应用程序都从Zygote孵化出来,应用程序都会继承Zygote的所有内容。 如果在Zygote启动的时候加载这些类和资源,这些孵化的应用程序就继承Zygote的类和资源,这样启动引用程序的时候就不需要加载类和资源了,启动的速度就会快很多。 开机的次数不多,但是启动应用程序的次数非常多。 5.5 Zygote 预加载的原理是什么?zygote进程启动后将资源读取出来,保存到Resources一个全局静态变量中,下次读取系统资源的时候优先从静态变量中查找。 6.总结至此,Zygote启动流程结束,Zygote进程共做了如下几件事:
推荐阅读:襄阳都市网 (正文已结束) (编辑:喜羊羊) 免责声明及提醒:此文内容为本网所转载企业宣传资讯,该相关信息仅为宣传及传递更多信息之目的,不代表本网站观点,文章真实性请浏览者慎重核实!任何投资加盟均有风险,提醒广大民众投资需谨慎! |