1-Android的启动流程

Android 的启动流程

Android-Notes/blogs/Android/Framework/Android 系统启动.md at master · Omooo/Android-Notes

当启动电源系统启动后加载 Linux 内核后,加载各种驱动,当有了驱动以后,开始启动 Android 系统同时会加载用户级别的第一个进程 init(system\core\init. c),加载 init. rc 文件,会启动一个 Zygote 进程,此进程是 Android 系统的一个母进程,用来启动 Android 的其他服务进程,然后接着在里面启动了 System Server 进程,负责启动和管理整个 Java framework,包含 ActivityManager,WindowManager,PackageManager,PowerManager 等服务,被 SystemServer 进程启动的 ActivityManagerService 会启动 Launcher,Launcher 启动后会将已安装应用的快捷图标显示到界面上。

  • System Server 进程,是由 Zygote 进程 fork 而来(fork 一般都用 socket),System Server 是 Zygote 孵化的第一个进程,System Server 负责启动和管理整个 Java framework,包含 ActivityManager,WindowManager,PackageManager,PowerManager 等服务。
  • Zygote 进程孵化出的第一个 App 进程是 Launcher,这是用户看到的桌面 App;
  • Zygote 进程还会创建 Browser,Phone,Email 等 App 进程,每个 App 至少运行在一个进程上。
    所有的 App 进程都是由 Zygote 进程 fork 生成的。

启动流程总结

  1. 启动电源以及系统启动
    当电源按下时引导芯片代码开始从预定义的地方(固化在 ROM)开始执行。加载引导程序 Bootloader 到 RAM,然后执行。
  2. 引导程序 BootLoader
    引导程序 BootLoader 是在 Android 操作系统开始运行前的一个小程序,它的主要作用是把系统 OS 拉起来并运行。
  3. Linux 内核启动
    内核启动时,设置缓存、被保护存储器、计划列表、加载驱动。当内核完成系统设置,它首先在系统文件中寻找 init. rc 文件,并启动 init 进程。
  4. init 进程启动
    初始化和启动属性服务,并且启动 Zygote 进程。

解析 init. zygote. rc 中的参数,创建 AppRuntime 并调用 AppRuntime.start()方法;
调用 AndroidRuntime 的 startVM ()方法创建虚拟机,再调用 startReg ()注册 JNI 函数;
通过 JNI 方式调用 ZygoteInit. main (),第一次进入 Java 世界

  1. Zygote 进程启动

    创建 JavaVM 并为 JavaVM 注册 JNI,创建服务端 Socket,启动 SystemServer 进程。

  2. SystemServer 进程启动

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

  3. Launcher 启动

    被 SystemServer 进程启动的 ActivityManagerService 会启动 Launcher,Launcher 启动后会将已安装应用的快捷图标显示到界面上。

路线

1.启动电源以及系统启动->2. 引导程序 BootLoader->3. Linux 内核启动->4. init 进程启动->5. Zygote 进程启动->6. SystemServer 进程启动->7. Launcher 启动

init 进程启动

init 是 Android 系统中用户控件的第一个进程,init 进程启动过程中主要分三个部分:

  1. 创建和挂载启动所需的文件目录
  2. 初始化和启动属性服务
  3. 解析 init. rc 配置文件并启动 Zygote 进程
    源码如下 system/core/init/init. cpp

init. rc 是一个配置文件,里面是一些脚本,该脚本的意思是 service 通知 init 进程创建名 zygote 的进程(fork 出来的)并启动 SystemService

Zygote

Zygote 进程主要包括:

  • 加载 ZygoteInit 类,注册 Zygote Socket 服务端套接字
  • 加载虚拟机
  • 提前加载类 preloadClasses
  • 提前加载资源 preloadResources

frameworks/base/services/java/com/android/server/SystemServer. java:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public static void main(String argv[]) {
//...
try {
//...
//1. 创建一个 Server 端的 Socket,socketName 为 zygote
zygoteServer.registerServerSocketFromEnv(socketName);

if (!enableLazyPreload) {
bootTimingsTraceLog.traceBegin("ZygotePreload");
EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_START,
SystemClock.uptimeMillis());
//2. 预加载资源和类
preload(bootTimingsTraceLog);
EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_END,
SystemClock.uptimeMillis());
bootTimingsTraceLog.traceEnd(); // ZygotePreload
} else {
Zygote.resetNicePriority();
}
//...
if (startSystemServer) {
//3. 启动 SystemServer 进程
Runnable r = forkSystemServer(abiList, socketName, zygoteServer);
//4. 等待 AMS 请求
caller = zygoteServer.runSelectLoop(abiList);
} catch (Throwable ex) {
Log.e(TAG, "System zygote died with exception", ex);
throw ex;
} finally {
zygoteServer.closeServerSocket();
}
}

总结:

Zygote 进程主要做了以下几件事:

  1. 创建 AppRuntime 并调用其 start 方法,启动 Zygote 进程
  2. 创建 Java 虚拟机并为 Java 虚拟机注册 JNI 方法
  3. 通过 JNI 调用 ZygoteInit 的 main 方法进入 Zygote 的 Java 框架层
  4. 通过 registerZygoteSocket 方法创建服务端 Socket,并通过 runSelectLoop 方法等待 AMS 的请求来创建新的应用程序进程
  5. 启动 SystemServer 进程

应用程序进程启动过程

启动过程可以分为两步:

  1. AMS 发送启动应用程序进程的请求
    AMS 如果想要启动应用程序进程,就需要向 Zygote 进程发送创建应用程序进程的请求,AMS 会通过调用 startProcessLocked 方法向 Zygote 进程发送请求。
  2. Zygote 接受请求并创建应用程序进程

SystemServer 进程启动

SystemServer 进程主要用于创建系统服务,比如 AMS、WMS、PMS 等都是由它来创建的。

SystemServer 进程被创建后,主要做了以下工作:

  1. 启动 Binder 线程池,这样就可以与其他进程进行通信
  2. 启动 SystemServiceManager,其用于对系统的服务进程创建、启动和生命周期管理
  3. 启动各种系统服务

从上面 ZygoteInit 的 main 方法中我们可以看到调用了 startSystemServer 方法启动 SystemServic。

解析 SyetemServer 进程,我们看下 SystemService 的 main 函数

1
2
3
4
public static void main(String[] args) {
new SystemServer().run();
}

main 函数中只调用了 SystemServer 的 run 函数,如下所示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
private void run() {
......
Looper.prepareMainLooper();
// Initialize native services.
System.loadLibrary("android_servers");
performPendingShutdown();
createSystemContext();
// 创建SystemServiceManager
mSystemServiceManager = new SystemServiceManager(mSystemContext);
mSystemServiceManager.setRuntimeRestarted(mRuntimeRestart);
LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
// Prepare the thread pool for init tasks that can be parallelized
SystemServerInitThreadPool.get();
......
// Start services.
//启动系统的各种服务
try {
traceBeginAndSlog("StartServices");
//引导服务、
startBootstrapServices();
//核心服务
startCoreServices();
//和其他服务
startOtherServices();
SystemServerInitThreadPool.shutdown();
} catch (Throwable ex) {
Slog.e("System", "******************************************");
Slog.e("System", "************ Failure starting system services", ex);
throw ex;
} finally {
traceEnd();
}
......
// Loop forever.
Looper.loop();
}

ServiceManager

创建的 SystemServiceManager 会对系统的服务进行创建、启动和生命周期管理,启动的引导服务 startBootstrapServices 函数中用 SystemServiceManager 启动了 ActivityManagerService、PowerManagerService、PackageManagerService 等服务。

SystemServiceManager 用来管理系统中的各种 Service,用于系统 C/S 架构中的 Binder 机制通信:Client 端要使用某个 Service,则需要先到 ServiceManager 查询 Service 的相关信息,然后根据 Service 的相关信息与 Service 所在的 Server 进程建立通讯通路,这样 Client 端就可以使用 Service 了


1-Android的启动流程
http://peiniwan.github.io/2024/04/025e84fa82bb.html
作者
六月的雨
发布于
2024年4月6日
许可协议