Android开机流程-重新梳理

最近回顾的一些知识,补充了一下。

源码标准:API : 29「Android 10.0」

android手机是怎么开机的?

android 的底层是 linux kernel「内核」,由 BootLoader「系统启动加载器」 负责加载(类似于计算机的BIOS系统)。

/bootable/recovery/bootloader.h

首先启动 init「父进程,第一个进程」进程,接着运行init.rc脚本,脚本文件有个命令启动了Zygote进程,初始化时会启动虚拟机。

/system/core/rootdir/init.zygote.rc

Android开机流程-重新梳理

Zygote进程fork出SystemServer进程,然后会调用SystemServer.main()方法。

/frameworks/base/services/java/com/android/server/SystemService.java

/** The main entry point from zygote.*/
public static void main(String[] args) {
    new SystemServer().run();
}

run方法中,主要是在进程中启动系统的各项服务,比如ActivityManagerService,PackageManagerService,WindowManagerService服务等。

private void run() {
    //创建主线程Looper、ActivityThread、SystemContext
    android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_FOREGROUND);
    Looper.prepareMainLooper();

    // Initialize native services.

    System.loadLibrary("android_servers");
    // Initialize the system context.

    createSystemContext();

    // Create the system service manager.

    mSystemServiceManager = new SystemServiceManager(mSystemContext);
    mSystemServiceManager.setStartInfo(mRuntimeRestart,mRuntimeStartElapsedTime, mRuntimeStartUptime);
    LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
    // 并行线程池
    SystemServerInitThreadPool.get();

    // Start services.

    traceBeginAndSlog("StartServices");
    startBootstrapServices();
    startCoreServices();
    startOtherServices();

    // Loop forever.

    Looper.loop();
}

下面是一些主要的初始化方法。

/**
 * 这些服务具有复杂的相互依赖关系,所以需要放一起全部初始化
 */
private void startBootstrapServices() {
    // Start the watchdog as early as possible so we can crash the system server
    final Watchdog watchdog = Watchdog.getInstance();
    watchdog.start();

    //启动AMS
    ActivityTaskManagerService atm = mSystemServiceManager.startService(
                ActivityTaskManagerService.Lifecycle.class).getService();
    mActivityManagerService = ActivityManagerService.Lifecycle.startService(
                mSystemServiceManager, atm);

    //电源管理器需要提前启动,因为其他服务需要它
    mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);

    // Start the package manager.

    mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
                    mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);

    //设置Application实例并开始
    mActivityManagerService.setSystemProcess();

    //使用 ActivityManager 实例完成看门狗设置并监听重启
    watchdog.init(context, mActivityManagerService);
}

真正启动是在ActivityManagerService的中systemReady方法,调用resumeTopActivityLocked打开锁屏界面。

/**
 * Starts a miscellaneous grab bag of stuff that has yet to be refactored and organized.

 */
private void startOtherServices() {
    //启动WMS
    wm = WindowManagerService.main();
    mActivityManagerService.setWindowManager(wm);

    //WMS 显示默认启动消息
    ActivityManagerNative.getDefault().showBootMessage();
    //开始启动初始应用程序
    mActivityManagerService.systemReady(new Runnable(){
        //SystemUI
        startSystemUi(context, windowManagerF);
    });
}

/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

/** 通过StackSupervisor运行所有 ActivityStacks */
final ActivityStackSupervisor mStackSupervisor;

public void systemReady(final Runnable goingCallback, TimingsTraceLog traceLog) {
    mStackSupervisor.resumeFocusedStackTopActivityLocked();
}

到这里,android的开机流程结束。

Original: https://www.cnblogs.com/LiuZhen/p/15878702.html
Author: 翻滚的咸鱼
Title: Android开机流程-重新梳理

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/580337/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 教学日志:javaSE-面向对象1

    对象,类,属性,方法的理解 package com.tengxun.class6.oop1; /** * @Auther: Yu Panpan * @Date: 2021/12/7…

    Java 2023年6月5日
    0100
  • 面试官:Java中对象都存放在堆中吗?你知道逃逸分析?

    面试官:Java虚拟机的内存分为哪几个区域? 我(微笑着):程序计数器、虚拟机栈、本地方法栈、堆、方法区 面试官:对象一般存放在哪个区域? 我:堆。 面试官:对象都存放在堆中吗? …

    Java 2023年6月7日
    074
  • Redis常见使用场景

    Redis常见使用场景,缓存、数据共享分布式、分布式锁、全局 ID、计数器、限流、位统计、购物车、时间线 Timeline、消息队列、抽奖、点赞、签到、打卡、商品标签、商品筛选、用…

    Java 2023年6月8日
    0113
  • spring相关面试题

    1、spring有依赖的bean,怎么加载? 2、spring怎么解决循环依赖? https://blog.csdn.net/u010853261/article/details/…

    Java 2023年5月30日
    078
  • count(1)比count(*)效率高?

    SELECT COUNT(*) FROM table_name是个再常见不过的统计需求了。本文带你了解下 Mysql的 COUNT函数。 一、 COUNT 函数 关于 COUNT函…

    Java 2023年6月6日
    081
  • 链表相加_2_445

    给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。你可以…

    Java 2023年6月5日
    078
  • 设计模式之行为型模式-访问者模式

    访问者模式(Visitor Pattern) 一、 介绍 模式定义:封装一些作用于某种数据结构中的各元素的操作,它可以在 不改变数据结构的前提下定义作用于这些元素的 新的操作。 意…

    Java 2023年6月7日
    084
  • springboot的@ConditionalOnBean注解

    上篇文章中分析了springboot的自动注入的原理,可在文章后面的推荐阅读中温习哦。在自动注入的原理那篇文章中提到了@ConditionalOnXX注解,今天来看下springb…

    Java 2023年6月9日
    076
  • 在PDF指定位置添加数据

    第一种方案 使用itext填充静态PDF模板 然后生成PDF新文件 1 使用Adobe Acrobat 编辑原PDF 添加文本域 itext依赖 com.itextpdf itex…

    Java 2023年6月8日
    078
  • Java你可能不知道的事(3)HashMap

    概述 HashMap对于做Java的小伙伴来说太熟悉了。估计你们每天都在使用它。它为什么叫做HashMap?它的内部是怎么实现的呢?为什么我们使用的时候很多情况都是用String作…

    Java 2023年6月13日
    0108
  • 代码审计(2)

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/rayob1/p/16360098.htmlAuthor…

    Java 2023年6月6日
    074
  • Spring Ioc源码分析系列–前言

    Spring Ioc源码分析系列–前言 为什么要写这个系列文章 首先这是我个人很久之前的一个计划,拖了很久没有实施,现在算是填坑了。其次,作为一个Java开发者,Spr…

    Java 2023年6月8日
    082
  • 如何使用Spark ALS实现协同过滤

    如何使用Spark ALS实现协同过滤 posted @2017-10-12 18:12 花弄影 阅读(605 ) 评论() 编辑 Original: https://www.cn…

    Java 2023年6月16日
    071
  • RocketMQ: RemotingConnectException: connect to <null> failed

    autoCreateTopicEnable = true start mqbroker.cmd -n 192.168.1.102:9876 autoCreateTopicEnabl…

    Java 2023年5月30日
    070
  • SpringBoot扩展配置

    一、配置随机数 RandomValuePropertySource可以用于注入随机数,它支持integer、long、uuid、string。 my.secret=${random…

    Java 2023年5月30日
    066
  • Java基础语法01——变量与运算符

    Java基础语法01——变量与运算符 本文是对Java基础语法的第一部分的学习,包括注释;标识符的命名规则与规范;变量的数据类型分类以及转换;以及六种运算符(算术、赋值、比较、逻辑…

    Java 2023年6月5日
    077
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球