您当前的位置:首页 > 电脑百科 > 程序开发 > 移动端 > Android

大厂Android开发高频面试问题:说说你对Zygote的理解

时间:2021-08-12 11:08:07  来源:  作者:Android开发之家

Zygote可以说是Android开发面试很高频的一道问题,但总有小伙伴在回答这道问题总不能让面试满意, 在这你就要搞清楚面试问你对Zygote的理解时,他最想听到的和其实想问的应该是哪些?下面我们通过以下几点来剖析这道问题!

  • 了解Zygote的作用
  • 熟悉Zygote的启动流程
  • 深刻理解Zygote的工作原理

下面来我们来深入剖析

一、 Zygote的作用

Zygote的作用分为两点:

  • 启动SystemServer
  • 孵化应用进程

关于这个问题答出了这两点那就是OK了。可能大部分小伙伴可能能答出第二点,第一点就不是很清楚。SystemServer也是Zygote启动的,因为SystemServer需要用到Zygote准备好的系统资源包括:

大厂Android开发高频面试问题:说说你对Zygote的理解

 

直接从Zygote继承过来就不需要重新加载过来,那么对性能将会有很大的提升。

二、Zygote的启动流程

2.1 启动三段式

在说Zygote启动流程之前,先明确一个概念:启动三段式,这个可以理解为Android中进程启动的常用套路,分为三步骤:

大厂Android开发高频面试问题:说说你对Zygote的理解

 

这里要了解LOOP循环是什么,其实LOOP作用是不停地接受消息,处理消息,消息的来源可以是Soket、MessageQueue、Binder驱动发过来的消息,但无论消息从哪里来,它整个流程都是去接受消息,处理消息。这个启动三段式,它不光是Zygote进程是这样的,只要是有独立进程的,比如说系统服务进程,自己的应用进程都是如此。

2.2 Zygote进程是怎么启动的?

Zygote进程的启动取决于init进程,init进程是它是linux启动之后用户空间的第一个进程,下面看一下启动流程

  1. linux启动init进程
  2. init进程启动之后加载init.rc配置文件
大厂Android开发高频面试问题:说说你对Zygote的理解

 

3.启动配置文件中定义的系统服务,其中Zygote服务就是定义在配置中的

大厂Android开发高频面试问题:说说你对Zygote的理解

 

4.同时启动的服务除了Zygote之外还有一些别的系统服务也是会启动的,比如说ServiceManager进程,它是通过fork+execve系统调用启动的

大厂Android开发高频面试问题:说说你对Zygote的理解

 

2.2.1加载Zygote的启动配置

在init.rc 文件中会import /init.${ro.zygote}.rc,init.zygoteXX,XX指的是32或者64,对我们没差我们直接看init.zygote32.rc即可。配置文件比较长,这里做了截取保留了Zygot相关的部分。

service zygote /system/bin/App_process -Xzygote /system/bin --zygote --start-system-server    
class main    
socket zygote stream 660 root system    
onrestart write /sys/android_power/request_state wake    
onrestart write /sys/power/state on    
onrestart restart audIOServer    
writepid /dev/cpuset/foreground/tasks
  • service zygote:是进程名称,
  • /system/bin/app_process:可执行程序的路径,用于init进程fork,execve调用
  • -Xzygote /system/bin --zygote --start-system-server 为它的参数

2.2.2启动进程

说完了启动配置呢,这里来聊一下启动进程,启动进程有两种方式:

第一种:fork+handle

pid_t pid = fork();
if (pid == 0){
  // child process
} else {
  // parent process
}

第二种:fork+execve

pid_t pid = fork();
if (pid == 0) {
  // child process
  execve(path, argv, env);
} else {
  // parent process
}

两者看起来差不多,首先首先都会调用fork函数创建子进程,这个函数比较奇特会返回两次,子进程返回一次,父进程返回一次。区别在于:

  • 子进程一次,返回的pid是0 但是父进程返回的pid是子进程的pid,因此可以根据判断pid来区分目前是子进程还是父进程
  • 对于handle默认的情况,子进程会继承父进程的所有资源,但当通过execve去加载二进制程序时,那父进程的资源则会被清除

2.2.3信号处理-SIGCHLD

当父进程fork子进程后,父进程需要关注这个信号。当子进程挂了,父进程就会收到SIGCHLD,这时候父进程就可以做一些处理。例如Zygote进程如果挂了,那父进程init进程就会收到信号将Zygote进程重启。

大厂Android开发高频面试问题:说说你对Zygote的理解

 

三、Zygote进程启动原理

主要分为两部分Native层处理和JAVA层处理,Zygote进程启动之后,它执行了execve系统调用,它执行的是用C++写的二进制的可执行程序里的main函数作为入口,然后在Java层运行!

先来看一下Native层的处理流程

大厂Android开发高频面试问题:说说你对Zygote的理解

 

在app_main.cpp文件,AndroidRuntime.cpp文件。我们可以找到几个主要函数名

int main(int argc,char *argv[]){
   JavaVM *jvm;
   JNIEnv *env;
   JNI_CreateJavaVM(&jvm,(void**)&env,&vm_args); //创建Java虚拟机
   jclass clazz = env->FindClass("ZygoteInit"); //找到叫ZygoteInit的Java类
   jmethodID method = env->GetStaticMethodID(clazz,"Main","[Ljava/lang/String;)V"); //找到ZygoteInit类中的Main的静态函数
   env->CallStaticVoidMethod(clazz,method,args); //调用main函数
   jvm->DestroyJavaVM();
}

根据上述代码,你会发现在我们的应用里直接就可以 JNI 调用了,并不需要创建虚拟机。因为应用进程是Zygote进程孵化出来的,继承了父进程的拥有虚拟机,只需要重置数据即可。

接着看一下Java层的处理,具体可参考ZygoteInit文件的main方法

1.预加载资源,比如常用类库、主题资源及一些共享库等

大厂Android开发高频面试问题:说说你对Zygote的理解

 

2.启动SystemServer进程

大厂Android开发高频面试问题:说说你对Zygote的理解

 

3.进入Socket 的Loop循环 会看到的
ZygoteServer.runSelectLoop(…)调用

boolean runOnce() {
    String[] args = readArgumentList(); //读取参数列表
    int pid = Zygote.forkAndSpecialize(); //根据读取到的参数启动子进程
    if(pid == 0) {
        //in child
        //执行ActivityThread的入口函数(main)
        handleChildProc(args,...);
        return true;
    }
}
大厂Android开发高频面试问题:说说你对Zygote的理解

 

四、总结

Zygote启动流程中需要主要以下2点问题

  1. Zygote fork要保证是单线程
  2. Zygote的IPC是采用socket


Tags:Android开发   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
今天面试遇到同学说做过内存优化,于是我一般都会问那 Bitmap 的像素内存存在哪?大多数同学都回答在 java heap 里面,就比较尴尬,理论上你做内存优化,如果连图片这个内存大户内存...【详细内容】
2021-12-23  Tags: Android开发  点击:(6)  评论:(0)  加入收藏
对项目的基本介绍 1.整个框架主要是给MVVM框架使用的,自己写完interface接口后,通过自定义的注解就能自动生成接口方法 2.用Kotlin的Flow去代替Rxjava,因为我发现RxJava功能很...【详细内容】
2021-12-08  Tags: Android开发  点击:(16)  评论:(0)  加入收藏
前言在Android开发过程中,有些时候会根据需要引用别的项目到当前项目里面,而且以Module形式引用。所以本篇博文就来分享一下怎么以Module形式引用别的项目到当前项目中,方便开...【详细内容】
2021-12-07  Tags: Android开发  点击:(21)  评论:(0)  加入收藏
作者:fundroid这篇文章偏阅读一些,大家可以了解下 Android 的一些最新动向。每年9/10月份 Google 都会举行约为期2天的 Android Dev Summit,在活动上 Google 的技术专家们会分...【详细内容】
2021-11-30  Tags: Android开发  点击:(15)  评论:(0)  加入收藏
概述当Android应用程序需要访问设备上的敏感资源时,应用程序开发人员会使用权限模型。虽然该模型使用起来非常简单,但开发人员在使用权限时容易出错,从而导致安全漏洞。本文中,...【详细内容】
2021-09-07  Tags: Android开发  点击:(66)  评论:(0)  加入收藏
Zygote可以说是Android开发面试很高频的一道问题,但总有小伙伴在回答这道问题总不能让面试满意, 在这你就要搞清楚面试问你对Zygote的理解时,他最想听到的和其实想问的应该是哪...【详细内容】
2021-08-12  Tags: Android开发  点击:(104)  评论:(0)  加入收藏
目前市场中使用音视频技术的公司太多了,大到全民观看短视频,小到直播带货,每个国人的用手机的时间也被视频占据着国内的音视频行业可以划分为三类第一类 短视频抖音、快手、微...【详细内容】
2020-12-09  Tags: Android开发  点击:(130)  评论:(0)  加入收藏
一、Android JetPack——Google多么痛的领悟最近好几个小伙伴问我什么是Android JetPack,听说这个包好像有点牛,帅哥你会不?我心想什么鬼!Android JetPack这货不是一...【详细内容】
2020-09-14  Tags: Android开发  点击:(112)  评论:(0)  加入收藏
前言1、软件吃掉世界,而机器学习正吃掉软件在数据爆炸的时代,如何创建「智能系统」成为焦点。这些应用程序内所体现的智能技术,并非是将实用指令添加到代码中,而是可以让软件自...【详细内容】
2020-07-13  Tags: Android开发  点击:(76)  评论:(0)  加入收藏
1、使用优化过的数据容器。在Android framework下,建议使用优化过的数据容器比如:SparseArray,SparseBooleanArray,LongSparseArray。通用的HashMap实现的内存使用率非常的低,...【详细内容】
2020-04-26  Tags: Android开发  点击:(67)  评论:(0)  加入收藏
▌简易百科推荐
今天面试遇到同学说做过内存优化,于是我一般都会问那 Bitmap 的像素内存存在哪?大多数同学都回答在 java heap 里面,就比较尴尬,理论上你做内存优化,如果连图片这个内存大户内存...【详细内容】
2021-12-23  像程序那样思考    Tags:Android开发   点击:(6)  评论:(0)  加入收藏
Android logcat日志封装logcat痛点在Android开发中使用logcat非常频繁,logcat能帮我们定位问题,但是在日常使用中发现每次使用都需要传递tag,并且会遇到输出频率很高的log,在多...【详细内容】
2021-12-22  YuCoding    Tags:Android   点击:(7)  评论:(0)  加入收藏
对项目的基本介绍 1.整个框架主要是给MVVM框架使用的,自己写完interface接口后,通过自定义的注解就能自动生成接口方法 2.用Kotlin的Flow去代替Rxjava,因为我发现RxJava功能很...【详细内容】
2021-12-08  网易Leo    Tags:Android开发   点击:(16)  评论:(0)  加入收藏
前言在Android开发过程中,有些时候会根据需要引用别的项目到当前项目里面,而且以Module形式引用。所以本篇博文就来分享一下怎么以Module形式引用别的项目到当前项目中,方便开...【详细内容】
2021-12-07  网易Leo    Tags:Android开发   点击:(21)  评论:(0)  加入收藏
作者:fundroid这篇文章偏阅读一些,大家可以了解下 Android 的一些最新动向。每年9/10月份 Google 都会举行约为期2天的 Android Dev Summit,在活动上 Google 的技术专家们会分...【详细内容】
2021-11-30  像程序那样思考    Tags:Android开发   点击:(15)  评论:(0)  加入收藏
一、 准备工作1、安装JDK,下载地址(可能需要一个oracle账号,大家百度一下或者自行注册一个就行。尽可能选择8或者11,这两个是长期版本)Java SE | Oracle Technology Network | Or...【详细内容】
2021-11-23  永沧    Tags:Android   点击:(26)  评论:(0)  加入收藏
使用Maven Publish Plugin插件。(官方支持)一、在Library的build.gradle中配置plugins { id 'com.android.library' id 'kotlin-android' id 'k...【详细内容】
2021-11-05  羊城小阳    Tags:Android   点击:(36)  评论:(0)  加入收藏
谷歌离推出Play Store应用程序的新数据隐私部分又近了一步。应用程序开发人员现在可以通过谷歌在Play控制台的新 "数据安全表 "填写相关细节。该公司表示,所需信息将从2022年...【详细内容】
2021-10-20    中关村在线  Tags:安卓   点击:(57)  评论:(0)  加入收藏
架构究竟是什么?如何更好的理解架构?我们知道一个APP通常是由class组成,而这些class之间如何组合,相互之间又如何产生作用,就是影响这个APP的关键点。细分的话我们可以将其分为类...【详细内容】
2021-09-17  像程序那样思考    Tags:Android架构   点击:(51)  评论:(0)  加入收藏
概述当Android应用程序需要访问设备上的敏感资源时,应用程序开发人员会使用权限模型。虽然该模型使用起来非常简单,但开发人员在使用权限时容易出错,从而导致安全漏洞。本文中,...【详细内容】
2021-09-07  SecTr安全团队    Tags:Android开发   点击:(66)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条