系统服务 SystemServiceRegistry

本文探讨了Android系统服务的获取,重点关注SystemServiceRegistry。通过分析`getSystemService`接口,指出添加新服务需更新@ServiceName注解。文章还介绍了SystemServiceRegistry的内部结构,包括构造方法、主要成员变量、ServiceFetcher接口及其实现类,强调了其在管理和服务创建中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在开发过程中,常常会用到系统服务,有时候也会添加一些系统服务;
这里看一下Android P相关源码;

在APP层获取系统服务的接口是getSystemService;
它被定义在frameworks/base/core/java/android/content/Context.java

public abstract @Nullable Object getSystemService(@ServiceName @NonNull String name);

这里的@ServiceName是一个注解,限定了输入,如果对注解内容不是很了解可以看下本人下面的文章:

Java注解,小试牛刀

这个直接定义在Context.java中,之所以要特地提一下这个注解,是因为在它限定了输入内容之后,我们新加的服务如果想通过getSystemService被拿到,就得同步把名字加到这个注解里;

当然Context.java内方法的具体的实现都在frameworks/base/core/java/android/app/ContextImpl.java里面;

@Override
public Object getSystemService(String name) {
    return SystemServiceRegistry.getSystemService(this, name);
}

这里引出了一个关键的类SystemServiceRegistry;
先看一下名词解释;

/**
 * Manages all of the system services that can be returned by {@link Context#getSystemService}.
 * Used by {@link ContextImpl}.
 * @hide
 */
public final class SystemServiceRegistry

再整体看一眼SystemServiceRegistry这个类;
位置:frameworks/base/core/java/android/app/SystemServiceRegistry.java
代码不多才1000多行;

它的构造方法是私有的,不允许被实例化;

// Not instantiable.
private SystemServiceRegistry() { }

主要成员变量;

<
在 Android 系统中添加一个系统服务涉及多个层次的开发和配置,主要包括 Java 层、Native(C++)层以及系统框架的整合。以下是完整的步骤: ### 添加 Java 层的系统服务 1. **定义 AIDL 接口** 在 `framework/base/core/java/android/os` 目录下创建一个 AIDL 文件,例如 `IDemoService.aidl`,用于定义服务接口。例如: ```aidl interface IDemoService { int add(int a, int b); } ``` 编译时,系统会自动生成对应的 Java 接口文件 [^3]。 2. **实现服务类** 在 `framework/base/services/core/java/com/android/server` 目录下创建一个服务实现类,例如 `DemoService.java`,实现 `IDemoService` 接口,并提供具体的业务逻辑。 3. **注册服务到 ServiceManager** 在 `SystemServiceRegistry.java` 或通过 `SystemServer.java` 中添加服务的注册代码,确保服务系统启动时被创建并注册到系统服务管理器中。 4. **在客户端调用服务** 在应用中通过 `getSystemService("demo_service")` 获取服务实例,并调用其方法。 --- ### 添加 Native(C++ 层)的核心服务 1. **创建服务目录结构** 在 `frameworks/base` 目录下创建一个新的服务模块目录,例如 `demoService`,并在此目录下建立两个子目录: - `demoServer`:存放服务的启动程序文件,编译后生成可执行文件,在系统启动时运行。 - `libDemoService`:存放服务的实现文件,编译后生成动态链接库,供可执行文件调用 [^2]。 2. **编写 C++ 服务实现文件** 在 `libDemoService` 目录中创建以下文件: - `DemoService.h`:定义服务类的头文件。 - `DemoService.cpp`:实现服务的具体功能。 - `Android.mk`:配置编译规则,生成动态库。 示例代码: ```cpp // DemoService.h class DemoService : public BnDemoService { public: virtual int add(int a, int b); }; ``` ```cpp // DemoService.cpp #include "DemoService.h" int DemoService::add(int a, int b) { return a + b; } ``` 3. **编写服务启动程序** 在 `demoServer` 目录中创建 `main_demo_service.cpp`,用于启动服务: ```cpp int main() { sp<ProcessState> proc(ProcessState::self()); sp<IServiceManager> sm = defaultServiceManager(); sm->addService(String16("demo.service"), new DemoService()); ProcessState::self()->startThreadPool(); IPCThreadState::self()->joinThreadPool(); return 0; } ``` 4. **配置 Android.mk 文件** 在 `demoServer` 目录中编写 `Android.mk` 文件,用于编译服务启动程序。 5. **将服务添加到 init.rc** 在 `init.rc` 文件中添加服务启动配置,确保服务系统启动时运行: ```rc service demo_service /system/bin/demo_service class main user system group system ``` --- ### 集成与测试 1. **编译系统镜像** 使用 `make` 或 `m` 命令编译整个 Android 系统镜像,确保新添加的服务被正确编译和打包。 2. **刷入设备并测试服务** 将新编译的系统镜像刷入设备,通过 `logcat` 或客户端调用服务接口来验证服务是否正常工作。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值