对于问题:说一说Android 系统的启动:
这道题的考察内容包括:
- Android 有哪些主要的系统进程?
- 这些系统进程是怎么启动的?
- 进程启动之后主要做了些什么事?
一、系统进程:
通过系统配置文件init.rc
可以看到系统进程都有哪些。
service zygote /system/bin/app_process ..
service servicemanager /system/bin/servicemanager …
service surfaceflinger /system/bin/surfaceflinger ..
service media /system/bin/mediaserver ..
……
二、Zygote 是怎么启动的?
- init 进程fork出zygote进程
- 启动虚拟机,注册 jni 函数
- 预加载系统资源
- 启动SystemServer
- 进入 Socket Loop
三、SystemServer 是怎么启动的?
1 | private static boolean startSystemServer(...){ |
系统服务是怎么启动的?
系统服务怎么发布,让应用程序可见?
- 通过
publishBinderService(name,IBinder)
方法发布,最终调用的为:ServiceMannager.addService(name,service, allowlsolated)
,也就是最终把要发布系统服务的binder注册到 ServiceManager 里面
- 通过
系统服务跑在什么线程?
工作线程:
1、有的线程跑在其独有的工作线程中,如 AMS、PMS、PackageManagerService
2、有的跑在大家共用的工作线程,如 DisplayThread、FgThread、IoThread、UiThread
binder 线程
怎么解决系统服务启动的互相依赖?
- 分批启动:基础的服务先启动如 AMS、PMS、PKMS,很多Service都依赖这几个Server, 所以先启动,上层的Service 可以放后边
- 分阶段启动:分成不同的阶段启动,没到一个阶段,就通知当前已经启动的Server, 告诉它们现在什么阶段,那些资源可以用,然后做一些这个阶段可以做的初始化。
桌面启动
在 AMS 服务就绪时,会调 systemReady 函数,在函数里面会去调 startHomeActivityLocked 函数启动桌面。桌面可以看做一个系统级应用,启动桌面的Activity Launcher.java 类, 在 Launcher 类的 onCreate 中会启动 LoaderTask , LoaderTask 会去先 PackageManagerService 查询所有已经安装的应用,最后把查询到的应用以应用图标显示到桌面。
总结:
对于问题: 说说Android 系统的启动流程?
可以分为以下三个小问题:
- zygote 是怎么启动的? 进程启动之后又干了什么,之后怎么进入socket loop 循环,等着创建应用进程
- systemServer 是怎么启动的?启动之后又做了什么事。
- 系统服务是怎么启动的?桌面怎么启动的。