Android10(Q)系统启动概述

2023-10-26


首先用一张图看一下整体的启动流程
在这里插入图片描述
因为android系统底层是基于Linux Kernel, 所以当Kernel启动后会创建init进程,init进程是Linux系统中用户空间的第一个进程(pid=1)。可以说android中的所有其他进程的共同祖先都是init

一 init进程启动

Android 10 系统中init入口函数从init.cpp 挪到了main.cpp 源码路径 system/core/init/main.cpp


int main(int argc, char** argv) {
    if (!strcmp(basename(argv[0]), "ueventd")) {
        return ueventd_main(argc, argv);
    }
 
   //参数个数大于1时,执行下面的操作
    if (argc > 1) {
        //参数为subcontext,启动日志系统,
        if (!strcmp(argv[1], "subcontext")) {
            android::base::InitLogging(argv, &android::base::KernelLogger);
            const BuiltinFunctionMap function_map;
            return SubcontextMain(argc, argv, &function_map);
        }
 
      //参数为 selinux_setup, 启动Selinux安全策略
        if (!strcmp(argv[1], "selinux_setup")) {
            return SetupSelinux(argv);
        }
      //参数为 second_stage, init进程第二阶段
        if (!strcmp(argv[1], "second_stage")) {
            return SecondStageMain(argc, argv);
        }
    }
    //init进程第一阶段
    return FirstStageMain(argc, argv);
}

二 zygote进程启动

Init进程启动后,通过解析init.rc 文件来启动zygote
/system/core/rootdir/init.rc中,通过下面的语句import zygote的rc文件,其中${ro.zygote} 是动态的,目前使用的最多的是zygote64_32。

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

当zygote进程启动后便会执行到frameworks/base/cmds/app_process/app_main.cpp的main方法

int main(int argc, char* const argv[]){
    .........
     if (!niceName.isEmpty()) {
          runtime.setArgv0(niceName.string(), true /* setProcName */);
      }
      if (zygote) {
      // 启动 ZygoteInit.java 正式进入java世界
         runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
      } else if (className) {
         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.");
      }
}

当zygote为 true时启动ZygoteInit当为false时启动RuntimeInit

三 SystemServer进程启动

Zygote fork的第一个进程就是SystemServer,进程名为 system_server,system_server 进程承载着整个framework的核心服务,例如创建 ActivityManagerService、PowerManagerService、DisplayManagerService、PackageManagerService、WindowManagerService、LauncherAppsService等80多个核心系统服务,都运行在system_server这个进程中。在ZygoteInit的forkSystemServer方法中fork出SystemServer进程

private static Runnable forkSystemServer(String abiList, String socketName,
        ZygoteServer zygoteServer) {
    ......
    ZygoteArguments parsedArgs = null;
    int pid;
    try {
        parsedArgs = new ZygoteArguments(args);
        Zygote.applyDebuggerSystemProperty(parsedArgs);
        Zygote.applyInvokeWithSystemProperty(parsedArgs);
        /* Request to fork the system server process */
        pid = Zygote.forkSystemServer(
                parsedArgs.mUid, parsedArgs.mGid,
                parsedArgs.mGids,
                parsedArgs.mRuntimeFlags,
                null,
                parsedArgs.mPermittedCapabilities,
                parsedArgs.mEffectiveCapabilities);
    } catch (IllegalArgumentException ex) {
        throw new RuntimeException(ex);
    }
 
    //进入子进程system_server
    if (pid == 0) {
        if (hasSecondZygote(abiList)) {
            //等待第二个Zygote创建完成
            waitForSecondaryZygote(socketName);  
        }
 
        // fork时会copy socket,Zygote原有的socket需要关闭
        zygoteServer.closeServerSocket();
        // 处理system server相关工作
        return handleSystemServerProcess(parsedArgs);
    }
    return null;
}

四 AMS服务启动

systemServer进程启动后会初始化系统中的各种服务包括ActivityManangerService,在AMS就绪后会启动系统桌面从而完成系统的整个启动流程

public void systemReady(final Runnable goingCallback, TimingsTraceLog 
traceLog) {
    ...
    //启动Home桌面
    mAtmInternal.startHomeOnAllDisplays(currentUserId, "systemReady");
    ...
}

后续有时间将会分章节详细分析各个阶段的启动流程

声 明:
本文为原创内容欢迎转载,请注明出处,谢谢!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android10(Q)系统启动概述 的相关文章

  • 发生存储异常。无法在firebase中上传图片

    在我能够更改图像并将其上传到 firebase 之前 这段代码就可以工作 但现在我突然收到此错误 我不知道问题是什么 public class SettingsActivity extends AppCompatActivity priva
  • 确定是否在已取得 root 权限的设备上运行

    我的应用程序具有某些功能 该功能只能在具有 root 权限的设备上运行 与其让此功能在使用时失败 然后向用户显示适当的错误消息 我更喜欢能够先默默地检查 root 是否可用 如果不可用 则首先隐藏相应的选项 有没有办法做到这一点 这是一个类
  • 在phonegap中播放本地声音

    我有一个 wav文件在我的www文件夹 我正在使用 jQuery 和以下代码 警报响起 但声音不播放 难道我做错了什么
  • 更改首选项的背景颜色

    我有一个PreferenceCategory xml 文件 我已经在其中定义了所有首选项 我从扩展的类中调用它PreferenceActivity 我无法设置设置屏幕的背景 该屏幕是在如下所示的 xml 文件的帮助下显示的 请看我已经定义了
  • Android 构建 gradle 在特定设备上失败

    我面临一个奇怪的问题 当我编译我的应用程序以在 Android 7 0 的设备上运行它时 它可以工作 但是当我尝试为 Android 4 2 1 的设备进行编译时 它会失败并出现以下错误 错误 任务 app transformClasses
  • 不使用 CookieManager 的 Android 会话 cookie

    我的应用程序进行多次网络调用以获得身份验证 我需要将此会话存储在 cookie 中 我想使用 Cookie Manager 但经过一些研究后 我发现它仅适用于 API 9 及更高版本 并且我的应用程序需要向后兼容 我使用 HTTPURLCo
  • 将寻呼机视为列表视图行项目

    我有一个包含 20 行的列表视图 我想为列表视图中的每一行设置一个视图寻呼机 由于列表视图的行中的项目可能是一个或多个 并且我想使用视图分页器显示列表视图行项目 为此 我使用以下代码 将显示在列表视图行中的自定义布局 作为分页器项目
  • 使用 POST 将数据从 Android 发送到 AppEngine Datastore

    抱歉 如果这是一个简单的问题 但我只是不知道我应该做什么 而且我认为我有点超出了我的深度 我想将数据从 Android 应用程序发送到在 Google App Engine 上运行的应用程序 数据必须从那里写入数据存储区 我的数据主要采用对
  • 安卓;在 AdapterViewFlipper 上设置输入/输出动画:未知的动画师名称翻译

    我有一些非常简单的动画 可以与 ViewFlipper 完美配合 但如果我尝试在 AdapterViewFlipper 输入 输出上设置它们 我会收到运行时错误 未知的动画师名称翻译 查看每个方法的相应方法 看起来 ViewFlipper
  • NullPointerException org.chromium.android_webview.AwContents$AwViewMethodsImpl.onDragEvent

    大约 10 天前 我的应用程序开始记录此异常 在开发控制台上看到 java lang NullPointerException at org chromium android webview AwContents AwViewMethods
  • 如何在Firebase Android应用程序中分离两个不同的用户?

    我有一个应用程序 有两种不同类型的用户 一种是教师 第二种是普通用户 如果普通会员登录 他会去normal memberActivity如果他是教师会员 他会去Teacher memberActivity 我如何在登录活动中执行此操作 我的
  • Android 在创建时出现 SQLiteException

    首先我想说我是android新手 所以如果这个问题太愚蠢我很抱歉 我正在为带有两个表的 SQLite 数据库编写一个内容提供程序 表格上是在导航抽屉活动中显示列表 第二个表格是在 ListFragment 中显示 每次启动应用程序时 我都会
  • 如何从debug.keystore文件获取MD5?

    我使用一些命令来获取 MD5 私钥debug keystore文件 但实际上我得到的是 SHA1 私钥而不是 MD5 我不知道如何获得MD5 这是我使用的命令 keytool list alias androiddebugkey keyst
  • Android 依赖项:apklib 与 aar 文件

    据我了解 apklib包含代码 共享资源Maven aar文件由以下人员分发Gradle The aar与 apklib 的主要区别在于 类被编译并包含在 aar 根目录下的classes jar 中 然而apklib不能包含已编译的类文件
  • Android - 内容值覆盖现有行

    我正在尝试使用插入值ContentValues 我已将 5 个值插入到 5 列中 运行应用程序后 我只有最后一组值的行ContentValues 前四组未插入 ContentValues cv new ContentValues cv pu
  • 使用startActivityForResult,如何获取子活动中的requestCode?

    我有四项活动 即 A B C 和 D 我的情况是A将通过startActivityForResult启动活动B startActivityForResult new Intent this B class ONE 在另一种情况下 我将使用不
  • 找不到资源矢量绘图的异常

    我将在某些设备上运行我的应用程序 其崩溃日志如下 01 04 16 54 02 206 7466 7466 com lawnmowers E AndroidRuntime FATAL EXCEPTION main Process com l
  • onTouch 给出奇怪的触摸点 Android

    我正在做的事情非常简单 我以前做过 但现在它没有按我的预期运行 无论如何 让我简要解释一下我正在尝试做什么以及我得到了什么 设想 我有一个RelativeLayout其中一个ImageView已放置 现在我设置touchlistener像这
  • 使用 eclipse 配置mockito 时出现问题。给出错误:java.lang.verifyError

    当我将我的mockito库添加到类路径中 并使用一个简单的mockito示例进行测试时 我尝试使用模拟对象为函数add返回错误的值 我得到java lang verifyerror 以下是用于测试的代码 后面是 logcat Test pu
  • SambaFileInputStream 和 FileInputStream 有什么不同?

    我需要从 samba 服务器流式传输视频 并且我使用 nanohttpd 在我的项目中创建简单的服务器 当我使用本地文件中的 fileinputstream 时 视频视图可以按设置播放视频 http localhost 8080 publi

随机推荐

  • html之实现生日快乐的效果(拿来即用)

    前端项目之生日快乐 先看效果 实际上是动画 我截的屏所以是图片 直接上代码 html部分 注意 我用的外联方式导入的css 在第十行 你可以看自己情况直接在一个页面内容上也是可以的
  • 武汉青少年计算机编程,武汉中小学生编程学校排名

    随着多年来技术的进步 编程能力变得越来越重要 为学生教授编程有很多好处 远远超出了计算机的使用范围 编程是一种技术性很强的技能 儿童在数字时代成长 编程是一种可以每天使用的技能 不仅在职场上占据优势 而且还为儿童提供了生活上的优势 少儿编程
  • 手机浏览器呼出QQ聊天窗口

    做一些手机html5网页的产品 难免会用到QQ聊天等 都知道电脑上面的网页是可以点击特殊的链接来打开电脑版本的QQ的 那手机呢 手机端其实也有的 手机浏览器点击超链接调出手机QQ聊天界面地址 lt a href mqqwpa im chat
  • 26.Nginx详解

    文章目录 一 Web服务基础介绍 1 1 互联网发展历程回顾 1 2 web服务介绍 1 2 1 Apace 早期的web服务端 1 2 1 3 Apache event模型 1 2 2 Nginx 高性能的web服务端 1 2 3 用户访
  • 语义分割算法性能比较_语义分割江湖的那些事儿——从旷视说起

    今天的主题是 Face Detection 组近两年持续在做的 Semantic Segmentation相关工作 代表性成果主要有 1 GCN CVPR2017 2 DFN CVPR2018 3 BiSeNet ECCV2018 我们先来
  • ElasticSearch 插件安装

    插件安装 head bigdesk ik analyzer head 一款H5的数据查看客户端 cd esroot bin 执行 plugin install mobz elasticsearch head bigdesk 状态查看客户端
  • 【maven】maven IDEA 设置 上传jar 包 distributionManagement

    1 概述 视频参考 https www bilibili com video BV1uz411B74T p 16
  • 明日开幕|2023 Google 谷歌开发者大会线上观看指南

    2023 Google 开发者大会 将于 9 月 6 日正式开幕 上午 9 点 30 分 主旨演讲准时上演 想要线上探索大会精彩内容 速速收下这份观看指南 即刻扫描二维码前往官网 明天上午 9 点 30 分线上见 知乎官网二维码 明天上午
  • HttpClient Post 二进制/字节流/byte[]

    HttpClient 3 x public class HttpHelper String m url HttpClient m HttpClient public HttpHelper String url m url url m Htt
  • 带环的单链表

    前面一篇文章介绍了单链表的一些基础操作 本文接着来看一些有环的单链表的操作 判断单链表是否存在环 求环的入口节点 环的长度 看以下程序 链表类 class LinkQueue Entry head new Entry 节点类 用于节点初始化
  • topaz全家桶_每个设计师都该拥有的设计辅助神器:全新Topaz2020全家桶送给你

    每个设计师都该拥有的设计辅助神器 全新Topaz2020全家桶送给你 领取方式见文章末尾 2020年 人工智能已经渗透到各个行业 今天资源君给伙伴们带来一整套人工智能软件全家桶 这套 Topaz2020全家桶 拥有强大的图片和视频编辑功能
  • linux下网速测试

    linux下网速测试 speedtest 是一个知名的网速测试工具 它是用 Python 写成的 可以使用 apt 或 pip 命令来安装 安装 sudo apt install speedtest cli 或者 pip3 install
  • C语言:利用指针编写程序,统计输入的字符串中大写字母、小写字母和数字字符的数量

    题目来源 大工慕课 链接 作者 Caleb Sung 题目要求 利用指针编写程序 统计输入的字符串中大写字母 小写字母和数字字符的数量 参考代码 include
  • Google Mock

    源码分析 通过 Google Mock Gmock 简单使用和源码分析 简单使用 中的例子 我们发现被mock的相关方法在mock类中已经被重新实现了 否则它们也不会按照我们的期待的行为执行 我们通过阅读源码 来分析整个过程的实现逻辑 转载
  • 输入一个整数n,输出数列1+1/3+1/5+……前n项的和。

    include
  • React 学习笔记目录

    学习使用的开发工具 编译器 VSCode 开发语言工具 TypeScript JavaScript 重要程度分类 一般 这个程度的知识点主要是达到熟练掌握即可 不用太深入研究和学习 重要 这个程度的知识点主要是达到熟练掌握 并且内部的原理切
  • 2核4G云服务器可以支持多少个网站数量?多维度权衡

    2核4G服务器可以安装多少个网站 阿腾云2核4G5M带宽服务器目前安装了14个网站 从技术角度是没有限制的 只要云服务器性能够用 想安装几个网站就安装几个网站 但是从公网带宽和CPU计算性能方面考虑 要计算网站访问量并发数 阿腾云来详细说下
  • 第七章——数据挖掘(1)

    一 数据挖掘的概述 1 数据挖掘概念与发展 随着科学技术的飞速发展 使得各个领域或组织机构积累了大量数据 如何从这些数据中提取有用的信息和知识以帮助做出明智决策成为巨大的挑战 计算机技术的迅速发展使得处理并分析这些数据成为可能 这种技术就是
  • 一个简易的区块链demo

    别人写的python版本 python版本源码地址 https github com dvf blockchain installation 环境准备 我使用的是ubuntu 16 04 其它linux版本也可以 需要安装python3 6
  • Android10(Q)系统启动概述

    Android10系统启动概述 一 init进程启动 二 zygote进程启动 三 SystemServer进程启动 四 AMS服务启动 首先用一张图看一下整体的启动流程 因为android系统底层是基于Linux Kernel 所以当Ke