Android 中的 ServerManager 是 Android 框架中一个用于管理系统服务的核心机制。它是 Binder IPC 的一部分,用于在客户端和服务端之间建立联系,广泛应用于系统服务(如 ActivityManager、WindowManager 等)的注册与获取。

1 ServiceManager职责是什么?有什么用?

ServiceManager 是 Android 系统中一个特殊的 Binder 服务,其职责主要是:
服务注册(addService)
服务查找(getService、checkService)
服务列举(listServices)

它是所有系统服务的“目录服务”,作用类似一个全局的“服务注册表”。
在这里插入图片描述

2 ServiceManager的关键模块有哪些?

2.1 ServiceManager 本身(Native C++)

位于 frameworks/native/cmds/servicemanager/,其本质是一个 Binder 服务,负责接收请求(添加、查找服务)并处理。

int main() {sp<ServiceManager> sm = new ServiceManager();  // 实例化sm->addService(...); // 注册服务...IPCThreadState::self()->joinThreadPool(); // 进入 Binder 循环
}

2.2 IServiceManager 接口

是客户端与服务端交互的 Binder 接口定义,定义了如下方法:

addService(name, service)
getService(name)
checkService(name)
listServices()

2.3 defaultServiceManager()(C++)

客户端通过该方法获取 ServiceManager 的代理对象。

sp<IServiceManager> sm = defaultServiceManager();
sp<IBinder> binder = sm->getService(String16("activity"));

2.4 Java 层封装

Java 层通过 android.os.ServiceManager 访问 native 的 ServiceManager:

IBinder binder = ServiceManager.getService("activity");

内部通过 JNI 调用 native 层 BinderInternal.getContextObject() 获得 binder 代理。

3 注册与获取服务流程

3.1 注册服务(addService)

系统服务启动时调用 ServiceManager.addService(name, binder)

binder 驱动将请求转发给 native 的 ServiceManager

ServiceManager 保存服务到本地表中(map)

3.2 获取服务(getService)

客户端调用 ServiceManager.getService(name)

binder 驱动将请求传给 native ServiceManager

查找到对应 binder 实例返回。

Q&A

怎么理解“ServiceManager 是 Android 系统中一个特殊的 Binder 服务”?

这里面有两个关键词。
一是binder服务,Binder 是 Android 的核心 IPC(进程间通信)机制。在 Binder 架构中,“服务” 是一个实现了 Binder 接口的对象(IBinder),可以被其他进程远程调用。每个服务都通过 Binder 驱动注册到内核,并能被其他进程通过 Binder 通信访问。
二是“特殊”,特殊性在哪?ServiceManager 就是一个这样的 Binder 服务对象,但它比一般服务更特殊。原因如下:

  1. 它是 Binder 世界的“入口”
    所有系统服务(如 ActivityManager、WindowManager 等)在启动后都先注册到 ServiceManager 中。
    客户端想用这些服务时,必须通过 ServiceManager 查询到对应的 Binder 接口。👉 它充当了一个“Binder 服务注册与发现中心”(相当于服务注册表)。
  2. 由系统早期启动并驻留内存。它在 init 进程阶段由 native 层以独立可执行程序的形式(servicemanager)启动。启动时会进入一个 Binder 循环线程池,不断处理其他进程通过 Binder 发来的服务注册/查询请求。
  3. 权限控制 & 本地注册表,仅系统进程才能注册服务,防止恶意进程篡改系统服务。ServiceManager 会维护一个本地服务表(map),键是服务名,值是对应的 IBinder 实现。

普通的client进程和service进程想要通过AIDL通讯,需要注册到ServiceManager吗?

这里有两种场景,先说第一种,系统服务场景(系统进程 + 普通 app)。

比如我们想通过 AIDL 访问 ActivityManager、WindowManager,这些系统服务会在系统启动时通过 ServiceManager.addService() 注册自己。
普通 App 调用 ServiceManager.getService(“activity”),获得其 Binder 接口。
系统服务在系统启动的时候会注册到 ServiceManager,这是它们能被系统和 app 找到的前提。

第二种场景,自定义服务场景(普通 App 进程 + 普通 App 进程)。

我们自己写一个 AIDL 服务并运行在一个 Service 中,想让其他 App 调用它:这种情况不需要也无法使用ServiceManager注册我们自己的服务,因为ServiceManager 是系统服务,不对第三方应用开放 addService() 权限。通常用 绑定服务(bindService) 的方式建立连接。

流程是这样的,服务端在 AndroidManifest.xml 中声明一个 Service,并实现 AIDL 接口。
客户端通过 Intent(带包名和 Service 类名)调用 bindService()。系统通过 AMS(ActivityManagerService)管理服务绑定,并将 Binder 对象通过回调传给客户端(onServiceConnected())。

所以这种场景下,不是通过 ServiceManager 查找,而是通过 AMS 的服务绑定机制传递 Binder 对象。

持续更新。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/83712.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/83712.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/83712.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Android基础回顾】一:Binder机制是什么?有什么用?

Android中的Binder机制是Android系统中最核心和最基础的进程间通讯机制。 1 什么是进程间通讯机制(IPC)&#xff1f; 众所周知&#xff0c;Android系统基于Linux开发&#xff0c;Linux系统里面本来就有进程间通讯机制。 1.1 Linux的IPC(Inter-Process Communication)概览 它…

Go语言爬虫系列教程5:HTML解析技术以及第三方库选择

Go语言爬虫系列教程5&#xff1a;HTML解析技术以及第三方库选择 在上一章中&#xff0c;我们使用正则表达式提取网页内容&#xff0c;但这种方法有局限性。对于复杂的HTML结构&#xff0c;我们需要使用专门的HTML解析库。在这一章中&#xff0c;我们将介绍HTML解析技术以及如何…

AtCoder 第408​场初级竞赛 A~E题解

A Timeout 【题目链接】 原题链接:A - Timeout 【考点】 模拟 【题目大意】 长老会在 s 秒后睡去,进过 n 次叫醒,长老最后能否是保持清醒。 【解析】 模拟每一次拍击叫醒的过程,查看本次时间距上次时间是否大于 s。注意:第一次拍击叫醒应和 0 秒相减。 【难度】 …

Unity VR/MR开发-VR设备与适用场景分析

视频讲解链接&#xff1a;【XR马斯维】VR/MR设备与适用场景分析&#xff1f;【UnityVR/MR开发教程--入门】_游戏热门视频

MyBatis 查询功能实现全流程

一、创建maven项目 配置好相应的jdk 二、在数据库建立相应的表格 1.因为Mybatis实际是对sql表的一系列操作&#xff0c;所以我们新建一个数据库 2.在查询界面运行下面指令创建一个user表 CREATE TABLE user (id int(11) NOT NULL AUTO_INCREMENT,username varchar(32) NOT NU…

tcp/udp

tcp/udp协议概述 传输层协议基本概念 传输层协议建立在网络层和会话层之间&#xff0c;为应用层实体提供端到端的通信功能&#xff0c;确保数据包的顺序传送及数据的完整性。它利用网络层提供的服务&#xff0c;并通过传输层地址&#xff08;端口号&#xff09;提供给高层用户…

k8s集群安装坑点汇总

前言 由于使用最新的Rocky9.5,导致kubekey一键安装用不了&#xff0c;退回Rocky8麻烦机器都建好了&#xff0c;决定手动安装k8s&#xff0c;结果手动安装过程中遇到各种坑&#xff0c;这里记录下&#xff1b; k8s安装 k8s具体安装过程可自行搜索&#xff0c;或者deepseek; 也…

深入解析 Dotnet-Boxed.Framework:提升 .NET 开发效率的利器

在现代 .NET 开发中&#xff0c;框架和工具的选择对项目的开发效率和长期维护至关重要。Dotnet-Boxed.Framework 是一个开源框架&#xff0c;旨在简化开发流程&#xff0c;提高生产力。它通过一组实用的工具和自动化功能&#xff0c;帮助开发者快速构建高质量的应用程序。本文将…

如何轻松地将文件从 PC 传输到 iPhone?

传统上&#xff0c;您可以使用 iTunes 将文件从 PC 传输到 iPhone&#xff0c;但现在&#xff0c;使用 iTunes 已不再是唯一的选择。现在有多种不同且有效的方法可以帮助您传输文件。在今天的指南中&#xff0c;您可以找到 8 种使用或不使用 iTunes 传输文件的方法&#xff0c;…

Kafka深度解析与原理剖析

文章目录 一、Kafka核心架构原理1. **分布式协调与选举**2. **ISR、OSR与HW机制**3. **高性能存储设计**4. **刷盘机制 (Flush)**5. **消息压缩算法**二、高可用与消息可靠性保障1. **数据高可用策略**2. **消息丢失场景与规避**3. **顺序消费保证**三、Kafka高频面试题精析1. …

【教学类】20250605立体纸盘(3边形-22边形,角度5、10……40,45)

背景需求 在《自助餐》活动中&#xff0c; 【教学类-53-01】20240918自助餐餐盘-CSDN博客文章浏览阅读984次&#xff0c;点赞29次&#xff0c;收藏11次。【教学类-53-01】20240918自助餐餐盘https://blog.csdn.net/reasonsummer/article/details/142340542?spm1011.2415.300…

GC1809:高性能24bit/192kHz音频接收芯片解析

1. 芯片概述 GC1809 是数字音频接收芯片&#xff0c;支持IEC60958、S/PDIF、AES3等协议&#xff0c;集成8选1输入切换、低抖动时钟恢复和24bit DAC&#xff0c;适用于家庭影院、汽车音响等高保真场景。 核心特性 高精度&#xff1a;24bit分辨率&#xff0c;动态范围105dB&…

Next.js 中间件鉴权绕过漏洞 CVE-2025-29927

前言:CVE-2025-29927 是一个影响 Next.js 的严重漏洞&#xff0c;源于开发者信任了客户端请求中携带的 X-Middleware-Rewrite 头部字段。攻击者可以手动构造该头部&#xff0c;实现绕过中间件逻辑&#xff0c;访问本应受保护的资源或 API。 影响版本&#xff1a;Next.js < …

第1章 数据分析简介

第1章 数据分析简介 1.1 数据分析 当今世界对信息技术依赖日深,每天产生和存储海量数据,来源于自动检测系统、传感器、科学仪器,以及银行取钱、买东西、写博客、发微博等日常行为。 数据与信息在形式上不同:数据是无形式可言的字节流,难理解其本质;信息是对数据集处理后…

边缘计算网关赋能沸石转轮运行故障智能诊断的配置实例

一、项目背景 在环保行业&#xff0c;随着国家对大气污染治理要求的不断提高&#xff0c;VOCs废气处理成为了众多企业的重要任务。沸石转轮作为一种高效的VOCs治理设备&#xff0c;被广泛应用于石油化工、汽车制造、印刷包装等主流行业。这些行业生产规模大、废气排放量多&…

20250602在Ubuntu20.04.6下修改压缩包的日期和时间

rootrootrootroot-X99-Turbo:~$ ll -rwxrwxrwx 1 rootroot rootroot 36247187308 5月 23 10:23 Android13.0地面站.tgz* rootrootrootroot-X99-Turbo:~$ touch 1Android13.0地面站.tgz rootrootrootroot-X99-Turbo:~$ ll -rwxrwxrwx 1 rootroot rootroot 36247187308 6月…

windows无法安装到这个磁盘,选中的磁盘采用gpt分区仪式

解决办法&#xff1a; 我才用的是一个网友分享的微软官方解决办法&#xff0c;成功了&#xff0c;但是不知道会不会i有什么影响。将所有分区删掉&#xff0c;这时磁盘变成为分配的空间。我个人是两块固态&#xff0c;一块m.2&#xff0c;一块sata&#xff1b;所以我直接将500g…

使用Composer创建公共类库

概述 如果多个项目中存在使用相同类库、模块的情况&#xff0c;此时可以考虑将类库或者模块单独抽取出来&#xff0c;形成独立类库&#xff0c;通过composer 来进行依赖管理&#xff0c;这样可以更方便维护&#xff0c;大大提升开发效率。 优势 可以对特定模块进行统一维护和…

Ubuntu中TFTP服务器安装使用

TFTP服务器 在 Ubuntu 下使用 TFTP&#xff08;Trivial File Transfer Protocol&#xff09; 服务&#xff0c;通常用于简单的文件传输&#xff08;如网络设备固件更新、嵌入式开发等&#xff09;。 1 TFTP服务器安装 sudo apt-get install tftp-hpa sudo apt-get install…

前端面试总结

1.请做下自我介绍 技术栈 工作经历 2.挑一个项目详细讲一下 介绍了一个项目的业务&#xff0c;重点讲了一个动态表单的实现&#xff0c;从业务、扩展性、可维护性、性能提升 3.场景题&#xff1a;问答怎么做&#xff0c;表单之间关联&#xff0c;回答不同问题跳转到不同的下一个…