Android Framework分析SystemServer进程

42 篇文章 1 订阅

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凉亭下

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值