Android SystemServer 中 Service 的创建和启动流程

 更新时间:2025年08月20日 09:41:37   作者:林寻星辰  
在 Android 系统中,SystemServer是系统服务的核心进程,负责启动和管理各种系统服务,下面给大家介绍Android SystemServer中Service 的创建和启动流程,感兴趣的朋友跟随小编一起看看吧

今天导师给我将讲了一些如何新建一个系统服务,以及如何去初始化。

Android SystemServer 中 Service 的创建和启动方式

在 Android 系统中,SystemServer 是系统服务的核心进程,负责启动和管理各种系统服务。以下是 SystemServer 中服务创建和启动的详细方式:

1. SystemServer 概述

SystemServer 是 Android 系统启动过程中的关键组件,它运行在 system_server 进程中,负责启动和管理所有核心系统服务。

2. 服务启动流程

2.1 主要启动阶段

SystemServer 的服务启动分为几个主要阶段:

// frameworks/base/services/java/com/android/server/SystemServer.java
private void run() {
    // 1. 启动引导服务 (Bootstrap Services)
    startBootstrapServices();
    // 2. 启动核心服务 (Core Services)
    startCoreServices();
    // 3. 启动其他服务 (Other Services)
    startOtherServices();
    // 4. 系统就绪后的回调
    startSystemUi(context);
    systemReady();
}

2.2 引导服务启动

// frameworks/base/services/java/com/android/server/SystemServer.java
private void startBootstrapServices() {
    // 启动 ActivityManagerService
    mActivityManagerService = ActivityManagerService.Lifecycle.startService(
        mSystemServiceManager, atm);
    mActivityManagerService.setSystemProcess();
    // 启动 PowerManagerService
    mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);
    // 启动 PackageManagerService
    mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
        mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
    // 更多引导服务...
}

2.3 核心服务启动

private void startCoreServices() {
    // 启动 BatteryService
    mSystemServiceManager.startService(BatteryService.class);
    // 启动 UsageStatsService
    mSystemServiceManager.startService(UsageStatsService.class);
    mActivityManagerService.setUsageStatsManager(
        LocalServices.getService(UsageStatsManagerInternal.class));
    // 启动 WebViewUpdateService
    mWebViewUpdateService = mSystemServiceManager.startService(WebViewUpdateService.class);
    // 更多核心服务...
}

2.4 其他服务启动

private void startOtherServices() {
    // 启动 WindowManagerService
    wm = WindowManagerService.main(context, inputManager, !mFirstBoot, mOnlyCore,
            new PhoneWindowManager(), mActivityManagerService.mActivityTaskManager);
    ServiceManager.addService(Context.WINDOW_SERVICE, wm, /* allowIsolated= */ false);
    ServiceManager.addService(Context.INPUT_SERVICE, inputManager);
    // 启动 NotificationManagerService
    mSystemServiceManager.startService(NotificationManagerService.class);
    // 启动自定义服务(如你的 MDM 服务)
    try {
        traceBeginAndSlog("StartMdmPolicyManager");
        mdmPolicyManager = new MdmPolicyManagerService(context);
        ServiceManager.addService(Context.MDM_POLICY_SERVICE, mdmPolicyManager);
        traceEnd();
    } catch (Throwable e) {
        reportWtf("starting Mdm Policy Manager", e);
    }
    // 更多其他服务...
}

3. 服务创建方式

3.1 使用 SystemServiceManager 启动

这是推荐的方式,适用于继承自 SystemService 的服务:

// 在 SystemServer 中
mSystemServiceManager.startService(YourService.class);
// 服务类定义
public class YourService extends SystemService {
    public YourService(Context context) {
        super(context);
    }
    @Override
    public void onStart() {
        // 服务启动逻辑
        publishBinderService(Context.YOUR_SERVICE, new YourBinder());
    }
    @Override
    public void onBootPhase(int phase) {
        if (phase == SystemService.PHASE_BOOT_COMPLETED) {
            // 启动完成后的操作
        }
    }
}

3.2 直接实例化并注册

对于不继承 SystemService 的服务:

// 创建服务实例
YourService yourService = new YourService(context);
// 添加到 ServiceManager
ServiceManager.addService(Context.YOUR_SERVICE, yourService);
// 或者使用带权限的添加方式
ServiceManager.addService(Context.YOUR_SERVICE, yourService, 
    false, ServiceManager.DUMP_FLAG_PRIORITY_DEFAULT);

3.3 使用静态 main 方法

某些服务有静态的 main() 方法:

// 服务类中的静态方法
public static YourService main(Context context) {
    YourService service = new YourService(context);
    ServiceManager.addService(Context.YOUR_SERVICE, service);
    return service;
}
// 在 SystemServer 中调用
YourService.main(mSystemContext);

4. 服务生命周期管理

4.1 启动阶段(Boot Phases)

系统服务可以在不同的启动阶段执行初始化:

public class YourService extends SystemService {
    // ...
    @Override
    public void onBootPhase(int phase) {
        if (phase == PHASE_THIRD_PARTY_APPS_CAN_START) {
            // 第三方应用可以启动时的初始化
        } else if (phase == PHASE_BOOT_COMPLETED) {
            // 系统启动完成后的操作
        }
    }
}

4.2 系统就绪回调

private void systemReady() {
    // 通知所有服务系统已就绪
    mActivityManagerService.systemReady(() -> {
        // 系统就绪后的操作
    }, BOOT_TIMINGS_TRACE_LOG);
}

5. 自定义服务示例

以下是在 SystemServer 中添加自定义服务的完整示例:

5.1 服务接口定义 (AIDL)

// frameworks/base/core/java/android/app/IMyCustomService.aidl
package android.app;
interface IMyCustomService {
    void doSomething(int param);
    int getSomething();
}

5.2 服务实现

// frameworks/base/services/core/java/com/android/server/MyCustomService.java
package com.android.server;
import android.app.IMyCustomService;
import android.content.Context;
import android.os.IBinder;
import android.util.Slog;
public class MyCustomService extends IMyCustomService.Stub {
    private static final String TAG = "MyCustomService";
    private final Context mContext;
    public MyCustomService(Context context) {
        mContext = context;
        Slog.i(TAG, "MyCustomService created");
    }
    @Override
    public void doSomething(int param) {
        Slog.d(TAG, "doSomething called with param: " + param);
        // 实现具体功能
    }
    @Override
    public int getSomething() {
        Slog.d(TAG, "getSomething called");
        return 42; // 示例返回值
    }
}

5.3 在 SystemServer 中启动服务

// frameworks/base/services/java/com/android/server/SystemServer.java
public final class SystemServer {
    // ...
    private void startOtherServices() {
        // ...
        // 启动自定义服务
        try {
            traceBeginAndSlog("StartMyCustomService");
            MyCustomService myCustomService = new MyCustomService(context);
            ServiceManager.addService(Context.MY_CUSTOM_SERVICE, myCustomService);
            traceEnd();
        } catch (Throwable e) {
            reportWtf("starting My Custom Service", e);
        }
        // ...
    }
}

5.4 在 Context 中定义服务常量

// frameworks/base/core/java/android/content/Context.java
public abstract class Context {
    // ...
    public static final String MY_CUSTOM_SERVICE = "my_custom_service";
    // ...
}

6. 注意事项

  1. 启动顺序:服务的启动顺序很重要,依赖其他服务的服务应该在依赖服务之后启动
  2. 异常处理:使用 try-catch 块捕获服务启动过程中的异常
  3. 性能考虑:避免在服务启动过程中执行耗时操作
  4. 权限控制:确保服务有适当的权限检查
  5. 进程间通信:如果服务需要跨进程访问,确保正确实现 Binder 接口

7. 调试技巧

使用 dumpsys 命令检查服务状态:

adb shell dumpsys my_custom_service

查看服务列表:

adb shell service list

检查系统日志:

adb logcat -s SystemServer

通过以上方式,你可以在 Android SystemServer 中成功创建和启动自定义系统服务。

到此这篇关于Android SystemServer 中 Service 的创建和启动流程的文章就介绍到这了,更多相关Android SystemServer Service创建启动内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Android.bp语法和使用方法讲解

    Android.bp语法和使用方法讲解

    Android.bp是用来替换Android.mk的配置文件,下面这篇文章主要给大家介绍了关于Android.bp语法和使用的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • Android使用ViewStub实现布局优化方法示例

    Android使用ViewStub实现布局优化方法示例

    这篇文章主要为大家介绍了Android使用ViewStub实现布局优化方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Android编程获取sdcard音乐文件的方法

    Android编程获取sdcard音乐文件的方法

    这篇文章主要介绍了Android编程获取sdcard音乐文件的方法,涉及Android针对外部存储卡中多媒体文件的相关操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11
  • Android实现listview动态加载数据分页的两种方法

    Android实现listview动态加载数据分页的两种方法

    这篇文章主要为大家详细介绍了Android实现listview动态加载的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • Android开发中synchronized的三种使用方式详解

    Android开发中synchronized的三种使用方式详解

    这篇文章主要介绍了Android开发中synchronized的三种使用方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-04-04
  • Android实现内存中数据保存到sdcard的方法

    Android实现内存中数据保存到sdcard的方法

    这篇文章主要介绍了Android实现内存中数据保存到sdcard的方法,涉及Android的文件读写与I/O操作相关技巧,需要的朋友可以参考下
    2016-01-01
  • Android 逐帧动画创建实例详解

    Android 逐帧动画创建实例详解

    这篇文章主要介绍了Android 逐帧动画创建实例详解的相关资料,这里主要说明Android 动画的创建及使用方法,希望通过此文能帮助到大家,需要的朋友可以参考下
    2017-08-08
  • Android Intent传递数据大小限制详解

    Android Intent传递数据大小限制详解

    这篇文章主要给大家介绍了关于Android Intent传递数据大小限制的相关资料,文中通过示例代码介绍的非常详细,对各位Android开发者们具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04
  • Android实现可浏览和搜索的联系人列表

    Android实现可浏览和搜索的联系人列表

    这篇文章主要为大家详细介绍了Android实现可浏览和搜索的联系人列表的相关代码,浏览所有联系人和根据名称搜索联系人,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • Android自定义相机实现定时拍照功能

    Android自定义相机实现定时拍照功能

    这篇文章主要为大家详细介绍了Android自定义相机实现定时拍照功能的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01

最新评论