Android Framework分析SystemServer进程

news2024/11/25 10:26:31

SystemServer进程是Android系统的核心进程,运行在Android系统启动后,负责管理和加载系统服务。本文将介绍SystemServer进程的详细结构和工作原理,并使用代码注释的方式阐述其关键部分代码。

在这里插入图片描述

结构:

SystemServer进程的核心是SystemServer类,它是Android系统启动后的第一个Java进程。SystemServer类负责启动系统的各种服务,它通过Binder机制提供各种服务接口。下面是SystemServer类的结构:

public final class SystemServer {
    private static final String TAG = "SystemServer";
    private static final boolean DEBUG_LISTENER = false;
    private static final boolean DEBUG_PRIORITY = false;
    private static final String ANSI_RED_BACKGROUND = "\u001B[31;40m";
    private static final String ANSI_RESET = "\u001B[0m";
    ...
    public static void main(String[] args) {
        ...
        Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "InitBeforeStartServices");
        SystemServer systemServer = null;
        try {
            //创建systemServer实例
            systemServer = new SystemServer();
            //启动系统服务
            systemServer.run();
        } catch (Throwable ex) {
            Log.e("System", "******************************************");
            Log.e("System", "************ Failure starting system services", ex);
            System.exit(10);
        } finally {
            Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
        }
    }

    //启动各种系统服务的方法
    private void run() {
        ...
        startCoreServices();
        startOtherServices();
        startBootstrapServices();
        ...
    }

    //启动核心服务的方法
    private void startCoreServices() {
        ...
    }

    //启动其他服务的方法
    private void startOtherServices() {
        ...
    }

    //启动引导服务的方法
    private void startBootstrapServices() {
        ...
    }
    ...
}

如上所示,SystemServer主要由三个部分组成:main()方法、启动各种系统服务的run()方法,以及三个启动服务的方法:startCoreServices()、startOtherServices()和startBootstrapServices()。下面将详细解释每一个部分的作用。

main()方法:

main()方法是SystemServer进程的入口。它调用run()方法启动系统服务。下面是SystemServer进程的main()方法的结构:

public static void main(String[] args) {
    ...
    SystemServer systemServer = new SystemServer();
    systemServer.run();
}

如上所示,SystemServer的“main”方法只是简单地创建了SystemServer的实例,并调用了“run”方法。

run()方法:

run()方法是启动各种系统服务的主要方法。它调用了三个方法以启动核心服务、其他服务和引导服务。下面是SystemServer的“run”方法的结构:

private void run() {
    startCoreServices();
    startOtherServices();
    startBootstrapServices();
}

如上所示,在“run”方法中,首先调用“startCoreServices”方法以启动核心服务,接着调用“startOtherServices”方法以启动其他服务,最后调用“startBootstrapServices”方法以启动引导服务。

startCoreServices()方法:

startCoreServices()方法负责启动Android系统中的核心服务,例如属性服务、电源服务、USB服务、Vibrator服务等。下面是SystemServer的“startCoreServices”方法的结构:

private void startCoreServices() {
    ...
    //启动属性服务
    Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "InitializeSystemProperties");
    SystemProperties.init();
    Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);

    //启动电源服务
    Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "StartPowerManagerService");
    power = powerManagerService;
    powerManagerService.setPolicy((WindowManagerPolicy) policy);
    Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);

    //启动USB服务
    Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "StartUsbService");
    UsbService usb = new UsbService(context);
    ServiceManager.addService(Context.USB_SERVICE, usb);
    Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);

    //启动Vibrator服务
    Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "StartVibratorService");
    vibrator = new VibratorService(context);
    ServiceManager.addService(Context.VIBRATOR_SERVICE, vibrator);
    Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);

    //启动下载服务
    Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "StartDownloadService");
    ServiceManager.addService(Context.DOWNLOAD_SERVICE, new DownloadManagerService(context));
    Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
    ...
}

如上所示,“startCoreServices”方法分别启动了系统属性服务、电源服务、USB服务、Vibrator服务、下载服务等。它主要是通过调用ServiceManager.addService()方法以将这些服务添加到系统服务列表中。

startOtherServices()方法:

startOtherServices()方法负责启动其他系统服务,例如媒体服务、网络服务、位置服务等。下面是SystemServer的“startOtherServices”方法的结构:

private void startOtherServices() {
    ...
    //启动媒体服务
    Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "StartMediaServer");
    media = new MediaServer(context);
    ServiceManager.addService(Context.MEDIA_ROUTER_SERVICE, media.getMediaRouter());
    Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);

    //启动网络服务
    Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "StartNetworkManagementService");
    try {
        final NetworkManagementService nmService = NetworkManagementService.create(context);
        ServiceManager.addService(Context.NETWORKMANAGEMENT_SERVICE, nmService);
    } catch (Throwable e) {
        reportWtf("starting NetworkManagementService", e);
    }
    Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);

    //启动位置服务
    Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "StartLocationManagerService");
    locationManagerService = new LocationManagerService(context);
    ServiceManager.addService(Context.LOCATION_SERVICE, locationManagerService);
    Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
    ...
}

如上所示,“startOtherServices”方法依次启动了媒体服务、网络服务和位置服务。它们主要是通过调用ServiceManager.addService()方法以将这些服务添加到系统服务列表中。

startBootstrapServices()方法:

startBootstrapServices()方法负责启动引导服务,例如重命名文件系统、格式化data分区等。下面是SystemServer的“startBootstrapServices”方法的结构:

private void startBootstrapServices() {
    //重命名文件系统
    if (!mRuntimeRestart) {
        Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "RenameFilesystem");
        ZygoteInit.renameAndRemoveOldUserSystemDirs();
        Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
    }

    //格式化data分区
    Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "StartBootstrapServices");
    Intent intent = new Intent(Intent.ACTION_PRE_BOOT_COMPLETED);
    intent.addFlags(Intent.FLAG_RECEIVER_NO_ABORT);
    intent.setPackage("android");
    context.sendBroadcastAsUser(intent, UserHandle.ALL);
    Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
}

如上所示,“startBootstrapServices”方法重命名了文件系统并格式化了data分区。它们主要是通过调用ZygoteInit.renameAndRemoveOldUserSystemDirs()方法和发送一个广播以让系统前台服务启动。

在实际开发中,我们要深入分析SystemServer进程的代码实现,掌握其启动和管理系统服务的原理,对于优化和改进Android系统具有重要意义。此外,我们也可以借鉴SystemServer进程的设计思路,提高自己的代码实现水平。

参考资料:

  1. Android Framework源码:https://cs.android.com/android/platform/superproject/

  2. Android Developers官方文档:https://developer.android.com/docs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/651949.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SSH基本概念,带你了解SSH

1、SSH基本概念 SSH(Secure Shell)是一种网络协议,用于在不安全的网络中安全地传输数据。它是一种加密协议,可以保护数据在传输过程中不被窃取、篡改或伪造。SSH协议最初是由芬兰的Tatu Ylonen开发的,现在已经成为了一…

Hadoop集群之模板虚拟机的安装

Hadoop集群之模板虚拟机的安装 文章目录 Hadoop集群之模板虚拟机的安装0. 写在前面1. CentOS的安装1.1 配置电脑1.1.1 进入VMware1.1.2 自定义新的虚拟机1.1.3 解决虚拟机的兼容性1.1.4 选择当前虚拟机的操作系统1.1.5 选择虚拟机将来需要安装的系统1.1.6 电脑的具体配置1.1.7 …

KUKA机器人通过示教器进行关机冷启动的具体方法演示

KUKA机器人通过示教器进行关机冷启动的具体方法演示 如下图所示,首先需要登录管理员权限,默认密码:KUKA,然后点击左上角的机器人图标进行菜单选项,找到并点击“关机”选项, 如下图所示,找到并点击“重新启动控制系统PC”, 如下图所示,此时系统提示:确实要重新启动…

chatgpt赋能python:Python生成序列的方法详解

Python生成序列的方法详解 在Python编程中,序列(Sequence)是常用的数据类型之一。序列是有序的,可以通过下标访问其中的元素。Python中有多种方法可以生成序列,下面将对常用的几种方法进行详细介绍。 利用range函数生…

2023-06-16 Android Studio 使用CMakeList编译JNI ,最简单的demo源码

一、代码结构图,代码路径https://download.csdn.net/download/qq_37858386/87913001 二、cmakedemo\app\build.gradle 加下面的代码 externalNativeBuild {cmake {cppFlags "-frtti -fexceptions"}}externalNativeBuild {cmake {path src/main/jni/CMakeL…

国内大模型研究

自从chatgpt发布以来,国内大模型发展非常迅速。我对这项目技术也保持了非常多的持续关注,我一直认识,chatGPT以及其他GPT会给社会带来更大的变革。经过专业训练的大模型可以替代部分客服,部分程序员,部分美工&#xff…

Vue全家桶实战 从零独立开发企业级电商系统(免费升级Vue3.0)

Vue全家桶高仿小米商城–项目简介 文章目录 Vue全家桶高仿小米商城--项目简介电商项目选型--小米商城的页面流程:业务开发流程:项目内容:商城组件部分:课程所包含的知识图谱:章节介绍: 商城的界面展示&…

基于web漏洞扫描及分析系统设计_kaic

基于web漏洞扫描及分析系统设计 摘 要 随着信息技术的发展和网络应用在我国的普及,针对我国境内信息系统的恶意网络攻击也越来越多,并且随着黑客攻击技术的不断地更新,网络犯罪行为变得越来越难以应对,用户日常访问的网站是否安全…

【八大排序(六)】快排终极篇-快速排序非递归版

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:八大排序专栏⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习排序知识   🔝🔝 快排非递归版 1. 前情回顾2. 快排非递归基…

A100 GPU服务器安装CUDNN教程

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

从Window中先多瞥几眼

JavaFx17官方文档中有如下的描述: Window类是一个顶层窗口类,在其中可以承载场景,并与用户交互。窗口可以是Stage、PopupWindow或其他类似的顶层窗口。 JavaFX Stage类是顶级的JavaFX容器。初级阶段由平台搭建。其他Stage对象可以由应用程序构造。 许多Stage属性是只读的…

chatgpt赋能python:Python入门:如何添加Seaborn库

Python入门:如何添加Seaborn库 Python是一种易于学习的、功能强大的编程语言,在数据分析和科学计算方面尤其闻名。Seaborn是一个建立在Matplotlib之上的Python可视化库,它提供了一组简单易用的界面,用于绘制优美的统计图形——包…

几个Caller-特性的妙用

System.Runtime.CompilerServices命名空间下有4个以“Caller”为前缀命名的Attribute,我们可以将它标注到方法参数上自动获取当前调用上下文的信息,比如当前的方法名、某个参数的表达式、当前源文件的路径,以及当前代码在源文件中的行号。 一…

RedisSon高并发分布式锁实战RedisSon源码解读

Redis高并发分布式锁实战 1.分布式场景下的synchronized失效的问题–用redis实现分布式锁 synchronized是通过monitor实现的jvm级别的锁,如果是分布式系统,跑在不同的虚拟机上的tomcat上,会导致synchronized无法锁住对象 ----------- 需要分…

读数据压缩入门笔记05_字典转换

1. 瓶颈 1.1. 在网络带宽有限、存储昂贵的时期 1.2. 移动设备正日益成为人们访问互联网的首选的今天 1.3. 数据压缩成了缓解这些瓶颈的关键 2. 字典转换 2.1. dictionary transforms 2.2. 完全改变了人们对数据压缩的认知 2.2.1. 压缩变成了一种对各种类型的数据都有用的…

《C和指针》读书笔记(第十一章 动态内存分配)

目录 0 简介1 为什么使用动态内存分配2 malloc和free3 calloc和realloc4 使用动态分配的内存5 常见的动态内存错误6 内存分配实例6.1 排序一列整型值6.2 复制字符串6.3 变体记录的创建与销毁 7 总结 0 简介 在实际开发中(C语言),数组的元素存…

JDK,JRE,JVM有什么区别?跨平台?跨语言?

JDK Java Development Kit(Java开发工具包),提供了Java的开发环境和运行环境。包含Java源文件的编译器Javac,还有调试和分析工具。 JRE Java Runtime Environment(Java运行环境)包含了Java虚拟机&#xff…

WPF开发txt阅读器10:语音播报快进快退

文章目录 MySpeech类快进 文章目录 MySpeech类快进 txt阅读器系列: 需求分析和文件读写目录提取类💎列表控件与目录字体控件绑定💎前景/背景颜色书籍管理系统💎用树形图管理书籍语音播放💎播放进度显示 MySpeech类 …

MySQL 中有哪些锁?

数据库中锁的设计初衷处理并发问题,作为多用户共享资源,当出现并发访问的时候,数据库需要合理控制资源访问规则。锁就是实现这些访问规则中的重要数据。 锁的分类 根据加锁范围,MySQL 里面的锁可以分成全局锁、表级锁、行锁三类…

计算机视觉算法——BEV Perception算法总结

计算机视觉算法——BEV Perception算法总结 计算机视觉算法——BEV Perception算法总结1. Homograph Based——3D LaneNet2. Depth Based——LSS3. MLP Based——PON4. Transformer Based——BEVFormer5. Transformer Based——Translating Image into Maps 计算机视觉算法——…