Android隐喻(二) 启动
2012-07-03 21:41 CreateLight 阅读(538) 评论(0) 编辑 收藏 举报现代分时操作系统多以进程为基本单位,Linux亦不例外。
手机启动如同PC,上电、硬件自检、加载操作系统、内核初始化、启动第一个进程、启动更多的进程、处理用户交互。
Android基于linux,第一个(用户级)进程是init,后续所有进程都是由此进程派生出来,linux进程创建(派生)的系统调用为fork,其语意为“分支”。比如一条道路,你在其上行走,遇到一个二叉分支路口,在这个路口之前所有东西都是相同的,在这个路口之后分成两条支路行进。于此类似,一个进程fork出来的子进程,在其诞生之时和父进程完全一样,只是其后(可能)走向不同的分支。
init会fork出很多linux的基本服务进程,然后会fork出android的zygote进程以及ServiceManager进程。zygote进程语意为“卵”, 所有的Dalvik虚拟机进程都由zygote进程fork出来。ServicaManager为Binder机制的重要组成部分,提供添加service以及查找service等功能,Binder机制为进程间通信机制,用来处理android的进程间通信。
zygote进程会启动Dalvik虚拟机,然后加载共享类和共享资源,共享类和共享资源是由android指定的预先加载的被所有android进程共享的类和资源,包括了android_framework中的大部分类。由于fork语意,由zygote派生出的所有(应用)子进程都已经加载了dalvik虚拟机、共享类和共享资源,可以直接被应用所用。zygote进程本质是一个service进程,用以处理所有创建新dalvik进程的请求,它会创建一个socket用以监听这些请求。
zygote孵化出来的第一个进程为SystemServer,这个进程会启动大部分的android_framework服务线程,用以处理APK应用的各种请求,比如WindowManagerServer(WMS)、ActivityManagerServer(AMS)、PackageManagerServer(AMS)等。APK应用进程通过Binder机制和SystemServer进程通信,使用其中的各个服务线程。
所有服务线程都启动完毕后,AMS会启动ActivityStack中的第一个acitivity,如果不存在(比如开机),则发送带有CATEGORY_HOME的intent去启动Launcher(也就是俗称的“桌面”)程序,如果存在多个Launcher,则弹出列表提示用户选择。每个Launcher都是一个activity,其启动后,用户就进入了手机桌面,随后用户点击任一APK_ICON,则会由Launcher通过startActivity方法去启动新的APK应用。
至此,android启动完成。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述