中国教育热线_中国教育资讯门户网站
您当前的位置 : 中国教育热线  >  时尚
Android 10.0系统启动之Zygote进程(四)-「Android取经之路」
2020-03-26 07:05:38 来源:互联网 阅读:-

感谢您的阅读与点赞!欢迎点击右上角关注:「大猫玩程序」

微信公众号:大猫玩程序

前几节已经讲完了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应用一个虚拟机?

  1. android的VM(vm==Virtual Machine )也是类似JRE的东西,当然,各方面都截然不同,不过有一个作用都是一样的,为app提供了运行环境
  2. android为每个程序提供一个vm,可以使每个app都运行在独立的运行环境,使稳定性提高。
  3. vm的设计可以有更好的兼容性。android apk都被编译成字节码(bytecode),在运行的时候,vm是先将字节码编译真正可执行的代码,否则不同硬件设备的兼容是很大的麻烦。
  4. android(非ROOT)没有windows下键盘钩子之类的东西,每个程序一个虚拟机,各个程序之间也不可以随意访问内存,所以此类木马病毒几乎没有。

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进程共做了如下几件事:

  1. 解析init.zygote64_32.rc,创建AppRuntime并调用其start方法,启动Zygote进程。
  2. 创建JavaVM并为JavaVM注册JNI.
  3. 通过JNI调用ZygoteInit的main函数进入Zygote的Java框架层。
  4. 通过ZygoteServer创建服务端Socket,预加载类和资源,并通过runSelectLoop函数等待如ActivityManagerService等的请求。
  5. 启动SystemServer进程。

推荐阅读:旗龙

频道推荐
  • 为什么奢侈品都来源于意大利?
    为什么奢侈品都来源于意大利?

    随着生活方式的不断进化,平常的衣、食、住、行等需求已不再满足于人们日渐增长的精神需求了,许多人开始考究起日用起居,穿着配戴。譬如出行所用的包,手腕上佩带的精致腕...

    2020-08-03
  • 泰勒的王冠,玛丽的钻石吊坠,约瑟芬的冠冕,女神与珠宝总相宜
    泰勒的王冠,玛丽的钻石吊坠,约瑟芬的冠冕,女

    每当要说起美丽的珠宝,总觉得这世上有太多太多美丽奢华的珠宝我们还不知道。不过自古美人与珠宝总是分不开的,美人有倾城颜,珠宝有惊世色,而不少让世人深印在脑中的珠宝...

    2020-08-03
  • 新品鉴赏 | 2020珠宝流行文艺复古风?看宝格丽7月演绎,美炸了
    新品鉴赏 | 2020珠宝流行文艺复古风?看

    在2020还没开始之际,珠宝行家们就已经透露今年珠宝的流行大风是往哪里刮,文创、创新趣味性等都在流行趋势中榜上有名,当时看到的时候不少时尚达人都会一头雾水,毕竟...

    2020-08-03
  • 正式官宣!朱正廷成为金伯利钻石品牌大使
    正式官宣!朱正廷成为金伯利钻石品牌大使

    恭喜,朱正廷成为金伯利钻石品牌大使!朱正廷正式成为金伯利钻石品牌大使朱正廷,舞台上唱跳俱佳的实力担当,舞台外风格随心的炫目闪耀真我少年。勇于突破、坚定自我,与金...

    2020-08-03
  • 韩国女生真会穿,看她们的“街拍穿搭”,三招教你穿出时髦范
    韩国女生真会穿,看她们的“街拍穿搭”,三招教

    街拍穿搭,正在以全新的传播方式,让潮流在我们身边流转。街拍穿搭给我们带来的不只是穿搭灵感,更多的是眼界的开阔,让多元化的时尚,成为自己的美学态度。今天,微咖就给...

    2020-08-03
  • 王晓晨不走寻常路,T恤鱼尾牛仔裙俏皮可爱,毛毛鞋走哪都居家
    王晓晨不走寻常路,T恤鱼尾牛仔裙俏皮可爱,毛

    T恤在夏季的穿搭频率比较地高,因为它既简约又实用,宽松版的T恤,穿上去格外舒适和轻便,受到了很多人的喜欢。就是普通的女孩穿上去之后也会很好看,所以这基本上是一年...

    2020-08-03
  • 夏季舒适色系穿搭,让你从头到脚都温柔
    夏季舒适色系穿搭,让你从头到脚都温柔

    今天给大家再来一组专属于夏季的舒适色系穿搭,让你从内到外都散发着温柔气质。喜欢这一种温婉大方气质的小仙女,快看过来吧!第一套:这套当中上衣搭配是一件淡黄色的短袖...

    2020-08-03
  • 邓紫棋、沈月等小个子明星,夏天都是这么穿的
    邓紫棋、沈月等小个子明星,夏天都是这么穿的

    小个子女生在日常穿搭中,经常会遇到不知道该选什么衣服,以及看中了喜欢的衣服,却不知道该如何搭配的烦恼,一起来看看这些身材娇小的小个子明星,她们是怎么穿搭的吧!火...

    2020-08-03