Android研习社第二期技术分享的录播视频,已经放到B站上了,你们能够戳连接www.bilibili.com/video/av712…食用安全
这篇文章,一来是Android研习社
第二期技术分享的视频讲义,二来也对上一篇的Zygote源码分析进行了一个补充,水平有限,还请你们多多指教markdown
understand 5.1
多线程
如何把源码读起来app
阅读相关技术文章,总结重要的知识点,给本身提问题,去源码中找答案,有一个针对性socket
如何抓大放小ide
源码很庞大,涉及的细节和深度也比较多,要清楚本身当前,想搞懂的是什么问题工具
如何把握主要问题oop
没有定论,多阅读多体会,阅读相关技术文章和读源码穿插结合源码分析
主要问题分析:Zygote进程主要流程分析post
原本的想法是分析Zygote进程是如何被启动起来的,后来发现没啥东西,因此今天仍是分析下Zyogte主要作了些什么事情;目的呢,其实仍是让你们知道如何去读源码,正所谓授人以渔,不如授人以渔
请戳连接食用:www.bilibili.com/video/av712…
咱们先来大概梳理下Zygote进程的启动都经历了哪些流程
咱们来考虑下,这里为何要使用脚本,同时又要搞一套脚本解析的逻辑,来对zygote进行初始化呢?若是写死到逻辑里,是否能够呢?这里咱们先留一个问号,先接着往下分析
经过对脚本的解析,咱们执行app_process的二进制文件开启一个进程,并把这个进程名改成zygote,而后对该进程进行初始化操做,这里咱们还须要进一步分析,初始化过程当中,究竟作了什么事情;
最后,进入一个死循环,用socket通讯来接收子进程发送过来的消息,这里的socket是服务端,其余进程至关于客户端,因此代码中命名为ZygoteServer,就是这个意思
在这个死循环中,使用了多路IO复用的机制(select机制),这个也须要去进一步分析
进入死循环后,至关于当前进程一直处于运行状态,那么咱们也要接着去执行下面的逻辑呀,不能卡死在这里呀,因此咱们又fork出一个重要进程,SystemServer,由这个进程去开启一系列的系统服务,好比AMS,PMS,WMS,这些系统服务都是跑在一个进程下的(这个须要进一步确认),由这些系统服务提供一些公共的东西给其余进程来调度和使用
这么设计的缘由,咱们来简单的猜想下。若是没有这些系统服务,那咱们如何去调度系统资源呢?每一个进程都须要主动找系统层去要,那么系统层就要把这些逻辑,好比跨进程的消息处理,多线程的安全问题,都要写在复杂的逻辑中去。若是把这些逻辑抽离出来,一来,至关于收拢了相关功能的处理权限;二来,各个服务职责单一,也简化了代码,提高了代码的可阅读性和可维护性
另外,为何要单开一个进程来维护这些系统服务呢?就算我调用了runSelectLoop()进入了死循环,那其实还能够另开一个线程啊!
我以为这个就是跟总体的设计相关了,好比说,我们作一个项目,其中有一个模块是相对独立的,跟其余业务是没有什么关系的,好比音视频播放,或者Webview展现H5页面,相似的功能,那咱们其实通常是会单独开启一个子进程的。我以为系统层面的设计也有相似的考虑,若是zygote进程出了问题,那就从新初始化zygote就好了,若是在init进程出了问题,就针对init作单独的业务处理,保证他们互相的独立性,和业务上的解耦,互相都不会影响;若是是开启一个线程,就可能须要处理各类各样的问题
SystemServer
,能够说是Java世界的头号进程--Zygote
--诞生一来,fork出来的第一个子进程,这个fork出的进程,内部是如何设计的,如何维护这个系统服务的,这个也是咱们接下来的SystemServer
源码要分析的部分
咱们再来探讨下,Zygote
为何要设计一个跟子进程通讯的ZygoteServer
,上面咱们也提到了,它内部是维护了两个Socket对象,zygoteSocket
和uaspSocket
,那么咱们就要了解,Linux中,经典跨进程通讯的方案有哪些了。Socket是进程间通讯的一种方式,并且,是能够无视Native世界和Java世界的。也能够说,它是一种协定好的通讯方案。像咱们以前作的游戏辅助应用,咱们须要经过adb来开启一个native进程,这个进程又是须要跟App所在的进程进行通讯的,那么,在这种场景下,咱们就是使用了Socket通讯的方式,一个做为server端,一个做为client端,进行数据的传递。
Zygote进程,是由init进程经过执行exec
(须要确认)的系统调用开启的,它是沟通Java世界和native世界的桥梁,zygote进程最终是在Java世界中的,这里咱们的zygote跟它的子进程通讯,也须要一个一对多的数据通讯设计(一个Zyogte会fork出多个子进程)。
我这里还想谈一谈,为何要设计有一个母体,fork出子进程这种进程的运行方式。有一些资源是能够共享的,好比VM的运行环境,那么我想再开启一个子进程,又想同时对VM的运行环境进行复用,这么来看,fork出一个子进程,是一个比较好的方式;同时,32位的zygote和64位的zygote须要在不一样的VM环境下运行,因此才会有两个zygote--primeryZygote
和secondZygote
那么什么又是VM呢?简单来说,就是运行环境,这个运行环境不是硬件层的,而是软件层面的,好比像咱们开发App,也须要又SDK,NDK之类的工具包,才能进行开发。VM也是同理,提供一些共有的环境,供进程来使用,好比各自的私有目录,进程及进程组的权限,等等
原创不易,坚持更难。 若是你想继续看到我接下来的分享,请经过点赞的方式告诉我,你的鼓励是我继续创做的最大动力!
郑重声明
本文由Android研习社社群创做,版权©️归Android研习社
全部,侵权必究!