Android - Binder机制 - ServiceManager

Android Binder原理(二)ServiceManager中的Binder机制 本篇我们学到了Binder通信的C/S架构,也知道了的原理的核心其实就是ServiceManager 的原理,为了讲解ServiceManager的原理,我们需要一个框架来举例,那就是框架。在讲解MediaServer的入口函数时,我们遇到了三个问题,其中前两个问题相关的知识点和 IServiceManager都讲解到了,下一篇文章会讲解第三个问题,是如何注册的。 阅读详情

以下几篇文章是较深入分析binder机制。

目录

1. Android - Binder机制 - ServiceManager

2. Android - Binder机制 - 普通service注册

3. Android - Binder机制 - 获得普通service

4. Android - Binder机制 - client和普通service交互

5. Android - Binder机制 - Binder框架总结

6. Android - Binder机制 - ProcessState和IPCThreadState

7. Android - Binder机制 - 驱动


Android - Binder机制 - ServiceManager

UML及说明



代码路径:frameworks/base/cmds/servicemanager/service_manager.c

虽然service_manager并不是用类来写的,但是为了好看,还是用类图来表示。

ServiceManager主要有两大功能,一个是监听其他service的addservice请求,一个是监听client的getservice服务。下面分析ServiceManager主要代码和工作。


初始化

int main(int argc, char **argv)
{
    struct binder_state *bs;
    void *svcmgr = BINDER_SERVICE_MANAGER;

    bs = binder_open(128*1024);

    if (binder_become_context_manager(bs)) {
        LOGE("cannot become context manager (%s)\n", strerror(errno));
        return -1;
    }

    svcmgr_handle = svcmgr;
    binder_loop(bs, svcmgr_handler);
    return 0;
}
ServiceManager以一个独立的进程存在,以上代码主要完成三步工作:

1. binder_open打开binder设备;

2. binder_become_context_manager通过ioctl(bs->fd, BINDER_SET_CONTEXT_MGR, 0)设置为ServiceManager服务,该服务的handle索引值为0;

3. binder_loop进行循环监听;


binder_loop是最重要的部分,代码就不贴了,binder_loop每次循环都进行如下几步:

1. 通过ioctl(bs->fd, BINDER_WRITE_READ, &bwr)读取binder驱动数据(请求数据);

2. binder_parse解析数据,数据包的第4至7字节是该数据包的类型,常用的包括BR_TRANSACTION(请求转发)和BR_DEAD_BINDER(服务死亡),解析完数据,然后调用相应的处理;

3. 如BR_TRANSACTION请求,通过调用ServiceManager注册的svcmgr_handler回调函数,来处理具体的请求,这些请求包括(SVC_MGR_GET_SERVICE、SVC_MGR_CHECK_SERVICE、SVC_MGR_ADD_SERVICE、SVC_MGR_LIST_SERVICES);

ServiceManager的主要任务就是监听AddService和GetService请求,以下是对这两个请求的具体分析。


AddService请求

svcmgr_handler调用do_add_service函数进行具体处理:

1. svc_can_register判断是否能够注册该服务,有一个allowed数组,定义了可以注册的服务,如果这个服务是自定义的,要在allowed数组添加上这个服务的名称;

2. find_svc检测这个服务是否已经注册过了,如果注册过了,就返回错误;

3. 创建一个新的svcinfo节点,然后将节点添加到svclist中,到此为止,服务只是在ServiceManager进程中注册了,还没有向binder驱动中注册;

4. binder_acquire通过BC_ACQUIRE指令将服务注册到binder中;

5. binder_link_to_death待研究。。。

经过简单的几步,服务就注册到binder了,如果要研究很详细的机制,必须研究binder驱动,binder驱动会在以后篇章深入分析,在此就不做说明了。


GetService请求

当一个client要获得某个服务时,要通过GetService请求获得某个服务,svcmgr_handler调用do_find_service函数进行具体处理:

1. do_find_service只是到svclist查找,如果找不到,就返回NULL,如果找到了就返回svcinfo.ptr;

2. svcinfo的ptr是void *,是一个地址,具体里面放的什么东西,看来还得需要分析驱动,所以我们看到binder真正的机制其实是在驱动里面实现的;

很简单,没有和binder驱动打交道就获得了服务,只是这个ptr确实需要研究明白;


svcinfo结构体

struct svcinfo 
{
    struct svcinfo *next;
    void *ptr;
    struct binder_death death;
    unsigned len;
    uint16_t name[0];
};


待研究。。。






STM32CubeMX实战:FreeRTOS内存管理5种方案全解析(附heap_4避坑指南) 本文深入解析了STM32CubeMX环境下FreeRTOS的5种内存管理方案(heap_1到heap_5),重点介绍了heap_4的优化策略与避坑指南。通过对比分析各方案的特点、性能指标及适用场景,帮助开发者根据项目需求选择最优内存管理策略,提升嵌入式系统开发效率与稳定性。 阅读详情

相关推荐

[南大ICS-PA2] 字符串处理函数和printf实现

[南大ICS-PA2] 程序、运行时环境与AM 字符串处理函数和printf实现

qq_42474104的博客 2987

Binder学习[2]: ServiceManger.addService实现

本文将讲述用户进程如何通过 defaultServiceManager()->addService的实现。 1.addService发起端进程在 addService过程中的动作 class DrmManagerService : public BnDrmManagerService { .... class BnDrmManagerService: public BnInterfac...

大将军王虎剩的专栏 5614

MATLAB新手必看:5分钟搞定直流无刷电机Simulink仿真(附完整模型下载)

本文为MATLAB新手提供直流无刷电机Simulink仿真的快速入门指南,涵盖从环境配置到速度控制闭环实现的完整流程。通过详细的模块选择和参数设置说明,帮助读者5分钟内搭建基础仿真模型,并附赠完整模型下载,助力快速掌握电机控制仿真技术。

efc123456的博客 984

Android跨进程通信:图文详解 Binder机制 原理

前言 如果你接触过 跨进程通信 (IPC),那么你对Binder一定不陌生 虽然 网上有很多介绍 Binder的文章,可是存在一些问题:浅显的讨论Binder机制 或 一味讲解 Binder源码、逻辑不清楚,最终导致的是读者们还是无法形成一个完整的Binder概念 本文采用 清晰的图文讲解方式,按照 大角度 -> 小角度 去分析Binder,即: 先从 机制、模型的角度 去分析 整个B...

Carson带你学Android 14万+

P1003 [NOIP2011 提高组] 铺地毯 python题解

解题思路: 1、根据题意,所有地毯都是挨着铺的,所以最上面的一条符合题意的一定是从后往前数的第一条符合题意的。 2、符合题意要求x和y同时满足大于等于地毯左边坐标并且小于等于地毯右边坐标。 代码如下: n = int(input()) a = [] for i in range(n): a.append(list(map(int,input().split()))) x,y = list(map(int,input().split())) l = len(a) while l > 0: ..

繁华三千东流水不舍昼夜的博客 1620

用友u8服务器优化,用友U8erp软件运行的性能优化方案图文教程

今天一定要给大家分享一下用友U8erp软件运行的性能优化方案图文教程,以下方案来自用友软件官方维护工程师反馈在在处理客户问题的时候,有一类问题较为挠头,就是诸如用友U8服务器效率低下的问题。比如用友U8运行慢,卡住等,我们暂先不提用友U8软件代码、脚本层面本身的性能提升问题,我们只是基于现有用友U8软件版本,在客户现有环境下排查用友U8软件运行的性能瓶颈,并采取一定的技术手段进行性能调校。本文将推...

weixin_39882870的博客 5306

Android的Binder机制

Android中Activity,Service等组件需要和AMS通信,这种跨进程通信都是通过Binder完成的。

m0_56144365的博客 1342

从零开始:使用英伟达nx开发板部署目标检测算法的全过程

英伟达nx开发板烧录、依赖安装、开发板联网

weixin_51192760的博客 3762

【Android Framework系列】第2章 Binder机制大全

Binder是Android中主要的跨进程通信方式,整个Android系统架构中,大量采用了Binder机制作为IPC(进程间通信)方案。只需要拷贝一次,基于C/S架构,易用性高,系统为每个APP分配UID同时支持实名和匿名更安全

Yvan 5203

华为OD机试真题 新系统 2026-09-26 Java&Go&C【数据中心最佳维护时间窗】

数据中心使用一个整数数组 scores,记录 N 小时内每小时的服务器得分(可正可负)。0 表示服务器故障(无效小时)。

MISAYAONE的博客 98

用一台笔记本跑起 SAP HANA:从 express edition 的定位,到本地硬件门槛与安装实操

SAP HANA是面向个人开发者、初创团队与教学科研场景的精简发行版,保留了in-memory列存引擎、SQLScriptAFLGraphSpatial等核心能力,可免费用于开发与一定规模的生产用途(上限为 32 GB RAM)。它最大的特征,是能在资源受限的laptop或上快速落地,让你在本地完成从建模、开发到测试的完整闭环。SAP在交付形态上,提供了多种安装包:预配置的VM OVA、面向Linux的二进制安装包,以及历史上出现过的容器化方案;你可以按现有设备与熟悉的运维方式择优选择。官方文档把VM。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 534

Android进程间通信之一:Binder机制学习

Binder机制学习Binder驱动Binder核心APILinux 使用两级保护机制:0 级供系统内核使用,3 级供用户程序使用。Linux 下的传统 IPC 通信原理Linux 下的传统 IPC 通信原理Binder通信过程ServiceManager进程启动MMAP Binder驱动 binder驱动在以misc设备进行注册,作为虚拟字符设备,没有直接操作硬件,只是对设备内存的处理。 主要是驱动设备的初始化(binder_init),打开 (binder_open),映射(binder_mmap)

北洋的博客 9036

【专栏必读】王道考研408计算机组成原理万字笔记使用说明及章节导航

本文是为准备408王道计算机组成原理考试的学生精心整理的万字笔记,涵盖了从计算机系统概述、数据表示和运算到存储系统、指令系统等多个章节的重点内容。本文强调了学习笔记的重要性,并分享了学习建议,如按视频课逻辑记录,建立学科框架。笔记详细记录了每章的关键知识点,包括存储器、CPU、I/O系统的工作原理,还附带了习题和思维导图,旨在帮助考生高效复习。

快乐江湖的博客 9万+

Android ServiceManager启动源码解析:Binder通信总机与系统服务注册机制

在Android系统架构中,进程间通信(IPC)是支撑系统服务与应用交互的核心机制。Binder作为Android特有的IPC框架,通过驱动层的内核模块实现高效的数据传输与进程隔离。其核心原理在于利用内存映射与引用计数机制,在保证安全性的同时实现跨进程方法调用。这一技术价值在于构建了Android系统服务的松耦合架构,使得ActivityManager、WindowManager等核心服务能够独立运行并协同工作。在应用场景中,任何系统服务的注册与发现都依赖于一个中央协调组件。ServiceManager正是

weixin_30411819的博客 456

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

android binder 机制 (ServiceManager)

Binder机制作为一种IPC通信机制,在android系统中扮演了非常重要的角色,因此我也花了一些时间来研究它,按照我的理解,下面我将从4个方面来讲一下Binder,如有不对的地方,还希望大家多多指教。下面的例子都将以MediaServer来讲。 一、ServiceManager ServiceManager在Binder系统中相当与DNS,Server会先在这里注册,然后Client会在这

6130

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Android Binder机制之 ServiceManager的启动

Android Binder机制的ServiceManager    对于Android 来说,Binder进程间的通信机制几乎无处不在,可以说是整个Android系统中各个组件之间交互的灵魂。所以,想要深入的理解Android 中进程间通信的机制,还是需要对Binder机制有一个深入的研究的。    Binder机制很复杂,设计到的东西特别多,很难一下将这些东西说清楚,到期该从何说起呢?不防就从...

小杰的专栏 393

android binder机制---native获取ServiceManager

前言: 无论是Java层还是native层,Binder跨进程首先必须获取ServiceManager对象。当然Java层和native 层分别有ServiceManager对象。 1,native获取ServiceManager C++(native) 获取Service Manager是通过defaultServiceManager()方法来完成,当进程注册服务 (addSe

Jack的博客 1258

Android Binder机制(三) ServiceManager守护进程

Android Binder机制(三) ServiceManager守护进程 http://wangkuiwu.github.io/2014/09/03/Binder-ServiceManager-Daemon/  首页博客链接关于我留言板 ServiceManager是用户空间的一个守护进程,它一直运行在后台。它的职责是管理Binder机制中的各个Server。当Server启

CCJHDOPC的专栏: 1054

【android】binder机制-servicemanager

servicemanager的源码在/frameworks/base/cmds/servicemanager目录下由binder.c,binder.h,service_manager.c构成 生成servicemanager文件放在/system/bin/目录下 servicemanager的入口是在service_manager.c中的main函数 int main(int argc, c

paomadi的专栏 2362

android binder 服务,从ServiceManager了解Android的Binder机制

Binder通信采用C/S架构,从组件视角来说,包含Client、Server、ServiceManager以及binder驱动。架构图如下所示:binder_1.jpg图中的Client,Server,Service Manager之间交互都是虚线表示,是由于它们彼此之间不是直接交互的,而是都通过与Binder驱动进行交互的,从而实现IPC通信方式。关于Binder驱动设备这部分涉及到Linux...

weixin_39805924的博客 221

android binder机制---servicemanager进程启动

2, servicemanager进程启动 ServiceManager是android系统中Binder IPC通信过程中的守护进程,主要负责系统服务的注册和获取。 ServiceManager进程是init进程通过init.rc脚本里的配置文件启动的。init.rc有关的配置如下, service servicemanager /system/bin/servicemanager

Jack的博客 1259

Android系统中的Binder通信机制分析(1)- servicemanager

其实,Android系统的基础是Linux,它本可以使用Linux体系下的IPC机制,为什么还要再实现一个Binder机制呢?Binder更加灵活并节省内存;Binder还解决和避免了传统的进程间通信可能会增加进程开销的问题,也避免了进程过载和安全漏洞等方面的风险;用驱动程序来推动进程间通信;通过共享内存来提高性能;为进程请求分配每个进程的线程池;针对系统中的对象引入了引用计数和跨进程的对象引用映射;进程间同步调用;这几条听起来有点太学术了。

Android系统工程师--小馬佩德罗 793

Android启动过程研究(三:servicemanager进程与Binder通信机制)

一、回顾上文讲到,init进程启动的主要子进程包括 sh adbd:android调试桥 servicemanager:重要,负责管理系统服务 vold:Volume Dameon,用于挂载/管理USB存储或SD卡设备 palymp3:输出启动音 (zygote的启动其实还在后面很远) 二、Linux内核采用了丰富的进程间通信机制,如Pipe(管道)、Signal(信号)、消息队

YongYu_IT的专栏 749

Android ServiceManager启动与Binder通信机制深度解析

在Android系统架构中,进程间通信(IPC)是实现组件协作的核心机制。Binder作为Android特有的IPC方案,其原理基于内核驱动和共享内存映射,实现了高效的数据传输。这一机制的技术价值在于为系统服务提供了统一的通信桥梁,确保了安全性和性能。在应用场景上,Binder广泛应用于系统服务管理、应用组件交互等层面。ServiceManager作为Binder通信的“总机”,负责服务的注册与查询,其启动流程涉及init进程解析、驱动初始化和事件循环处理。通过分析ServiceManager的源码,可以深

weixin_30553777的博客 449

Android Binder机制浅析之ServiceManager

Android系统进程间通信机制Binder的总体架构由Client、Server、ServiceManager和驱动程序Binder四个组件构成。今天主要来看看ServiceManager的实现吧。 Service Manager Service Manager是系统中一个独立的进程,它是整个Binder机制的守护进程,用来管理开发者创建的各种Server,并且向Client提供查询

liujianminghero的专栏 693
上一篇: std - string
下一篇: Android - Binder机制 - 普通service注册
G机器猫
博客等级 码龄16年 106粉丝 74原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值