Android 启动流程梳理篇

Posted 初一十五啊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 启动流程梳理篇相关的知识,希望对你有一定的参考价值。

前言

本文是本人通过学习各位前辈的博客,结合自己对android的理解所作。如有错误,还请批评指正。

1.总的介绍

几个注意点
①idle是内核空间的鼻祖,init是用户空间的鼻祖。Zygote是Java进程的鼻祖
②Zygote既有native层,也有java层。
③JNI就是负责native层和java层的通信的,起到一个桥梁作用。

2.分别介绍各个角色

①init进程
init进程是Linux中的一个核心进程,在Linux中,所有的进程都是由init进程fork出来的,比如Zygote进程。
它完成的主要功能有:
①创建系统文件
②启动Zygote

②Zygote进程
在Android中,所有的进程(除了第一个Zygote进程)都是由第一个Zygote进程fork出来的。它完成的主要作用有

  • 在native层
    ①初始化Android运行环境,比如虚拟机
    ②注册JNI
    ③执行ZygoteInit.main方法,进入Java层
  • 在Java层
    ①进行一些预加载的工作
    ②fork各种进程,如SystemServer进程
    ③创建socket,进入循环等待AMS的通知

③SystemServer
SystemServer也是由Zygote进程fork出来的一个进程。与Zygote一起构成了Framework层的两大非常重要的进程。
ActivityManagerService、PackageManagerService、WindowManagerService等都是在SystemService里面开启的。
那么SystemServer是如何被开启的呢?

在Zygote进程开启的时候,会调用ZygoteInit.main方法进行初始化。如图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WDGDaGMv-1675776069872)(https://upload-images.jianshu.io/upload_images/28731023-c41e26912ca7ef2f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

进入这个方法,会发现它调用了forkSystemServer方法。如图

这样就开启了SystemServer

③AMS
AMS全称为“ActivityManagerService”,是一种服务即Service。是由Zygote进程fork出来的。负责系统中所有Activity的生命周期。在SystemServer进程开启的时候进行初始化。

如图,在SystemServer类的startBootstrapServices方法中,有

从而在SystemServer中开启了这些服务
还有一个需要注意的点为:
App与AMS通过Binder进行IPC通信,AMS与zygote通过Socket进行IPC通信。

④Launcher进程
我对Launcher进程的理解是,它也是一个普通的App进程,只是它是一个系统级别的进程,可以管理手机上的App。比如它实现了点击,长按等回调接口,能实现开启一个App的功能。本质上还是调用了Activity.startActivity方法,并且因为设置了

所以这个Activity会添加到一个新的Task栈中。

所以在Launcher中开启一个App,其实和在Activity中调用startActivity开启一样,而且最终都会调用Activity.startActivityForResult()

⑤Instrumentation
每个Activity都持有Instrumentation对象的一个引用,但是整个进程只会存在一个Instrumentation对象。它意为“仪器”,完成对Application和Activity的初始化,以及生命周期的管理,是一个大管家。

⑥ActivityThread
它就是我们常说的UI线程,它的main方法是App的入口,之前说App和AMS是通过Binder进行通信的,那么Activity就是负责与AMS的外交工作的。它与上面的Instrumentation的关系是:
ActivityThread主外,Instrumentation主内,ActivityThread对初始化以及生命周期的调用,最终都会调用到Instrumentation的相关方法。
另外,App开启消息循环,以及Application的创建,都是在ActivityThread类的main方法。

3.总结,启动的具体流程

①BootLoader启动kernel层的idle进程,然后启动init进程,进入native层。
②init进程启动zygote进程,进入java层
③zygote进程在native层完成xxx的工作,在Java层完成xxx的工作。
④zygote进程fork出SystemServer进程,SystemServer进程启动AMS,PMS,WMS等
⑤此时Android系统已经就绪,点击一个App,Launcher进程的ActivityManagerProxy会发送startActivity请求给AMS(通过Binder)
⑥AMS通过socket向Zygote发送创建进程的请求,Zygote就会fork出一个App进程
⑦App进程的ActivityManagerProxy向AMS发送attachApplication的请求(通过binder),AMS调用ApplicationThreadProxy的realStartActivityLocked方法。
⑧ApplicationThreadProxy向ApplicationThread发送scheduleLaunchActivity(通过Binder)
⑨ApplicationThread向ActivityThread发送消息LAUNCH_ACTIVITY
⑩ActivityThread调用handlerLaunchActivity方法,通过反射来创建目标Activity,并回调Activity.onCreate方法,从而完成启动

两部分的图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nz5yugOi-1675776069902)(https://upload-images.jianshu.io/upload_images/28731023-9ba9364eb489b3bd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

补充:通信的具体角色**

客户端向服务端(AMS)进行通信。
需要借助ActivityManagerProxy类,ActivityManagerProxy和AMS都需要实现IActivityManager接口。
客户端通过调用ActivityManagerProxy类,通过transact方法,调用到AMS的相应方法(Binder机制)

服务端(AMS)向客户端进行通信
服务端调用ApplicationThreadProxy类,再调用到ApplicationThread类,从而完成通信。ApplicationThreadProxy和ApplicationThread都实现了IApplicationThread接口

最后

可能有些人看完这篇文章后会发现,中间有设计到不少Framework 底层框架的知识点,没错你如果想更深入的了解系统的启动流程,并从中进行一些优化操作的话,那就必须对底层原理有着深入的了解。

这里针对一些基础不一样的小伙伴,整理了一份《Framework 底层原理学习文档》参考学习,有需要的可以 通过此处进行了解,下方展现的仅部分内容。

《Framework 底层原理学习文档》:

  1. 开机Init 进程
  2. 开机启动 Zygote 进程
  3. 开机启动 SystemServer 进程
  4. Binder 驱动
  5. AMS 的启动过程
  6. PMS 的启动过程
  7. Launcher 的启动过程
  8. Android 四大组件
  9. Android 系统服务 - Input 事件的分发过程
  10. Android 底层渲染 - 屏幕刷新机制源码分析
  11. Android 源码分析实战

以上是关于Android 启动流程梳理篇的主要内容,如果未能解决你的问题,请参考以下文章

Android核心服务解析篇——Android系统的启动

android 启动流程 相关 杂项记录

Android系统启动-综述—1

Android系统篇之----解读AMS远端服务调用机制以及Activity的启动流程

HomeLauncher启动

Android framework重要服务之InputManagerService的启动流程