Android Framework分析SystemServer进程

这篇具有很好参考价值的文章主要介绍了Android Framework分析SystemServer进程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

Android Framework分析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文章来源地址https://www.toymoban.com/news/detail-486000.html

到了这里,关于Android Framework分析SystemServer进程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Android Framework系列】第3章 Zygote进程相关

    Zygote是Android中最重要的一个进程, Zygote进程和Init进程、SystemServer进程是Android最重要的三大进程 。 Zygote是Android系统创建新进程的核心进程,负责启动Dalvik虚拟机,加载一些必要的系统资源和系统类,启动system_server进程,随后进入等待处理app应用请求。 在Android系统中,应用

    2024年02月11日
    浏览(47)
  • android framework之Applicataion启动流程分析

    Application启动流程框架分析 启动方式一:通过Launcher启动app 启动方式二:在某一个app里启动第二个app的Activity. 以上两种方式均可触发app进程的启动。但无论哪种方式,最终通过通过调用AMS的startActivity()来启动application的。    根据上图分析, 要启动一个Application,需要涉及五

    2024年02月11日
    浏览(46)
  • Android9.0 系统Framework发送通知流程分析

      在android 9.0的系统rom定制化开发中,在systemui中一个重要的内容就是系统通知的展示,在状态栏展示系统发送通知的图标,而在 系统下拉通知栏中展示接收到的系统发送过来的通知,所以说对系统framework中发送通知的流程分析很重要,接下来就来分析下系统 通知从framework到

    2024年02月02日
    浏览(44)
  • 【Android Framework系列】第11章 LayoutInflater源码分析

    本章节我们主要目目的是了解 Activity 的 xml 布局解析、对 LayoutInfater 源码进行分析。 我们知道Android界面上的每一个控件都是一个个 View ,但是Android也提供了通过 xml 文件来进行布局控制,那么 xml 布局文件如何转成最终的 View 的呢?转换利器就是 LayoutInflater 。在分析 Layout

    2024年02月12日
    浏览(43)
  • Android framework学习指南之Launcher启动过程原理分析

    Launcher是一个用来显示系统中已经安装的应用程序的应用程序,Launcher 在启动过程中会请求PackageManagerService 返回系统中已经安装的应用程序的信息,并将这些信息封装成一个快捷图标列表显示在系统屏幕上,这样用户可以通过点击这些快捷图标来启动相应的应用程序,它的作

    2024年02月03日
    浏览(50)
  • Android13冻结进程分析:如何提高设备性能和用户体验

    本文介绍了Android13中的冻结进程功能,它是一种重要的资源管理策略,可以提高系统性能和稳定性,同时最大限度地节省设备的资源和电池消耗。 文章讨论了如何合理分配资源,包括CPU、内存等,以提高设备性能和用户体验。此外,文章还提到了冻结进程对应用程序线程的影

    2024年02月14日
    浏览(51)
  • Android Framework层开发

    查看源码工具: SourceInsight Instrumentation :可以理解为ActivityThread的一个工具类,在ActivityThread中初始化,一个进程只存在一个Instrumentation对象,在每个Activity初始化时,会通过Activity的Attach方法,将该引用传递给Activity。Activity所有生命周期的方法都有该类来执行。 Init进程(pi

    2024年02月04日
    浏览(45)
  • 【Android】Android Framework系列---CarPower电源管理

    智能座舱通常包括中控系统、仪表系统、IVI系统 、后排娱乐、HUD、车联网等。这些系统需要由汽车电源进行供电。由于汽车自身的特殊供电环境(相比手机方便的充电环境,汽车的蓄电池如果没有电是需要专业人士操作的),其电源状态会比较复杂,既要满足车内的座舱系统

    2024年02月07日
    浏览(47)
  • Android Framework基础面试篇~

    在Android应用开发面试中,针对Framework的问题是常被考察的。以下是一些常见的Framework金典面试题目及其详解: 1. 什么是Android应用生命周期?你能描述一下它包含哪几个阶段吗? Android应用生命周期指的是应用从启动到关闭的整个过程。 它包括以下四个阶段: onCreate(创建)

    2024年02月10日
    浏览(47)
  • 【Android Framework (八) 】- Service

    1,挂载文件系统,创建文件目录 调用selinux_setup权限安全相关 2,初始化内存空间 初始化属性服务 创建Epoll 注册监听子进程重启异常操作等,对子进程进行线程守护 3,startPropertyServic 开启属性服务 进行监听 4,LoadBootScripts 加载init.rc文件 进行解析 调用do_class_start 文件开启

    2024年02月01日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包