init 进程
Android
系统启动流程:
- 启动电源及系统启动
- 引导程序
BootLaoder
Linux
内核启动init
进程启动:主要是用来初始化和启动属性服务,也用来启动Zygote
进程
僵尸进程:在Linux
中,父进程使用fork
创建子进程,子进程终止后,但父进程不知道子进程终止,虽然子进程已经退出,但系统还未它保留一定的信息(比如进程号,退出状态,运行时间),这时候,子进程就被称为僵尸进程。系统资源有限,如果进程被僵尸进程耗尽,那么就无法创建出新的进程。 Android
提供一种属性服务相当于Windows
下的注册表管理器记录用户及软件信息,即使系统或软件重启,根据之前的信息,进行一些初始化操作。 在Linux
新内核中:epoll
用来替换select
,它是Linux
为处理大量文件而做的改进的poll
,是Linux
多路复用I/O
接口select/poll
的增强版。它能够显著的提高程序在大量并发连接中只有少量活跃情况下的系统CPU利用率。epoll
内部用于保存事件的数据类型是红黑树,查找速度快,只有O(logn)
,select
采用数组保存信息查找速度慢只有O(n)
,只有当少量文件描述符值,epoll
与select
的效率才会差不多。
系统属性分为两种类型:一种普通属性,一种控制属性,控制属性用来执行一些命令,比如开机动画。 init
进程总结:
- 创建和挂载启动所需的文件目录
- 初始化与启动属性服务
- 解析
init.rc
配置文件并启动Zygote
进程
Zygote进程
在Android
系统中,DVM
(Dalvik
虚拟机)与ART
、应用程序进程以及运行系统关键服务的SystemService
进程都是有Zygote
进程创建的。它通过fork
(复制进程)的形式创建应用程序的进程与systemservice
进程。zygote
启动时会创建DVM
与ART
。
Android 5.0开始,支持64位程序,因此zygote
也就有了32位与64位区别
Zygote
进程都是通过fork
创建子进程.
在app_main
的函数中调用了AndroidRuntime
的start
方法。start
方法进行启动java虚拟机,为java
虚拟机注册JNI
方法,而Zygoteinit
的main
方法由java
语言编写,当前运行逻辑在Native
中,这就需要JNI
调用java
。这样Zygote
就进入了java
框架层。
ZygoteInitmain
方法:
- 创建一个
Server
端的Socket
- 预加载类与资源
- 启动
SystemServer
进程 - 等待
AMS
请求创建新的应用程序进程
Zygote
进程启动总结:
- 创建
Appruntime
并调用start
方法,启动Zygote
进程 - 创建
java
虚拟机并为java
虚拟机注册JNI
方法 - 通过
JNI
调用ZygoteInit
的main
函数进入Zygote
的java
框架层 - 通过
registerZygoteSocket
方法创建服务器端的socket
,并通过runSelectLoop
方法等待AMS
请求来创建新的应用程序进程 - 启动
systemserver
进程
SystemServer进程
主要用于创建系统服务,比如AMS
、PMS
与WM
都是它创建
SystemServer
的main
方法只调用了SystemServer
的run
方法 该方法主要做了:
- 创建消息
Looper
- 加载动态库
liandroid_servers.so
- 创建系统
context
- 启动引导服务,比如
AMS、PowerManagerService
与PackageManagerService
等服务 - 启动核心服务,比如
DropBoxManagerService、BatteryService
等 - 启动其他服务,比如
Cam
而ManagerService、AlarmManagerService、WindowManagerService
等
ServiceManager
用来管理系统各种Service
,用于系统C/S
架构中的Binder
通信机制;Client
端要使用某个Service
,需要先到servicemanager
查询service
相关信息,然后根据相关信息所在的service
进程建立通信。
SystemServer总结:
- 启动
Binder
线程池,这样就可以与其他进程通信 - 创建
SystemServiceManager
,其用于对系统的服务进行创建,启动与生命周期管理 - 启动各种系统服务
Lanuncher进程
系统最后一步是启动一个应用程序来显示系统中已经安装的应用程序,这个应用程序叫做Lanuncher
。它会启动过程中请求PackageManagerService
返回系统中已经安装的应用程序信息,并将这些信息封装成一个快捷图标列表显示在系统屏幕上,这样用户可以通过点击这些快捷图标来启动相应的应用程序。
通俗来讲Lanuncher
就是Android
系统桌面
- 作为
android
系统的启动器,用于启动应用程序 - 作为
Android
系统的桌面,用于显示和管理应用程序快捷图标或者其他桌面组件
启动的应用程序就是Lanuncher
,因为Lanuncher
的Androidmanifest
文件中的intent-filter
标签匹配了Action
为Intent.ACTION_MAIN,Category为Intent.CATEGORY_HOME
,设置了这样的属性,activity
就成为主activity
Launcher
显示应用程序图标,它是用工作区的形式显示系统安装应用程序的快捷图标,每一个工作区用来描述一个抽象的桌面,由n个屏幕组成,每个屏幕又分n个单元格每个单元格用来显示一个应用程序快捷图标
Android系统启动流程
- 启动电源以及系统启动
当电源按下时引导芯片代码从预订的地方开始执行。加载引导程序BootLoader
到RAM
,然后执行
- 引导程序
BootLoader
它是在android
操作系统开始运行前的一个小程序,它的主要作用把系统OS
拉起来并运行
Linux
内核启动
当内核启动时,设置缓存、被保护存储器、计划列表、加载驱动。当内核完成系统设置时,它首先在系统文件中寻找init.rc
文件,并启动init
进程
初始化和启动属性服务,并且启动Zygote
进程
Zygote
进程启动
创建Java
虚拟机并为java
虚拟机注册JNI
方法,创建服务器端Socket
,启动SystemServer
服务
SystemServer
进程启动
启动Binder
线程池和SystemServiceManager
,并且启动系统各种服务
Launcher
进程启动
被SystemServer
进程启动的AMS
会启动Launcher
,Launcher
启动后会将已经安装的应用快捷图标显示在桌面上