对于 Android 底层的东西一直不太懂,特地查找资料进行了总结,分享给大家。
1、Android 系统启动
Android 系统启动从用户按下电源键开始。
- 用户按下电源键,引导芯片代码从预定义的地方开始执行,加载引导程序 BootLoader 到 RAM,然后开始执行。
- 启动引导程序 BootLoader,用来引导 Android 系统的启动工作。然后,Linux 内核启动。
- Linux 内核启动后,设置缓存、被保护存储器、计划列表、加载驱动等操作。当内核完成系统设置后,会查找“init”文件,然后启动 Root 进程。
- Linux 内核创建用户级进程,init 进程(上帝般存在)。
- Init 进程会创建 Zygote 孵化器进程。Zygote 进程存在一个 Socket 服务端,以及一些 Framework 层共享的类和资源。
- Zygote 进程会先孵化出一个 SystemServer 进程。SystemServer 进程用来加载一些系统服务,比如 AMS、WMS、PMS 等,保存有系统服务需要的类和资源,存在一个 Socket 客户端。
- AMS 服务用来管理 Activity 的创建,当需要启动 Activity 时,会通过 SystemServer 进程中的 Socket 客户端向 Zygote 进程发送消息,请求创建 Activity。
init 进程是 Android 系统中用户空间的第一个进程,作为第一个进程,它被赋予了很多极其重要的工作职责,比如创建 zygote(孵化器)和属性服务等。init 进程是由多个源文件共同组成的,这些文件位于源码目录 system/core/init。
以上部分内容引用于刘望舒的博客:https://blog.csdn.net/itachi85/article/details/54783506
2、App 启动过程
App 启动从用户按下桌面图标开始。
- App 都是由桌面启动器启动的,桌面启动器自身也是一个 App,它也存在一个进程,称为 Launcher 进程,也叫调用者进程。
- 用户按下桌面上的 App 图标后,Launcher 进程会将请求启动主活动(MainActivity)的请求以 Binder 的方式发送给 AMS 服务。
- AMS 服务收到请求后,交付给 ActivityStarter 处理 intent 和 flag 信息,然后交给 ActivityStackSuperVisior/ActivityStack 处理 Activity 进程相关流程,同时通过 Socket 客户端向 Zygote 进程请求孵化新进程。
- Zygote 进程收到请求后,创建一个新进程,这个新进程就是 APP 所在进程。
- 在新进程里创建 ActivityThread 线程,包含 main 方法,是 Android 程序的入口,ActivityThread 所在线程即是主线程(UI 线程)。同时创建 ApplicationThread 和 W 线程,他们都继承自 Binder 类。ApplicationThread 线程在主活动创建之前创建,负责监听 AMS 发送来的创建 Activity 的请求。Activity 创建后,W 线程监听 WMS 发来的消息(比如点击和触摸事件),将消息发送给 DectorView,如果 DecoterView 没有处理,则传递给 PhoneWindow,如果 PhoneWindow 也没有处理,则传递给 Activity 通过 Handler 来处理消息。
- ActivityThread 中会调用 prepareMainLooper()方法,创建一个 Looper 对象,Looper 对象会创建一个消息队列 MessageQueue,调用 Looper.loop()方法后 UI 线程会进入消息循环体,不断从消息队列中取出消息 Message 对象并处理消息。
- ApplicationThread 类监听到了创建 Activity 的请求,ActivityThread 通过 ClassLoader 类加载器加载 Activity 并创建 Activity 实例,然后回调 onCreate()方法。
3、其他解释
系统服务主要由 WMS 与 AMS 构成,其中 WMS 主要负责监听与处理与窗口相关的事件(如监听用户点击、手势),AMS 主要负责管理 Activity(如创建 Activity)。
WMS 主要由两个类组成:KeyQ 类、InputDispatcherThread 类。这两个分别创建一个线程,KeyQ 类负责不断将用户消息存储到 QueueEvent 消息队列中,InputDispatcherThread 负责不断从 QueueEvent 中取出消息进行处理或分发给相应应用。
ActivityStarter:Activity 启动控制器
ActivityStack:管理任务栈里的 Activity
参考文章:
https://www.cnblogs.com/bRAyKpoyNt/p/3649417.html
http://www.cnblogs.com/bRAyKpoyNt/p/3647344.html