1. Framework Service 概述与演进

1.1 从单进程到跨进程服务的演进

Android 系统服务的核心设计目标是实现跨进程通信(IPC)。早期的单进程模块演变为多进程、高内聚、低耦合的Service架构,使得系统组件如ActivityManager、WindowManager、PackageManager等运行在独立进程中,并通过Binder机制向应用层提供服务。这种演进带来了以下关键优势:

  • 隔离性:服务崩溃不影响上层APP进程。
  • 可复用性:同一服务可被多个APP同时调用。
  • 权限控制:通过ServiceManager统一管理注册和访问权限。

1.2 AIDL 与 Binder 基础

Binder是Android独有的IPC机制,底层基于内核驱动的Binder Driver实现。AIDL(Android Interface Definition Language)是定义Binder接口的语言,编译器自动生成Binder代理与Stub代码。开发者只需编写AIDL文件,即可实现跨进程服务调用。

关键点:Binder的一次IPC传输量默认限制为1MB,适用于传递轻量级数据;大量数据传递建议使用FileDescriptor或ContentProvider。

AIDL 接口定义示例

// IMyService.aidl
package com.example.framework;

interface IMyService {
    int add(int a, int b);
    String getServiceName();
}

编译后自动生成IMyService.java内部类Stub(用于服务端)和Proxy(用于客户端)。服务端需继承Stub并实现方法;客户端通过asInterface转型后即可调用。

Binder通信流程图

Binder IPC 基本流程 客户端进程 IMyService.Proxy transact() Binder Driver 内核线程池 数据拷贝 线程唤醒 服务端进程 IMyService.Stub onTransact() ① 客户端调用 proxy.add() → transact(ADD_TRANSACTION, data, reply) ② 驱动将数据拷贝到服务端进程 → 调用 onTransact() → add(a,b) → 返回结果

1.3 系统服务注册流程

在Android Framework中,系统服务(SystemService)的注册遵循固定生命周期:

  1. 创建服务对象:在SystemServer的main()中实例化,如new WindowManagerService(context)。
  2. 获取ServiceManager引用:通过ServiceManager.getService("window")(内部通过Binder查询)。
  3. 注册到ServiceManager:调用ServiceManager.addService("window", service)。
  4. 发布给系统:部分服务还需调用publishBinderService()将binder注册到LocalService。
  5. 启动服务循环:服务进入Looper循环处理回调。
步骤 关键类 核心操作
创建SystemServernew XXXService(context)
注册ServiceManagerNativeaddService(name, binder)
查询ServiceManagergetService(name) → 远程Binder引用
权限检查ContextImplcheckCallingPermission()
常见错误:在SystemServer的startBootstrapServices()和startCoreServices()之间注册服务顺序错误会导致依赖服务未就绪而崩溃。建议严格按照AOSP官方启动顺序添加自定义服务。

1.4 ServiceManager 角色

ServiceManager是Binder IPC的“电话总机”,运行于系统进程servicemanager中。它维护一张服务名到Binder引用的哈希表,提供addService()和getService()两个核心调用。所有系统服务在启动时向它注册,客户端通过服务名查询binder句柄,实现解耦。

  • 注册:服务端调用addService("service_name", binder),ServiceManager将信息存入内部列表。
  • 查询:客户端调用getService("service_name"),返回binder引用;若服务未就绪,返回null或阻塞等待(取决于调用方式)。
  • 死亡通知:服务端进程死亡时,ServiceManager会向注册了linkToDeath的客户端发送通知。

实际开发中,自定义Service无需直接操作ServiceManager,而是通过Framework提供的Context.BINDER_SERVICE机制和ServiceManager.addService()的封装API完成注册。本教程后续章节将基于AOSP代码详细演示添加一个完整的自定义系统服务。