IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android系统启动流程4---init进程的工作流程 -> 正文阅读

[移动开发]Android系统启动流程4---init进程的工作流程

概况:

  1. 启动init进程
  2. 运行init.rc
  3. 启动zygote服务
  4. Zygote fork的第一个进程——SystemServer
  5. SystemServer启动系统服务

1. linux启动第一个应用程序init

kernel\init\main.c
static int __ref kernel_init(void *unused)
{
	int ret;
	kernel_init_freeable();
	/* need to finish all async __init code before freeing the memory */
	async_synchronize_full();
	free_initmem();
	mark_readonly();
	system_state = SYSTEM_RUNNING;
	numa_default_policy();
	flush_delayed_fput();
	if (ramdisk_execute_command) {
		ret = run_init_process(ramdisk_execute_command);
		if (!ret)
			return 0;
		pr_err("Failed to execute %s (error %d)\n",
		       ramdisk_execute_command, ret);
	}
	/*
	 * We try each of these until one succeeds.
	 *
	 * The Bourne shell can be used instead of init if we are
	 * trying to recover a really broken machine.
	 */
	if (execute_command) {
		ret = run_init_process(execute_command);
		if (!ret)
			return 0;
		pr_err("Failed to execute %s (error %d).  Attempting defaults...\n",
			execute_command, ret);
	}
	if (!try_to_run_init_process("/sbin/init") ||
	    !try_to_run_init_process("/etc/init") ||
	    !try_to_run_init_process("/bin/init") ||
	    !try_to_run_init_process("/bin/sh"))
		return 0;
 
	panic("No working init found.  Try passing init= option to kernel. "
	      "See Linux Documentation/init.txt for guidance.");
}

init进程启动前的工作可以参考:https://blog.csdn.net/weixin_40535588/article/details/121221371

2. android 的init进程

不同平台的init进程不太一样,比如android的init进程源代码是放在system\core\init\init.cpp
而linux系统的一般是放在busybox的init.c中
我们先看android的init进程做了什么工作

init进程主要提供以下几个功能:

挂载文件系统、生成部分设备节点、创建目录
属性服务
处理子进程终止
分析和运行init.rc(等等rc文件)

init.rc脚本是由Android中linux的第一个用户级进程init进行解析的。

init.rc的语法参考https://blog.csdn.net/wangzaieee/article/details/84774298

最后运行了init.rc启动了安卓系统所需要的应用进程和服务

3. linux的init进程

linux系统,即大部分的嵌入式系统用的配置文件不是init.rc,而是inittab,但作用差不多,都是为了启动服务,linux系统的init进程的代码是放在busybox里init.c里

busybox被大家比作瑞士军刀,主要是它以很小的体积提供给我们很多很有用的shell指令。但是这里我们要关注的是busybox的init。

除了基本的命令之外,BusyBox还支持init功能,如同其它的init一样,busybox的init也是完成系统的初始化工作,关机前的工作等等,我们知道在Linux的内核被载入之后,机器就把控制权转交给内核,linux的内核启动之后,做了一些工作,然后找到根文件系统里面的init程序,并执行它,BusyBox的init进程会依次进行以下工作:

  1. 为init设置信号处理过程

  2. 初始化控制台

  3. 剖析/etc/inittab文件

  4. 执行系统初始化命令行,缺省情况下会使用/etc/init.d/rcS

  5. 执行所有导致init暂停的inittab命令(动作类型:wait)

  6. 执行所有仅执行一次的inittab(动作类型:once)

参考:https://blog.csdn.net/yangxuan12580/article/details/51372632

4. init.rc和inittab的关系

搭载linux内核的有很多平台,当内核起来后,会启动根文件系统,不同的平台,根文件系统的init进程不太一样,但是作用都是为了启动各自的服务

例如:

  • 嵌入式系统的init进程代码:busybox里的init.c,配置文件是inittab
  • android的init进程代码:system\core\init\init.cpp,配置文件是init.rc ubuntu
  • ubuntu也会使用busybox的init进程,但是有些配置文件已经淘汰inittab,Ubuntu从6.10开始,采用Upstart替代了传统的init进程(/etc/inittab)

5. android 的init.rc的工作

参考:https://blog.csdn.net/zhonglunshun/article/details/78615980

详细可以阅读代码/system/core/rootdir/init.rc

我们主要关注init.rc去启动zygote进程

6. 启动zygote进程

参考:https://www.jianshu.com/p/a718a49f3533

zygote进程在android系统中有着及其中要的位置.
可以说android系统中的进程都是有zygote孵化出来的, 所有应用进程都是zygote的子进程.
在这里插入图片描述

在这里插入图片描述
init进启动zygote服务,zygote进程再启动其他进程.
首先,分析一下zygote服务的init.rc是如何执行的.

import /init.${ro.zygote}.rc

# It is recommended to put unnecessary data/ initialization from post-fs-data
# to start-zygote in device's init.rc to unblock zygote start.
on zygote-start && property:ro.crypto.state=unencrypted
    # A/B update verifier that marks a successful boot.
    exec_start update_verifier_nonencrypted
    start netd
    start zygote
    start zygote_secondary

on zygote-start && property:ro.crypto.state=unsupported
    # A/B update verifier that marks a successful boot.
    exec_start update_verifier_nonencrypted
    start netd
    start zygote
    start zygote_secondary

on zygote-start && property:ro.crypto.state=encrypted && property:ro.crypto.type=file
    # A/B update verifier that marks a successful boot.
    exec_start update_verifier_nonencrypted
    start netd
    start zygote
    start zygote_secondary

将同目录下的init.zygotexx.rc文件加载.
在这里插入图片描述
然后根据设置条件启动zygote进程

代码文件app_main.cpp就是zygote进程的源码.

7. zyogte进程功能解析

zyogte进程大致有两个功能:

  1. zygote模式,也就是初始化zygote进程.
  2. application模式,也就是启动普通应用程序.

根据查看app_main.cpp的代码,runtime.start函数,就是要启动虚拟机了

  if (zygote) {
//zygote模式
        runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
    } else if (className) {
//app模式
        runtime.start("com.android.internal.os.RuntimeInit", args, zygote);
    } else {
        fprintf(stderr, "Error: no class name or --zygote supplied.\n");
        app_usage();
        LOG_ALWAYS_FATAL("app_process: no class name or --zygote supplied.");
    }

AndroidRuntime类

AndroidRuntime类是安卓底层系统超级重要的一个类,它负责启动虚拟机以及Java线程。AndroidRuntime类是在一个进程中只有一个实例对象,并将其保存在全局变量gCurRuntime中

start函数中主要分为两部

  1. 初始化jni
  2. 启动虚拟机
    代码:
oid AndroidRuntime::start(const char* className, const Vector<String8>& options, bool zygote)
{

    ...

    /* start the virtual machine */
//**********************************************
//                   初始化JNI
//***********************************************
    JniInvocation jni_invocation;
    jni_invocation.Init(NULL);
    JNIEnv* env;
//**********************************************
//                  启动虚拟机
//***********************************************
    if (startVm(&mJavaVM, &env, zygote) != 0) {
        return;
    }
    onVmCreated(env);
    ... 
}

startVm就是去启动虚拟机

8. Zygote fork的第一个进程——SystemServer

Zygote fork的第一个进程就是SystemServer,其在手机中的进程名为 system_server。

system_server 进程承载着整个framework的核心服务,例如创建 ActivityManagerService、PowerManagerService、DisplayManagerService、PackageManagerService、WindowManagerService、LauncherAppsService等80多个核心系统服务。这些服务以不同的线程方式存在于system_server这个进程中。

参考: https://blog.csdn.net/yiranfeng/article/details/103550262
在这里插入图片描述

在这里插入图片描述

SystemServer fork流程分析
在这里插入图片描述

  • Zygote启动后fork的第一个进程为SystemServer,在手机中的进程别名为"system_server",主要用来启动系统中的服务
  • Zygote fork后,进入SystemServer的main()
  • SystemServer在启动过程中,先初始化一些系统变量,加载类库,创建Context对象,创建- SystemServiceManager对象等候再启动服务
  • 启动的服务分为 引导服务(Boot Service)、核心服务(Core Service)和其他服务(Other Service)三大类,共90多个服务
  • SystemServer在启动服务前,会尝试与Zygote建立Socket通信,通信成功后才去启动服务
    启动的服务都单独运行在SystemServer的各自线程中,同属于SystemServer进程
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-11-17 12:52:17  更:2021-11-17 12:53:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:42:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码