# 系统服务添加流程

## 概述

系统服务是Android Framework的核心组件，本文档介绍如何添加自定义系统服务，包括服务设计、注册、启动等完整流程。

## 系统服务架构

### 1. 系统服务类型

#### 系统服务分类
- **核心服务**: SystemServer中启动的核心服务
- **系统服务**: 系统级服务，需要系统权限
- **应用服务**: 应用级服务，普通应用可使用

#### 服务生命周期
```
服务创建
    ↓
服务初始化
    ↓
服务注册
    ↓
服务运行
    ↓
服务销毁
```

### 2. 系统服务组件

#### 服务接口（AIDL）
- 定义服务接口
- 使用AIDL描述接口
- 生成接口代码

#### 服务实现
- 实现服务接口
- 处理业务逻辑
- 管理服务状态

#### 服务注册
- 在SystemServer中注册
- 添加到ServiceManager
- 设置服务权限

## 添加系统服务流程

### 1. 定义服务接口（AIDL）

#### 创建AIDL文件
```java
// IMyCustomService.aidl
package com.android.server;

interface IMyCustomService {
    // 定义接口方法
    String getCustomData();
    void setCustomData(String data);
    int performOperation(int param);
}
```

#### AIDL文件位置
```
frameworks/base/core/java/android/os/
└── IMyCustomService.aidl
```

### 2. 实现服务类

#### 服务实现
```java
// MyCustomService.java
package com.android.server;

import android.content.Context;
import android.os.Binder;
import android.util.Slog;

public class MyCustomService extends IMyCustomService.Stub {
    private static final String TAG = "MyCustomService";
    private final Context mContext;
    private String mCustomData = "default";
    
    public MyCustomService(Context context) {
        mContext = context;
        Slog.d(TAG, "MyCustomService created");
    }
    
    @Override
    public String getCustomData() {
        // 权限检查
        enforcePermission();
        return mCustomData;
    }
    
    @Override
    public void setCustomData(String data) {
        // 权限检查
        enforcePermission();
        mCustomData = data;
        Slog.d(TAG, "Custom data set: " + data);
    }
    
    @Override
    public int performOperation(int param) {
        enforcePermission();
        // 实现业务逻辑
        return param * 2;
    }
    
    private void enforcePermission() {
        // 检查调用者权限
        if (Binder.getCallingUid() != Process.SYSTEM_UID) {
            throw new SecurityException("Only system can call this service");
        }
    }
}
```

### 3. 在SystemServer中注册服务

#### 修改SystemServer
```java
// SystemServer.java
public final class SystemServer {
    private void startBootstrapServices(@NonNull TimingsTraceAndSlog t) {
        // ... 其他服务启动 ...
    }
    
    private void startCoreServices(@NonNull TimingsTraceAndSlog t) {
        // ... 核心服务启动 ...
    }
    
    private void startOtherServices(@NonNull TimingsTraceAndSlog t) {
        // ... 其他服务启动 ...
        
        // 启动自定义服务
        t.traceBegin("StartMyCustomService");
        try {
            ServiceManager.addService("my_custom_service",
                new MyCustomService(mSystemContext));
            Slog.i(TAG, "MyCustomService started");
        } catch (Throwable e) {
            Slog.e(TAG, "Failure starting MyCustomService", e);
        }
        t.traceEnd();
    }
}
```

### 4. 定义服务权限

#### 定义权限
```xml
<!-- frameworks/base/core/res/AndroidManifest.xml -->
<permission
    android:name="android.permission.USE_MY_CUSTOM_SERVICE"
    android:protectionLevel="signature|privileged"
    android:label="@string/permission_use_my_custom_service"
    android:description="@string/permission_use_my_custom_service_desc" />
```

### 5. 创建服务管理器

#### 服务管理器类
```java
// MyCustomServiceManager.java
package com.android.server;

import android.content.Context;
import android.os.ServiceManager;

public class MyCustomServiceManager {
    private static final String SERVICE_NAME = "my_custom_service";
    private static IMyCustomService sService;
    
    public static IMyCustomService getService() {
        synchronized (MyCustomServiceManager.class) {
            if (sService == null) {
                IBinder binder = ServiceManager.getService(SERVICE_NAME);
                if (binder != null) {
                    sService = IMyCustomService.Stub.asInterface(binder);
                }
            }
            return sService;
        }
    }
}
```

## 服务使用

### 1. 客户端调用

#### 获取服务
```java
// 客户端代码
IMyCustomService service = MyCustomServiceManager.getService();
if (service != null) {
    try {
        String data = service.getCustomData();
        service.setCustomData("new data");
        int result = service.performOperation(10);
    } catch (RemoteException e) {
        e.printStackTrace();
    }
}
```

### 2. 权限检查

#### 声明权限
```xml
<!-- 客户端AndroidManifest.xml -->
<uses-permission android:name="android.permission.USE_MY_CUSTOM_SERVICE" />
```

#### 运行时检查
```java
// 检查权限
if (checkSelfPermission("android.permission.USE_MY_CUSTOM_SERVICE") 
        != PackageManager.PERMISSION_GRANTED) {
    // 权限未授予
    return;
}
```

## 服务生命周期管理

### 1. 服务启动

#### 启动时机
- SystemServer启动时
- 按启动顺序启动
- 依赖其他服务时等待

#### 启动顺序
```java
// 在SystemServer中按顺序启动
private void startOtherServices() {
    // 1. 先启动依赖的服务
    startDependencyService();
    
    // 2. 启动自定义服务
    startMyCustomService();
    
    // 3. 启动后续服务
    startOtherServices();
}
```

### 2. 服务初始化

#### 初始化步骤
```java
public MyCustomService(Context context) {
    mContext = context;
    
    // 1. 初始化资源
    initResources();
    
    // 2. 初始化数据
    initData();
    
    // 3. 注册监听器
    registerListeners();
    
    // 4. 启动后台任务
    startBackgroundTasks();
}
```

### 3. 服务销毁

#### 清理资源
```java
public void shutdown() {
    // 1. 停止后台任务
    stopBackgroundTasks();
    
    // 2. 注销监听器
    unregisterListeners();
    
    // 3. 清理数据
    cleanupData();
    
    // 4. 释放资源
    releaseResources();
}
```

## 服务测试

### 1. 单元测试

#### 测试服务功能
```java
@Test
public void testGetCustomData() {
    MyCustomService service = new MyCustomService(mockContext);
    String data = service.getCustomData();
    assertEquals("default", data);
}

@Test
public void testSetCustomData() {
    MyCustomService service = new MyCustomService(mockContext);
    service.setCustomData("test");
    String data = service.getCustomData();
    assertEquals("test", data);
}
```

### 2. 集成测试

#### 测试服务注册
```java
@Test
public void testServiceRegistration() {
    IBinder binder = ServiceManager.getService("my_custom_service");
    assertNotNull(binder);
    
    IMyCustomService service = IMyCustomService.Stub.asInterface(binder);
    assertNotNull(service);
}
```

### 3. 功能测试

#### 测试服务调用
```bash
# 使用adb测试服务
adb shell service call my_custom_service 1 s16 "test"
```

## 常见问题

### 1. 服务无法启动

#### 问题原因
- 服务注册失败
- 权限不足
- 依赖服务未启动

#### 解决方法
- 检查服务注册代码
- 检查权限配置
- 检查启动顺序

### 2. 服务调用失败

#### 问题原因
- 服务未注册
- 权限不足
- 接口不匹配

#### 解决方法
- 检查服务是否启动
- 检查权限配置
- 检查接口定义

### 3. 服务性能问题

#### 问题原因
- 初始化耗时
- 业务逻辑复杂
- 资源占用高

#### 解决方法
- 优化初始化流程
- 优化业务逻辑
- 优化资源使用

## 最佳实践

### 1. 服务设计
- 接口设计清晰
- 职责单一
- 易于扩展

### 2. 权限管理
- 最小权限原则
- 严格权限检查
- 权限文档完善

### 3. 错误处理
- 完善的错误处理
- 详细的错误日志
- 异常恢复机制

### 4. 性能优化
- 避免阻塞主线程
- 优化资源使用
- 合理使用缓存

## 相关链接

- [[README]]
- [[01-系统启动流程/SystemServer核心服务]]
- [[05-进程与线程通信/AIDL与HIDL使用与原理]]
- [[07-系统安全/权限管理框架]]