Binder ServiceManager解析

Android 15 ServiceManager与Binder服务注册深度解析 深入剖析Android 15 ServiceManager的启动流程、服务注册查询机制、死亡通知以及VINTF声明验证,理解Android系统服务管理的核心 阅读详情

1 Binder库介绍

在Binder库中,Service组件和Client组件分别使用模板BnInterface和BpInterface描述,其中前者成为Binder本地对象,后者成为Binder代理对象。Binder库中的Binder本地对象和Binder代理对象分别对应于Binder驱动程序中的Binder实体对象、Binder引用对象。

BpBinder类中有一个成员变量mHandle,代表一个Client组件的句柄值,每个Client组件在Binder驱动程序中都对应一个Binder引用对象,而每个引用对象都有个句柄值,其中Client组件就是通过这个句柄值来和Binder驱动程序中的Binder引用对象建立对应关系的。

BpBinder类的成员函数transact用来向运行在Server进程中的Service组件发送进程间通信的请求,这是通过Binder驱动程序间接实现的。BpBinder的成员函数transact会把BpBinder类的成员变量mHandle,以及进程间通信数据发送给Binder驱动程序,这样Binder驱动程序就能够根据这个句柄值来找到对应的Binder引用对象,继而找到对应的Binder实体对象,最后可以将进程间通信数据发送给对应的Service组件了。

无论是BBinder还是BpBinder都是通过IPCThreadState和Binder驱动程序交互的,每个使用Binder进程间通信机制的进程都一个Binder线程池,用来处理进程间通信请求。对于每一个Binder线程来说,它的内部都有一个IPCThreadState对象,我们可以通过IPCThreadState的静态成员函数self()获取,并且调用它的成员函数transact来和Binder驱动程序交互。在transact内部,与Binder驱动程序交互操作又是通过talkWithDriver来实现的,它一方面负责向Binder程序发送进程间的通信请求,另一方面又负责接收来自Binder驱动程序的进程间通信请求。

2 Binder机制运作的必要组成

  • client组件:通信请求的发起端。
  • service组件:通信请求的目标端。
  • Service Manager:服务的管理者。
  • binder驱动:进程间通信的执行者。
    只有驱动运行在内核空间,其余的运行在用户空间

3 驱动中的两个重要数据结构

struct binder_node{
    ....
    void __user *cookie;
    ...
    };
struct binder_ref{
    ...
    struct binder_node *node;
    uint32_t desc;
    ...
    };

这里只是介绍和service manager工作原理相关的几个成员变量。binder_node代表binder实体对象,binder_ref代表binder引用对象,他们都是binder驱动里面的结构体。
cookie:指向service组件的用户地址空间
node:指向对应的binder实体对象
desc:binder引用对象的句柄值

那么这两个结构体是什么时候创建呢,在Binder机制的中篇中,我们已经介绍过,当binder驱动检测到传输的数据是binder实体对象的时候就会创建binder_node、binder_ref,并且这个binder_ref通过成员变量node指向binder_node

另外一个问题就是什么时候binder驱动中传输的数据是binder对象呢?答案就是注册service组件的时候,注册service组件的过程下文会介绍。

4 Service Manager工作机制

Service Manager根据核心的任务其实就是提供addService、getService函数,分别实现注册service组件和获取service组件。addService到底对Service Mangager这个大管家做了什么手脚?下面我们就解开其神秘面纱。

addService的调用者严格意义上来说是ServiceManager的代理,这个代理充当了client端,真正的Service Manager服务是server端。Service Manager服务启动的时候会将自己注册为服务的管理者,并且它对应的代理对象句柄规定就是0(这个不再展开介绍)。

addService传入的参数是service组件的名称和service组件对象,当进入到binder驱动层的时候,驱动就检测到传输的数据是binder对象,然后在内核中创建binder_node、binder_ref,需要注意的是,binder_ref中函数service组件的句柄值,然后驱动将这个service组件的名字和分配的句柄值传给server端,即Service Manager对象,Service Manager对象中有个链表svlist,类型如下:

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

name字段记录service组件的名称,ptr是service组件的句柄。Service Manager一旦接收到binder驱动传输过来的service组件名称和句柄值就创建一个svcinfo节点,并放入svlist当中,这样一来当client端通过getService()查找组件的时候就可以返回binder本地对象。

对于复杂的文字描述可能看到早就不耐烦了,下面通过一个图描述addService所做的工作(电脑没装viso挺恶心,先手绘吧^_^):
这里写图片描述

了解了addService原理,再理解getService就水道渠成啦,client端拿着serice组件的名称和Service Manager通信,Service Manager在svclist中对比组件名称,找到其对应的句柄,最后将返回一个binder代理对象

5 总结

本文介绍了Serverice Manager在Binder机制中的作用,并不涉及binder驱动层面,比如binder通信比较重要的通信协议等,以后有时间再补充。

深入Linux内核与Binder驱动:从Android系统启动到ServiceManager的完整通信链路解析 本文深入解析Android系统中Linux内核与Binder驱动的协同工作机制,从系统启动到ServiceManager的完整通信链路。详细介绍了内核初始进程、关键驱动加载、用户空间初始化及Binder通信的核心数据结构与调用流程,帮助开发者深入理解Android底层架构与性能优化要点。 阅读详情

相关推荐

Binder这么弱还跑来面试腾讯?ServiceManager中的Binder机制

前言 Binder机制的三个部分:Java Binder、Native Binder、Kernel Binder,其中Java Binder和Native Binder都是应用开发需要掌握的。Java Binder是需要借助Native Binder来工作的,因此需要先了解Native Binder,Native Binder架构的原型就是基于Binder通信的C/S架构,因此我们先从...

weixin_44339238的博客 668

Android------Binder servicemanager篇

提示:源码android7.1 要分析binder架构,首先我们要分析的就是servicemanager了,这里servicemanager指的是native层的。servicemanager是整个binder机制的守护进程,它是server和cilent之间沟通的桥梁。servicemanager,server,cilent三者运行在不同的进程,servicema

奔放的Guitar的博客 1486

Binder系列(1)——ServiceManager

1. 概述 在一台Android 8.1的手机中,能看到三个servicemanager: servicemanager,管理系统服务,本文只讨论servicemanager; vndservicemanager,管理厂商服务,对应的文件节点是/dev/vndbinder,servicemanager和vndservicemanager使用的是同一份代码,都是由service_manager.c...

Burning Water 1169

Binder机制之Service Manager(大内总管)

一、Service Manager是android系统核心程序,在系统启动后,自动运行,在系统的初始化配置文件init.rc中配置 该文件在out/target/product/generic/root,文件中有如下内容: service servicemanager /system/bin/servicemanager class core user system

程序码农的新路历程 1231

Android Binder原理(二)ServiceManager中的Binder机制

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

448313096@qq.com 225

【Cadence软件技巧集萃】从Capture到Allergo——分布演示从原理符号导出到网络表

Cadence软件功能多样、性能强大,但是使用起来颇费步骤,尤其是从原理图到网络表的导入步骤,没有经过上手实践还真不一定一次就能搞定哩。本文笔者用将分步演示:1、在Capture软件上绘制原理图;2、将原理图导出网络表;3、在Allergo软件上更新网络表;希望给予使用Cadence的读者有效的帮助1、本文简述了建立Capture项目的步骤,演示了调用元件符号库的方法,并绘制了电气原理图;2、针对加载元件封装库可能遇到的问题,做了排查步骤建议;

qq_33175704的博客 2534

Android Binder 之 ServiceManager (基于android 12.0/S)

android S/12.0 binder中的ServiceManager

低头赶路,敬事如仪 2848

Qt 插件开发 plugin 超详细 有源码

Qt 插件化开发框架类似于前后端的微服务的场景,授权哪个微服务则前端可以使用哪个微服务,插件就行硬件插卡一样,可以被随时删除、插入和修改,所以结构很灵活,容易修改,方便软件的升级和维护;插件主要面向接口编程,无需访问.lib文件,热插拔、利于团队开发。即使在程序运行时.dll不存在,也可以正常启动,只是相应插件功能无法正常使用而已;动态库需要访问.lib文件,而且在程序运行时必须保证.lib存在,否则无法正常启动;

q610098308的专栏 6544

Android Binder【篇一:追根溯源 Linux IPC前世今生】

本文深入分析了Android Binder驱动的工作原理与实现机制。首先介绍了Linux内核基础概念,包括内存管理和进程隔离原理,阐述了用户空间与内核空间的交互方式。随后重点解析了Binder驱动的核心实现:驱动初始化过程、设备文件打开机制、内存映射技术以及关键数据结构(binder_proc、binder_node、binder_ref等)。文章详细说明了Binder如何通过内存映射实现"一次拷贝"的高效数据传输,并剖析了驱动命令处理流程,包括BINDER_WRITE_READ和BIN

qq_27672101的博客 7803

NCBI|叶绿体基因组数据上传

叶绿体基因组NCBI上传 小编最近在NCBI上传了好几次数据…想着可以把具体的上传步骤写下来,供大家参考。以下是叶绿体基因组的上传示例,大家可以瞅瞅 图片 准备工作 1.登录NCBI官网:https://www.ncbi.nlm.nih.gov/, 依次点击“sign in to NCBI”——“See more 3rd party sign in options”——搜索“Microsoft live.com”。 ”sign in to NCBI“ ”See more 3rd party sign i

weifanbio的博客 3900

详解STM32F407双重ADC同步采集与DMA传输的配置技巧及实战应用

本文详细解析了STM32F407双重ADC同步采集与DMA传输的配置技巧及实战应用。通过CubeMX配置、代码实现和常见问题解决方案,帮助开发者高效实现多通道数据同步采集,提升工业自动化和嵌入式系统的数据采集效率与精度。

ii567的博客 364

【安卓源码】Binder机制1-Servicemanager 进程的启动和defaultServiceManager

对于用户空间,不同进程之间彼此是不能共享的,而内核空间却是可共享的。Client进程向Server进程通信,恰恰是利用进程间可共享的内核内存空间来完成底层通信工作的,Client端与Server端进程往往采用ioctl等方法跟内核空间的驱动进行交互。Binder通信采用C/S架构,从组件视角来说,包含Client、Server、ServiceManager以及binder驱动,其中ServiceManager用于管理系统中的各种服务。

mike_jun的博客 2123

手把手教你用示波器搞定PCIe 5.0 REFCLK时钟信号测量(附完整参数解读)

本文详细介绍了如何使用示波器进行PCIe 5.0 REFCLK时钟信号测量,包括示波器与探头的选择、关键参数的测量方法及解读,以及实战中的常见问题与解决方案。通过手把手教学和完整参数解读,帮助硬件工程师高效完成时钟信号测量,确保系统稳定性。

weixin_28704565的博客 359

【Android进阶】Android Binder之ServiceManager注册服务解析1

下面将通过一个系列来对binder进行解析,虽然之前很多人都已经写过相关的博客,不过还是决定自己来写写,把整个思路理一理,增加自己对binder的认识,也同时希望对大家有所帮助。 首先我们来看的就是ServiceManager注册服务的过程,通过MediaPlayerService的注册过程来讲解整个注册的流程,主要为了看看binder跨进程通信的具体过程。 下面直接上源码。 /fra...

欢迎关注微信公众号:DroidMind 916

ros1 Noetic下运行cartographer算法进行2d建图

最近的工作重点放在机器狗的二次开发上,项目的需求是要升级机器狗的slam算法和导航避障算法,slam拟采用激光与视觉融合算法,激光slam就使用最为流行和实用的cartoghper算法。在这过程中遇到好多坑,希望看到这篇博客的人能少走弯路吧。我用的仿真机器人是wpr_simiulation。首先复制一份demo_revo_lds.launch文件和revo_lds.lua文件,修改成下面的样子。my_test.lua文件,base_link就是机器人的坐标系。下载与安装的博客有很多,我推荐。

sun5739的博客 1547

Allegro如何进行四层板板层设计

板层的设计

weixin_42499230的博客 3189

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

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

weixin_30411819的博客 456

手把手教你学veriolg(二十六)-- Verilog CIC 滤波器设计

目录 Verilog CIC 滤波器设计1. CIC 滤波器的基本原理2. Verilog 实现3. 说明4. 测试激励5. 总结 CIC(Cascade-Integrator-Comb)滤波器是一种特殊的数字滤波器,常用于多速率信号处理中,尤其是用于信号的上采样(插值)和下采样(抽取)。CIC 滤波器的特点在于它具有简单的硬件实现、不需要乘法器(仅使用加法器和延迟元件)、且具有线性相位特性。然而,CIC 滤波器的缺点是它会产生较大的量化误差,因此在设计时需要特别注意字长的选择以避免溢出。1. CIC 滤波

MHD0815的博客 888

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

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

weixin_30553777的博客 448

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Binder源码分析之ServiceManager(原)

ServiceManager作为Native层Service的管理员,有着极其重要的作用,主要表现两个方面:         1、对于服务端来说,系统所有的服务提供者都需要向ServiceManager注册。         2、对于客户端来说,所有客户端如果想要获得某个系统服务的代理,必须向ServiceManager申请相应的服务端代理。         下面从源码分析ServiceMa

阿杜的专栏 5730

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Android Framework实战课程-binder专题之ServiceManager启动及运行篇

csdn在线学习课程,课程咨询答疑和新课信息:QQ交流群:422901085进行课程讨论 android跨进程通信实战视频课程(加群获取优惠) 目标: 1、理解servicemanager的dns角色含义 2、源码层面理解servicemanager做了什么 路径:frameworks/native/cmds/servicemanager/servicemanager.rc service servicemanager /system/bin/servicemanager class core an

liaosongmao1的专栏 168

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

java层 native层_Java层的ServiceManager和Native层的ServiceManager的对应过程

转自:https://blog.youkuaiyun.com/moonshine2016/article/details/54378358参考:https://www.jianshu.com/p/9c023701c261几天前一个同事问Java层的Binder和Java层的ServiceManager和C++层的ServiceManager是如何对应起来的,竟然一时语噻,一段时间不关注就会感到陌生啊,现在再总...

weixin_30895873的博客 299

Android Binder分析一:ServiceMananger的启动

这里来简单分析一下ServiceManager的启动过程,

lilian0118的专栏 2868

android native service 管理,android servicemanager与binder源码分析一 ------ native层的ServiceManager...

前一阵子在忙项目,没什么更新,这次开始写点android源码内部的东西分析下。以6.0.1_r10版本android源码为例。servicemanager是android服务管理,非常基础的组件之一,分析他的目的是能够深入看到binder的一些处理方式。在开始前先说下阅读源码或者非常复杂代码的方式,我的方式是层级进入,一层掌握脉络之后如果感兴趣再对具体的点深入分析了解,并且每层进行总结,这样我认为...

weixin_35021207的博客 277

图解ServiceManager的获取服务过程(上)

网上有很多关于ServiceManager和Binder的文章,但是老感觉理解起来不是那么顺畅,笔者基于Android 8.1系统源代码,从最简单的获取服务开始了解Binder进程间通信,由于篇幅原因,这里分开两部分来了解,上部分主要集中在Java层,下部分主要集中在Native层。

handy周 3365

android系统serviceManger源码解析

从Android.bp文件中,还存在一个名为vndservicemanager的程序,它们的源码都是一样的,只是rc文件存在出入,将传入/dev/vndbinder作为binder驱动。vndservicemanager的访问权限一般较低,通常只有供应商特定的应用程序或系统组件才能够使用vndservicemanager进行服务的注册和查询。vndservicemanager管理的服务通常是供应商(vendor)特定的、定制化的服务,例如硬件厂商提供的驱动程序或服务。native层的SM。

博客 1143
上一篇: 设备驱动框架简介
下一篇: Linux磁盘挂载
OS技术解密
博客等级 码龄16年 3760粉丝 189原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值