本篇文章主要介绍按下电源键开机后发生的事情,和你按下桌面上的一个应用图标后发生的事情。下面就让我们一起来探索系统启动和App启动的前世今生吧。

本文的关键是三张示意图,基本上全文都是围绕这三张图的一个解释,请一定对照着图片阅读本文。另外,吃水不忘挖井人,感谢这三张神图的原作者,他们都是承载我们的巨人,让我们站的更高,看得更远,走的更稳。

Android系统启动流程

在此之前,你需要首先了解Android系统的分层架构,详见我的另一篇文章Android系统架构简介
Android系统启动过程可以分为三个阶段:Bootloader引导、Linux kernel启动、Android启动。详见下图:

Android系统启动流程
  1. BootLoader引导
    BootLoader是一段引导程序,类似于Windows开机时的出现第一个画面(有品牌商标的那个)时的运行程序。顾名思义,它的任务是配置软硬件环境,引导操作系统的启动。

  2. Linux kernel启动
    我们知道Android系统的最底层是Linux,所以,BootLoader引导程序结束后会执行Linux内核。Linux kernel会依次启动:

  • init进程:第一个用户级进程。
  • servicemanager服务:所有servcie使用前都要在这里注册。
  • Zygote进程:如图所示,通过Android Runtime运行虚拟机,然后启动Zygote进程。
  1. Android启动
  • Zygote进程:负责虚拟机的初始化。它是Android系统中第一个进程(注意与前面的init进程区分),也是之后所有进程的母进程,其他进程都是有此fork出来。考虑到zygote翻译为“受精卵”,这一点就比较好理解了。
  • SystemServer:超级管理进程,启动所有系统核心服务,负责Android系统的初始化工作。由Zygote孵化出来,是Zygote进程的第一个子进程。SystemServer会启动很多服务,如ActiivityManagerService,WindowManagerService等。
  • ActivityManagerService:由SystemServer来启动,System Service -> Activity Manager Service -> Launcher
  • Home进程:第一个app进程,打开第一个Activity应用Launcher,也就是我们的桌面应用。安装应用程序时会在launcher出现对应图标,所以说我们的桌面也是一个app。

Android应用启动流程

一张图说明应用的启动流程。


app启动流程

上面提到,Launcher本身就是一个应用程序,所以我们启动app时的本质是对Launcher这个app进行操作。如图所示,launcer接收到点击事件时调用startActivity方法,进行activity的跳转。但是与我们平时开发app有所不同,我们要启动的Activity所在的app运行在另外一个进程中,这就涉及到跨进程通信(IPC,Inter-Process Communication)。

Android中通过ActivityManagerService来实现和管理IPC,但是它不能直接让开发者接触到,而是用ActivityManager,WifiManager,LocationManager,WindowsManager等作为入口。我们这里用到的是ActivityManager,下面来详细分析这个过程:

  1. Launcher所在进程通过binder发送消息给system_server进程;

  2. system_server进程调用Process.start()方法向Zygote进程发出创建新进程请求。关于system server在上面的系统启动流程中有提到,它是zygote的第一个子进程。

  3. zygote进程fork自身,开启一个Linux进程和一个主线程。ZygoteInit.main()方法来实例化Activity Thread对象,并最终返回新进程的pid给ActivityManagerService.

  4. ActivityThread随后依次调用Looper.prepareLoop()和Looper.loop()来开启消息循环.

  5. 通过ActivityThread把新建的进程和Application绑定,然后加载app的classes到内存中

  6. 启动 Activity。

可以看出,启动一个app的关键是新建一个进程,关于新建进程的详细过程可参照下图,这里不再展开:


进程的创建流程

到这里,关于系统启动流程和应用启动流程就解释完了,希望对你有所帮助。

更多相关文章

  1. android studio 中aidl文件的使用并且实现跨进程的通信
  2. Android(安卓)App性能优化(1)——App启动优化
  3. H5唤起android app,启动关联应用
  4. Flutter Android端启动白屏问题的解决
  5. Android学习札记53:详解Android中的进程间通信机制Binder系列文章
  6. Android应用程序的编译流程及使用Ant编译项目的攻略
  7. Android中的进程间通信(IPC机制)
  8. Android中使用SurfaceView的方法
  9. Android(安卓)Studio打不开,无法启动,无反应的解决方案

随机推荐

  1. android.os.NetworkOnMainThreadExceptio
  2. Android复习(八)
  3. Android上的log,日志相关
  4. android 软键盘隐藏 activity初始化时edi
  5. Android(安卓)远程链接 daemon not runni
  6. android中的内存泄露
  7. android studio升级时提示 Connection fa
  8. webrtc 针对 android 平台的编译和运行
  9. android开发BUG集
  10. [置顶] 自定义的解压进度条 关于Progress