栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【Android 底层】Android 系统启动及应用程序进程启动的简单梳理

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【Android 底层】Android 系统启动及应用程序进程启动的简单梳理

Android 系统启动流程
  1. 启动电源以及系统启动
    当电源按下时,引导芯片代码从 ROM 中执行,将引导程序 BootLoader 加载到 RAM 中,并执行
  2. 引导程序BootLoader
    通过引导程序 BootLoader ,将系统OS拉起并运行
  3. 启动 Linux 内核
    当内核启动时,设置缓存、被保护在存储器、计划列表、加载驱动。当内核完成系统设置后,寻找init.rc文件,并启动init进程
  4. 启动 init 进程
    初始化并启动属性服务,同时启动 Zygote 进程
  5. Zygote 进程启动
    创建 JVM 并为其提供 JNI 方法,创建响应 AMS 的 Server 端 Socket ,启动 SystemService
  6. SystemServer j进程启动
    启动 Binder 线程池和 SystemServiceManager ,同时启动各种系统服务(AMS,WMS,PMS、CameraService…)
  7. Launcher 启动
    AMS 会启动 Launcher ,它会将系统中已安装的程序快捷图标显示在桌面上
init 进程

系统中的第一个进程,进程号为1,主要职责为创建 Zygote 和 Property Service

  1. 创建和挂载启动所需的文件目录
  2. 初始化和启动属性服务
  3. 解析init.rc配置文件并启动 Zygote 进程
僵尸进程

在UNIX/Linux中,父进程使用 fork 创建子进程,在子进程终止之后,如果父进程不知道子进程已经终止,此时子进程虽已退出,但系统进程表中仍保留了一定的进程信息(如:进程号,退出状态,运行时间等),该子进程就被称为僵尸进程。
系统进程表是一个有限的资源,如果系统进程表被僵尸进程耗尽的话,系统就可能无法创建新的进程。

Property Service 属性服务

Windows系统中有一个注册表管理器,其通过键值对的方式来记录用户、软件的一些使用信息。及时系统或软件重启,还是能够根据之前注册表中的记录,进行相应的初始化工作。Android 也提供了一个类似的机制,叫作属性服务。

init进程启动的时候会启动属性服务,并为其分配内存,同时存储这些属性,在需要时直接读取即可。

系统属性除了普通属性之外,还有一种用来执行命令的控制属性(如:开机动画)

Zygote 进程

在Android系统中,DVM 和 ART、应用程序进程以及运行系统进程的关键服务的SystemServer进程都是由Zygote进程来创建的,我们将其称之为孵化器。
它通过fork(复制进程)的形式来创建应用程序进程和SystemServer进程,而由于Zygote在启动时会创建DVM或ART,因此通过fork创建的进程其内部就存在一个DVM或ART的实例副本。

底层通过JNI调用Java代码(ZygoteInit的main方法),从Native层进入Java框架层。

该方法主要做了四件事:

  1. 创建一个Server端的Socket
  2. 预加载类和资源
  3. 启动SystemServer进程
  4. 等待AMS请求创建新的应用程序进程
SystemService

SystemService 被创建后,主要做了以下的工作:

  • 启动binder线程池,如此一来便可与其他进程进行通信
  • 创建SystemServiceManager,其用于对系统的服务进行创建、启动和生命周期管理启动各种系统服务
Launcher

系统启动的最后一步是启动一个应用程序来显示系统中已经安装的应用,该应用程序便是Launcher。
在启动过程中会请求PMS系统中已安装的应用程序信息,并将信息封装成一个快捷图标列表显示在系统屏幕上。
职责:

  • 作为Android系统的启动器,用于启动应用程序。
  • 作为Android系统的桌面,用于显示和管理应用程序的快捷图标与桌面组件。
应用程序进程启动过程

该过程可分为AMS发送启动应用程序进程请求,以及Zygote接收请求并创建应用程序进程。
在创建应用程序进程过程中,还创建了Binder线程池与在ActivityThread的main方法中创建了消息循环Looper

  • binder用于进程间通信
  • ActivityThread类用于管理当前应用程序进程的主线程
  • main中创建的H类是ActivityThread的内部类,用于处理主线程的消息循环
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/644515.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号