大厂Android开发高频面试问题:说说你对Zygote的理解
发布时间:2025-05-18 02:06:45 发布人:远客网络
一、大厂Android开发高频面试问题:说说你对Zygote的理解
Zygote可以说是Android开发面试很高频的一道问题,但总有小伙伴在回答这道问题总不能让面试满意,在这你就要搞清楚面试问你对Zygote的理解时,他最想听到的和其实想问的应该是哪些?下面我们通过以下几点来剖析这道问题!
关于这个问题答出了这两点那就是OK了。可能大部分小伙伴可能能答出第二点,第一点就不是很清楚。SystemServer也是Zygote启动的,因为SystemServer需要用到Zygote准备好的系统资源包括:
直接从Zygote继承过来就不需要重新加载过来,那么对性能将会有很大的提升。
在说Zygote启动流程之前,先明确一个概念:启动三段式,这个可以理解为Android中进程启动的常用套路,分为三步骤:
这里要了解LOOP循环是什么,其实LOOP作用是不停地接受消息,处理消息,消息的来源可以是 Soket、 MessageQueue、 Binder驱动发过来的消息,但无论消息从哪里来,它整个流程都是去接受消息,处理消息。这个启动三段式,它不光是Zygote进程是这样的,只要是有独立进程的,比如说系统服务进程,自己的应用进程都是如此。
Zygote进程的启动取决于init进程,init进程是它是linux启动之后用户空间的第一个进程,下面看一下启动流程:
3.启动配置文件中定义的系统服务,其中Zygote服务就是定义在配置中的
4.同时启动的服务除了Zygote之外还有一些别的系统服务也是会启动的,比如说ServiceManager进程,它是通过fork+execve系统调用启动的
在init.rc文件中会import/init.${ro.zygote}.rc,init.zygoteXX,XX指的是32或者64,对我们没差我们直接看init.zygote32.rc即可。配置文件比较长,这里做了截取保留了Zygot相关的部分。
说完了启动配置呢,这里来聊一下启动进程,启动进程有两种方式:
两者看起来差不多,首先首先都会调用fork函数创建子进程,这个函数比较奇特会返回两次,子进程返回一次,父进程返回一次。区别在于:
主要分为两部分Native层处理和Java层处理,Zygote进程启动之后,它执行了execve系统调用,它执行的是用C++写的二进制的可执行程序里的main函数作为入口,然后在Java层运行!
在app_main.cpp文件,AndroidRuntime.cpp文件。我们可以找到几个主要函数名
根据上述代码,你会发现在我们的应用里直接就可以 JNI调用了,并不需要创建虚拟机。因为应用进程是Zygote进程孵化出来的,继承了父进程的拥有虚拟机,只需要重置数据即可。
接着看一下Java层的处理,具体可参考ZygoteInit文件的main方法
1.预加载资源,比如常用类库、主题资源及一些共享库等
3.进入Socket的Loop循环会看到的ZygoteServer.runSelectLoop(…)调用
Zygote启动流程中需要主要以下2点问题
二、Android开发面试已经卷到这个地步了吗
1、所有的面试者都希望在自己的能力范围内,尽可能的展现自己的能力(我还不错,快给我发Offer吧),希望和面试官有的聊,聊的还不错。这就和大家刚开始找另外一半一样,共同“语言”,共同“话题”,是进一步深入的基础。优秀的的面试官就像一个主持人,更多的是做一个引导,让你把才能展现出来。
2、而目前大公司的app开发都要基于模块化、层次化、组件化、控件化的思路来设计架构,而这一切的基础都建立在Android Framework系统框架底层原理实现之上,下面给大家展示一写大厂面试真题。
3、这些问题相信去大厂面试过的很多面试者都遇到过,另外 Framework作为 Android框架层,为 App提供了众多 API去调用,但是很多机制都是 Framework包装好了给 App来用的,如果不知道这些机制的原理,那么很难去在这基础上做优化。
4、再比如我们经常说的 Handler,MessageQueue,Looper。看源码你就可以更好的理解那些概念:ThreadLocal做什么的;Thread和 Handler的关系;为什么不能在子线程更新 UI?
5、有些同学表示:我都没说我精通、擅长Framework,也没能逃掉这些问题。因为目前大公司的app开发都要基于模块化、层次化、组件化、控件化的思路来设计架构,而这一切的基础都建立在Android Framework系统框架底层原理实现之上,所以与它相关的知识都尤为重要。
6、而且目前一线企业的app都是多线程和多进程的,而Android进程间通信机制就是Binder,原生的线程间通信则是Handler, Binder和Handler是了解安卓运行机制必须要掌握的一个知识点,更是一线企业面试必问的知识点!
7、这份由腾讯技术团队出品的《Android Framework开发揭秘》总共有19万字,包含109个知识点,通过经典Binder、Handler、AMS等面试题解析加深你对Android Framework框架层的理解。
8、这份1932页的《2022Android中高级面试题汇总》是总结了2020-2021期间大厂面试中的高频面试题汇总,其中包括腾讯、字节、美团、阿里、百度…等一线互联网大厂。
9、资料包含: Java基础、Android基础、UI控件、网络通信、架构设计、性能优化、源码流程…
10、以上所有资料都是免费分享,需要的小伙伴可以在公众号免费获取!!!
11、当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要不断学习的。
三、面试android开发,去了怕面试官让做机试,怎么办
1、多练啊,除了多练,没别的办法。
2、其实做安卓开发,如果机试时间很短的话,大部分人都是没办法全面实现比较复杂的功能的。考官自己应该也很清楚。
3、那么为什么明明时间很短,很多考官还是要考机试呢?如果时间短还要搞机试的话,大部分考官的想法是想要看你是不是真的做过开发。然后考察你的编程风格以及基本概念、基本方法的掌握情况。大部分有时候并不一定非要调试通过,有经验的人只要看你的代码,就知道你的水平,就明白你的开发经历。
4、所以如果应聘安卓开发岗,切切实实的搞过开发是最重要的。只是照着书本上敲几个程序出来,这个水平显然不行。自己扎扎实实做十几个涵盖各种不同功能的入门级的APP,全程尽量自己一字一句、一个控件一个控件地搞定,不要复制,十几个APP做下来,应付手机开发岗位的机试就应该不成问题。