• 请加作者QQ或者微信联系。作者QQ:524100248,微信号:sendtion。

Android系统到应用启动流程分析

Android sendtion 5个月前 (04-18) 209次浏览 已收录 0个评论 扫描二维码

对于 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


乐趣公园 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Android 系统到应用启动流程分析
喜欢 (1)
[sendtion@163.com]
分享 (0)
sendtion
关于作者:
一个不断奋斗追逐梦想的少年~
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址