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



本文转载:  链接:https://www.jianshu.com/p/d1e8002df580
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值