一句话说透Android里面的ServiceManager的注册服务

一句话总结
ServiceManager 注册服务就像"公司前台登记部门信息",新部门(系统服务)开张后必须到前台登记名字和工位号(Binder 引用),其他人要找部门办事时直接问前台查位置!


一、服务注册的流程拆解

1. 系统服务启动(新部门成立)

  • 例子ActivityManagerService(人事部)启动时,需要告诉全公司(系统)自己的存在。

  • 关键代码

    ini 复制代码
    // SystemServer 中启动 AMS 并注册  
    ActivityManagerService ams = new ActivityManagerService();  
    ServiceManager.addService("activity", ams);  

2. 联系 ServiceManager(到前台登记)

  • Binder 通信 :通过 Android 的 Binder 机制,向 ServiceManager 发送注册请求。
  • 固定句柄 0 :ServiceManager 的 Binder 句柄固定为 0,所有服务都知道这个"前台电话"。

3. 登记服务信息(填写登记表)

  • 服务名 :唯一标识符(如 activitywindow),相当于部门名称。
  • Binder 引用:服务的联系方式,相当于工位号或分机号。
  • 权限校验:ServiceManager 会检查调用者是否有权限注册(防止恶意服务冒充)。

二、ServiceManager 如何处理注册请求?

1. 接收请求(前台接电话)

  • 监听 Binder 请求:ServiceManager 启动后进入循环,等待其他服务的注册或查询请求。
  • 解析请求类型 :区分是注册服务(addService)还是查询服务(getService)。

2. 存储服务信息(更新通讯录)

  • 内部存储结构 :使用哈希表(Map<String, IBinder>)保存服务名和 Binder 引用。

    arduino 复制代码
    // ServiceManager 的注册逻辑(C 层简化版)  
    void do_add_service(struct binder_state *bs, const char *name, IBinder *binder) {  
        // 1. 检查权限  
        if (!check_permission()) return;  
        // 2. 插入哈希表  
        hashmap_put(service_map, name, binder);  
    }  

3. 权限控制(防冒名顶替)

  • 系统级服务 :只有 SystemServerZygote 等高权限进程可以注册核心服务(如 activitypower)。
  • 普通应用:无法注册系统服务,防止恶意应用注入假服务。

三、为什么必须注册到 ServiceManager?

  1. 统一管理:所有服务集中登记,避免散落各处难以协调。
  2. 跨进程通信:其他组件(App 或其他服务)需要通过 ServiceManager 查找服务地址(Binder 引用)。
  3. 权限隔离 :防止未授权的服务干扰系统运行(如恶意应用注册假 power 服务控制电量)。

四、实际场景:ActivityManagerService 的注册

1. 启动阶段

  • SystemServer 启动时创建 ActivityManagerService 实例。

  • 调用注册方法

    ini 复制代码
    // SystemServer.java  
    ActivityManagerService ams = new ActivityManagerService();  
    ServiceManager.addService(Context.ACTIVITY_SERVICE, ams);  

2. ServiceManager 的响应

  • 检查权限 :确认调用者 SystemServer 有权限注册 activity 服务。
  • 存储到哈希表 :记录 "activity" → amsBinder

3. 应用查询服务

  • 当 App 调用 getSystemService(Context.ACTIVITY_SERVICE) 时:

    1. 向 ServiceManager 查询 "activity"
    2. 拿到 amsBinder,通过 Binder 调用 AMS 的方法(如启动 Activity)。

五、总结:注册服务的意义

  • 核心服务的"身份证" :没有登记的服务,其他组件无法找到和调用。
  • 系统安全的基石:权限控制防止恶意服务破坏系统。
  • 跨进程协作的桥梁:Binder 通信依赖 ServiceManager 维护的全局服务表。

口诀

  • 服务启动先报到,ServiceManager 来登记
  • 名字 Binder 不能少,权限检查防冒充
  • 查服务像查黄页,安卓稳定靠协作!
相关推荐
齊家治國平天下1 小时前
AAOS 电源管理深度解析:休眠/唤醒/功耗优化
android·车载系统·aaos·aosp·电源管理·休眠唤醒·carpowermanager
Xzaveir1 小时前
企业号码展示不可观测怎么办:状态机、拨测事件与异常回放
android·人工智能
2501_916007471 小时前
iOS和macOS应用程序性能分析和优化工具使用综合指南
android·macos·ios·小程序·uni-app·iphone·webview
黄林晴2 小时前
Nearby Connections 重大变更:不再自动开启 Wi-Fi / 蓝牙,适配指南
android
恋猫de小郭2 小时前
Flutter 全新真 3D 实现,用 flutter_scene 能开发一个「我的世界」
android·前端·flutter
HLC++15 小时前
Linux的进程间通信
android·linux·服务器
爱笑鱼19 小时前
Binder(二):AIDL 生成的 Proxy、Stub 和 Parcel 到底在做什么?
android
爱笑鱼19 小时前
Binder(一):一次方法调用,究竟怎样跨进程执行?
android
壮哥_icon20 小时前
【Android 系统开发】使用 BAT 脚本高效自动化管理 /system/priv-app/ 系统应用(安装与卸载)
android·运维·自动化
用户69371750013841 天前
Claude Code终端日志Token占用实测:一个过滤器砍掉60%-90%
android·前端·后端