zoukankan      html  css  js  c++  java
  • Android启动流程(一)

    Android 的启动流程

    话不多说 上图

    内核里面第一个进程 idle 进程 又叫做Swapper进程 PID = 0

    Kthread 进程 相当于内核的鼻祖

    init 进程 启动 用户空间的鼻祖

    zygote java 进程鼻祖

    SystemServer zygote 的大儿子

    SystemServer 又会启动很多服务, 90多个, 我们很多服务都在SystemServer进程中

    SystemServer通过AMS 在zygote 出app进程

    进程启动方式 fork

    线程启动 new Thread

    在内核中没有进程和线程之分

    init 进程的启动

    kernel/common/init/main.c -> kernel_init

    init的入口函数 -》 main.cpp

    init.rc脚本文件 按照init.rc 的内容去执行

    first_state_main

    • 主要做一些 挂载/ 创建 一些文件
    • 重定向 输入 输出 error
    • 初始化 内核的日志打印
    • 启动 selinux_setup

    SelinuxSetup

    • SetupSelunx linux这块的安全策略 --- Android ---- 权限 最小权限原则

    second_stage_main

    • PropertyInit(); --- 初始化属性域

      • 处理子进程终止信号 --- 僵尸进程
        • InstallSignalFdHandler(&epoll);
        • InstallInitNotifier(&epoll);
        • StartPropertyService(&property_fd);
      • GetBultinFunctionmap () 匹配命令和函数之间的关系
    • LoadBootScripts() 解析init.rc

      • --> CreateParser : parser
        • parser.AddSectionParser("server" , xxxx);
        • parser.AddSectionParser("on" , xxxx);
        • parser.AddSectionParser("import" , xxxx);
      • parser.ParseConfig("/system/etc/init/hw/init.rc"); // 解析 init.rc
        • parserConfigDir();
          • parseConfigFile();
            • ParseData() 解析init 文件
    • 进入while 循环 ---- 等待

      • auto pending_function = epoll.Wait(epoll_timeout);

    小结:

    init处理的重要事情:

    1. 挂载文件
    2. 设置 seLinux -- 安全策略
    3. 开始属性服务 注册到 epoll中
    4. 解析 init.rc
    5. 循环处理脚本文件 -- 启动 zygote
    6. 循环等待

    输入输出

    stdio --

    Linux 一切皆文件

    system.out.println(); 把这句话写到文件夹中(dev/nulll 管道文件夹)

    zygote 进程启动

    孵化器 最重要的作用 有一部分在nitive 一部分在java

    zygote 第一个进入Java的。

    init.rc

    • zygotr_start
    • start zygote

    启动 zygote

    init.zygote.32

    init.zygote.64

    frameworks/base/cmds/app_process/Android.bp -- app_main.cpp

    zygote ---> 进入 native 层

    class AppRuntime : public AndroidRuntime

    通过 传入参数 启动 zygote 和 systemserver

    frameworks/base/core/jni/AndroidRuntime.cpp.start

    runtime.start("com.android..insternall.os.ZygoreInit", args, zygote);

    ​ -->startVm 启动 虚拟机

    ​ -->startReg 注册JNI 建立 Java 方法 和 native 方法 管理起来

    ​ -->env - CallStaticVoidMethod(startClass, startMeth, startArray)

    jni java 和 nitive 相互调用

    zygote 的 java启动

    • preload (bootTimingTraceLog); // 预加载 提高进程的启动速度

      • 类 system/etc/preloaded-classes 里面的类
      • 资源 com.android.internal.R.xxx base/res/res/
      • image-20211215214951714
    • zygoteServer = new zygoteServer(isPrimaryZygote); // socket AMS 和其连接 为什么不用 binder ,binder多线程 fock 出现死锁

    • Runnable r = forkSystemServer // 启动 systemserver进程

    • caller = zygoteServer.runSelectLoop(abiList) // 死循环 接受 AMS 传过来的消息

    zygote 小结

    native java 需要环境

    • 初始化运行时环境 创建 JVM
    • 注册 jni
    • 调用 zygoteinit.main 进入 java层

    java

    • 预加载 加快进程创建速度
    • socket 让别人通知我
    • 循环等待 AMS 等别的服务的消息

  • 相关阅读:
    初涉echarts图表笔记。
    es6----数组去重(简单类型和引用类型)
    git pull 拉取更新失败解决方案
    javascript----是否下拉到页面底部
    构造函数和析构函数
    派生类和基类
    C++11新标准
    类型转换
    编码
    牛牛的背包问题
  • 原文地址:https://www.cnblogs.com/AronJudge/p/15699104.html
Copyright © 2011-2022 走看看