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 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android10(Q)系统启动概述 -> 正文阅读

[移动开发]Android10(Q)系统启动概述


首先用一张图看一下整体的启动流程
在这里插入图片描述
因为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");
    ...
}

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

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

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-08-16 11:52:22  更:2021-08-16 11:52:32 
 
开发: 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/23 10:48:02-

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