Android,framework面试常见问题总结

Android,framework面试常见问题总结

第一个问题:Android系统的启动流程:

(1)Bootloader阶段:设备启动时,首先进入Bootloader程序。该程序检查设备的硬件设施,并确定启动哪个操作系统映像。
(2)Kernel阶段:在Bootloader的启动过程中,选择了设备的操作系统映像后,控制权就会被转移到内核,内核会负责启动Android系统。内核会初始化硬件,为每个硬件设备建立一个设备节点,并将其挂载到/ dev目录中。此外,内核还会启动init进程,即Android系统的第一个用户进程。
(3)Init进程阶段:Init进程负责在系统启动时启动系统服务。它会根据/init.rc文件中的内容逐个启动各个系统服务。一些服务是必需的,例如Zygote进程,该进程负责启动Android系统上的所有Java应用程序。其他服务可能只在需要时才会启动,例如WiFi服务。
(4)Zygote进程阶段:Zygote进程负责在Android系统中启动所有Java应用程序。当Zygote进程启动时,它会加载并预初始化所有Android框架类。这些类的预初始化可以加快应用程序的启动速度。
(5)应用程序启动阶段:一旦Zygote进程启动,它就会等待来自应用程序的请求。当用户启动应用程序时,Zygote进程会fork一个新进程,并为新进程加载应用程序的代码和资源。新进程会被分配一个新的进程ID(PID),并成为运行在Android系统上的一个独立进程。

进一步完善: 当按下电源触发开机,首先会从ROM中预定义的地方加载引导程序BootLoader到RAM中,并执行BootLoader启动Linux Kernel,然后启动用户级别的第一个程序:init进程。init进程会解析init.rc脚本做一些初始化工作,然后挂载文件系统、创建工作目录以及启动系统服务进程,其中包括的系统服务进程包括Zygote\service manager、media等。在Zygote中会进一步去启动system_server进程,然后再system_server进程中会启动AMS、WMS、PMS等服务,等这些服务启动之后AMS中就会打开Launcher应用的home,activity,最终就会看到手机的“桌面”

第二个问题:system_server为什么要在Zygote中启动,而不是init直接启动呢?

system_server是Android系统中的一个核心进程,主要负责管理Android系统的各种服务和应用程序,因此启动顺序和方式都很重要。在Android系统中,启动流程分为Linux Kernel的启动和Android系统的启动。Linux Kernel启动后,运行第一个用户程序,在Android中就是init程序。init是所有Linux程序的起点,而Zygote是所有Java程序的"孵化池"[3]。系统启动时,init进程会首先启动Zygote进程,然后Zygote进程再孵化其他Java进程,如Activity Manager、System Server等[1]。因此,system_server也是通过Zygote进程启动的。
Zygote进程在启动时会注册一个服务端socket,用于和客户端进程通信[1]。当system_server进程需要启动时,它会通过JNI调用向Zygote进程发送启动请求,Zygote进程收到请求后会根据请求参数fork出system_server进程[4]。这种启动方式具有以下优点:
(1)节省启动时间:Zygote进程是一个预加载的Java虚拟机进程,可以在系统启动时就启动并预加载很多系统核心类和资源,从而节省启动时间[5]。
(2)减少内存占用:Zygote进程会在系统启动时预加载一些系统核心类和资源,这些资源可以被其他进程共享,从而减少内存占用[2]。
(3)提高应用启动速度:由于Zygote进程已经预加载了很多系统核心类和资源,因此其他Java进程启动时可以直接从Zygote进程中复制内存,而不需要重新加载这些资源,从而提高应用启动速度[2]。
综上所述,system_server进程在Zygote进程中启动可以加快系统启动速度、减少内存占用并提高应用启动速度。

第三个问题:为什么要专门使用Zygote进程孵化应用进程,而不是让system_server去孵化呢?

Zygote 进程是 Android 系统的一个重要进程,它的主要作用是孵化新的应用进程,也是其他进程的父进程。Zygote 进程的优势在于可以预加载一些系统资源,以加快应用进程的启动速度,并且可以通过共享内存技术共享这些资源,节省内存空间[1]。

相比之下,system_server 进程则负责启动系统的核心服务,如 Activity Manager、Window Manager 等,是系统的关键进程之一。如果让 system_server 进程去孵化应用进程,就会分散其本职工作的注意力,影响系统的稳定性和性能。因此,为了保证系统的稳定性和性能,Android 系统选择使用 Zygote 进程来孵化应用进程[2]。

此外,Zygote 进程还具有注册 JNI 函数、预加载 Java 类和资源等功能,这些功能也是 Android 系统正常运行的重要组成部分[2]。

综上所述,Android 系统选择使用 Zygote 进程来孵化应用进程,而不是让 system_server 进程去孵化,是为了保证系统的稳定性和性能,同时充分发挥 Zygote 进程的资源预加载和共享内存等优势[1][2]。

第四个问题:Android导致死锁的原因以及解决原因:

Android 应用程序中死锁的原因可能有很多种,以下是一些可能导致死锁的原因:
(1)线程同步问题:在 Android 应用程序中,线程同步问题可能导致死锁。例如,如果一个线程正在等待另一个线程释放一个共享资源,而另一个线程也在等待该资源,那么就会出现死锁。
(2)锁竞争:当多个线程试图同时访问同一个资源时,就可能发生锁竞争,从而导致死锁。
(3)锁的使用不当:如果开发人员在应用程序中不正确地使用锁,也可能导致死锁。例如,在使用 WakeLock 时,如果没有正确释放锁,就会导致死锁 [4]。
(4)内存泄漏:内存泄漏是另一个可能导致死锁的问题。如果应用程序中存在内存泄漏,那么系统的资源可能会被耗尽,从而导致死锁。

为了避免在 Android 应用程序中发生死锁,开发人员可以采取以下措施:

(1)避免在 UI 线程中执行耗时操作。可以使用异步任务或线程池等技术来在后台执行任务。
(2)使用适当的同步机制,例如 synchronized 块或 Lock 接口。
(3)确保正确使用锁,例如 WakeLock。在使用锁时,一定要正确地获取和释放锁。
(4)识别和解决内存泄漏问题,例如使用内存分析工具分析应用程序并及时释放资源。
总之,死锁是 Android 应用程序中常见的问题之一,开发人员需要注意以上可能导致死锁的原因并采取相应的措施来避免死锁的发生。

第五个问题:system_server的启动流程?

System Server进程主要用于创建系统服务,包括我们熟知的Activity Manager Service (AMS)、Window Manager Service (WMS)和Package Manager Service (PMS)等。它是在Zygote进程启动后启动的。
在Zygote进程中,会调用forkSystemServer方法来启动System Server进程。System Server进程复制了Zygote进程的地址空间,因此也得到了Zygote进程创建的Socket。这个Socket对于System Server进程没有什么用处,因此会关闭它。接着,会调用handleSystemServerProcess方法来启动System Server进程。
handleSystemServerProcess方法会创建一个PathClassLoader,并调用ZygoteInit.zygoteInit方法。在zygoteInit方法中,会启动Binder线程池,这样System Server进程就可以使用Binder与其他进程进行通信了。最后,zygoteInit方法会调用RuntimeInit.applicationInit方法来进入SystemServer的main方法。
在SystemServer的main方法中,会创建一系列系统服务,包括AMS、WMS和PMS等。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值