Android系统的启动过程以及APP的启动过程分析

当我们们按下手机的开机按钮,眼睛看到的是绚丽的启动画面,然后是等待着一个我们可以点击的桌面出现。外行看热闹,内行看门道,我们是内行,从开机到显示桌面发生了什么?当点击桌面上的一个图标启动某个app,这里又发生了什么?本文将会按照如下安排来分析Android系统的启动过程以及APP的启动过程。同样,本文并不打算通过分析浩如烟海的源码,那样只会徒增篇幅,而对于Android应用开发工程师而言理解了本文也基本上满足要求了,笔者后续会出与本文对应的源码分析系列的文章,思想和细节相辅相成,帮助那些从事Framework层开发的读者朋友们,敬请期待。

  1. Android系统启动过程
    1. 理解Android系统启动过程有什么用
    2. Android系统启动中的7个步骤
  2. Android中APP的启动过程分析
    1. 应用程序进程启动过程
    2. 应用程序启动过程

Android系统启动过程

理解Android系统启动过程有什么用

Android的系统启动过程与APP的启动过程、四大组件原理、AMS(ActivityManagerService)、ClassLoader等有很强的关联,而所列举的这些又都是插件化开发以及热修复所必须掌握的基础,总之一句话,很重要!

Android系统启动中的7个步骤

其实这里说7个步骤是不准确的,因为Android系统启动过程太复杂了,这里说的7个步骤,本质上是系统启动过程中的7个重要结点。现在把7个步骤罗列如下:

1.启动电源

当按下电源按钮,芯片代码(已经由厂商提前固化在ROM中)从预定义的地方开始执行。加载引导程序BootLoader到RAM,然后执行。

2.执行引导程序BootLoader

引导程序BootLoader的主要作用是加载操作系统并开始运行。

3.启动Linux Kernel

Linux Kernel启动后,设置缓存、被保护存储器、计划列表、加载驱动。完成系统设置后在系统文件中寻找init.rc文件,随后启动init进程。

4.启动init进程

初始化并启动属性服务然后启动Zygote进程。

5.启动Zygote进程

创建Java虚拟机并为Java虚拟机注册JNI方法,创建服务器端Socket,启动SystemServer进程。

6.启动SystemServer进程

启动Binder线程池和SystemServiceManager,并启动各种系统服务

7.启动Launcher

被SystemServer进程启动的AMS会启动Launcher

如下图所示:

Android系统的启动过程以及APP的启动过程分析_第1张图片

Android中APP的启动过程分析

应用程序进程的启动过程

在我们去理解“应用程序启动过程”之前,我们得先理解“应用程序进程的启动过程”。因为要想启动一个应用程序,首先得保证这个应用程序所需要的应用程序进程已经启动。ActivityManagerService在启动应用程序时会先检查这个应用程序需要的应用程序进程是否存在,如果不存在,AMS就向Zygote进程发起请求,通知Zygote启动需要的应用程序进程。通过什么方式请求呢?AMS和Zygote之间通过Socket进行通信,Zygote的Java框架层中创建过一个Server端的Socket,这个Socket用来等待AMS请求Zygote来创建新的应用程序进程。Zygote进程通过fock自身创建应用程序进程,这样应用程序进程就会获得Zygote进程在自身启动时候所创建的虚拟机实例。新创建的进程还会创建线程池和消息循环,这样运行运行在该进程中的应用程序才可以方便的利用Binder进行进程间通信以及进行消息处理。

应用程序的启动过程

当Android系统启动完成,我们眼睛看到的是桌面,这个桌面到底是个什么?其实,所谓的桌面,就是一个普通的app罢了,我们在桌面上点击一个图标启动一个程序,本质上,就是在一个应用程序中启动另外一个应用程序。然后,所有的应用程序都由AMS进行启动的,桌面程序无权直接启动一个新的程序的。这种情况下,我们会很自然的想到,桌面程序通知AMS启动一个具体的应用程序,AMS收到通知,然后执行启动对应应用程序的过程,值得一提的是,由于桌面程序和所有普通的应用程序一样,它和AMS之间处于不同的进程,因此需要利用某种机制实现跨进程通信,事实上是通过Binder机制进行跨进程通信,对于不了解Binder机制的读者朋友,请参阅笔者另外一篇文章《Android进程间通信(IPC)之Binder/AIDL》。下面我们来分析一个场景,来梳理出一个应用程序启动的大体过程。

场景:在Android手机桌面上,点击微信按钮

我们把启动微信分为7个步骤(6.0源码是这样实现的,不同版本,实现机制不完全一样)

  1. 桌面程序通知AMS,需要启动微信,而且指定要启动微信的首页
  2. AMS通知桌面程序,“情况我已经了解,你先休息一下”,同时AMS记录好需要启动的页面信息(这里就是首页)
  3. 桌面程序告知AMS,“好的我听你的,休息一会,你去忙着启动微信吧”
  4. AMS首先会检查微信是否已经启动过了。如果当前已经启动了,就唤起微信App即可。如果没启动,就需要启动一个新的进程,启动过程就如本文提到的那样。AMS会在新的进程中创建一个ActivityThread对象。并启动其中的main函数。
  5. 微信App启动成功后,通知AMS,“我启动好了”
  6. AMS找出在第2步记录的信息,通知微信,具体启动哪个页面(这里是首页)
  7. 微信应用程序启动首页,创建Context并于首页Activity进行关联。然后调用首页的Activity中的onCreate函数。

好了,Android系统的启动过程,以及APP的启动过程的大体思路就是这样了,本文中涉及到了不少的重要角色,笔者会在后续文章中逐一进行介绍,比如:

Instrumentation

ActivityThread

H

LoadedApk

AMS

ActivityManagerNative和ActivityManagerProxy

ApplicationThread和ApplicationThreadProxy

敬请读者朋友们期待。

交流QQ群:821357266

欢迎关注微信公众号:甲辞

 

Android系统的启动过程以及APP的启动过程分析_第2张图片

 

你可能感兴趣的:(Android系统的启动过程以及APP的启动过程分析)