Android跨进程之Binder机制概述

Binder通信过程中的用户空间线程池的管理 在Binder通信机制里,客户端与服务端之间的通信是在专门的IPC通信线程中进行的。这些线程构成一个线程池。线程的创建和销毁是在用户空间进行的,而对线程的控制是在驱动层进行的,即驱动控制线程池中线程的生命,而线程本身则是运行在用户空间的。驱动层是通过BR_SPAWN_LOOPER向用户空间发送创建新线程的命令。 线程池的大小可以设置。默认情况下,线程池只有一个主线程,它在进程生命周期期间是不会退 阅读详情

Binder(机制)

首先Binder是一个类,实现了IBinder接口,其次从IPC角度来看,就是Android中跨进程通信机制。

为什么使用Binder作为跨进程机制?

Linux中使用管道(pipe)做为进程之间的通信方式,虽然Android内核也是使用的Linux,但是作为移动端,性能和内存角度考虑,使用Binder是最好的方式。管道和Socket数据拷贝的次数为2次,文件共享0次,但是其安全性低太多,Binder数据拷贝次数为1次,也能为发送端提供身份验证。

这里写图片描述

这是罗升阳博客Android系统Binder机制中的四个组件Client、Server、Service Manager和Binder驱动程序中的关系图

Binder机制涉及到最重要的四个组件Client、Server、Service Manager和Binder驱动设备

Client和Server都是在应用层实现的,Server、Client都是运行在独立的进程中,两者之间的通信就是IPC的方式,其中就要通过Service Manager和Binder驱动设备。

  • Client:客户端(调用IServiceManager::getService和Binder驱动程序交互)
  • Server: 服务端(调用IServiceManager::addServcie和Binder驱动程序交互)
  • Service Manager:实际也是Server,更是一种守护线程,管理Server,并向Client提供查询Server接口
  • Binder驱动:搭建进程之间通信的建立,并且支持data数据包的传输

举个栗子 这里使用MediaService

MediaService

在native层可以找到MediaService的源码:

int main(int argc, char** argv)

{

//获得一个ProcessState实例

sp<ProcessState> proc(ProcessState::self());

//得到一个ServiceManager对象

    sp<IServiceManager> sm = defaultServiceManager();

    MediaPlayerService::instantiate();//初始化MediaPlayerService服务

    ProcessState::self()->startThreadPool();//看名字,启动Process的线程池?

    IPCThreadState::self()->joinThreadPool();//将自己加入到刚才的线程池?

}

最重要的ServiceManager是通过defaultServiceManager()获取到的,中间还要获取ServiceManager的Binder代理,实在太复杂,不想多说,然后初始化MediaPlayerService服务,也是打开Binder驱动设备,设置looper循环。

ServiceManager存在的意义:

Server先add到ServiceManager中几种管理,Client想要和Server交互,需要先到ServiceManager中查询Service信息,然后通过SM返回的东西和Server交互

在ServiceManager中其源码service_manager知道了三点作用:
  1. 打开了Binder设备
  2. 告诉Binder驱动设备,自己就是Binder的上下文管理者,也就是守护线程
  3. 进入一个无线循环,充当Server的角色

Binder的使用场景:

1 Activity启动

Activity的启动需要用到ActivityManagerService,但是我们的App进程和ActivityManagerService所在的进程不是同一个进程,所以就需要用到进程间通讯了。在App进程中我们拿到的是ActivityManagerService的一个分身,也就是ActivityManagerProxy,这个ActivityManagerProxy与ActivityManagerService都实现了IActivityManager接口,因此它们具有相同的功能,但是ActivityManagerProxy只是做了一个中转,创建两个Parcel对象,一个用于携带请求的参数,一个用于拿到请求结果,然后调用transact方法,通过Binder驱动,ActivityManagerService的onTransact方法会被调用,然后根据相应的code,调用相应的方法,并把处理结果返回。

在这个过程中,我们的App进程就是Client,ActivityManagerService所在的进程是Service。

但是Activity的启动过程还没有完,ActivityManagerService还会调用我们App所在进程的ApplicationThread来最终完成Activity的启动,其实ActivityManagerService拿到的也是ApplicationThread的一个分身ApplicationThreadProxy,通过这个分身,ApplicationThread相应的方法会被调用。

在这个过程中,我们的App端是Server,ActivityManagerService所在的进程是Client。

还有一个问题我们要注意,ActivityThread有一个内部类H(一个Hander),ApplicationThread方法内部都会通过这个Handler来发送消息,最终调用到ActivityThread的方法。为什么要这么做呢?

在分析源码的过程中,很长一段时间,这个问题都困扰着我,直到有一天对Binder的理解加深了,我才明白:Binder服务端的方法都是运行在Binder线程池的一个线程中的,所以要通过Hander,把方法的调用切换到主线程中来。

2 Intent传递数据

我们都知道Intent可以传递的数据包含:基本类型、String、实现了Serializable接口或者Parcelable接口的类以及对应的数组或者集合类。其实Intent中的数据都是通过Bundle来携带的,那么我们就要有个疑问了,为什么限定只能是这些类型的数据,而不是任意的数据类型呢?

归根结底,限制这些类型的是Parcel这个类。如果我们查看源码的话就会看到,Bundle其实也是用到了Parcel这个类。

Parcel
,“包裹的意思”,它的作用就是为了在IPC过程中存放数据。我们要知道一点,进程间传递数据,实际上就是二进制数据,所以对于非基本类型,必然存在着序列化和反序列过程,这也是为什么要求Intent传递的非基本类型数据必须实现Serializable或者Parcelable接口的原因。

至于Parcel在IPC过程中使用到的地方,我们可以看一段代码,这个是我仿造着AIDL生成的文件,自己手写的一个Binder服务端。看一下Proxy类的add方法,实际上就是先创建两个Parcel对象,一个通过调用
writexxx 方法用于存放请求数据,一个是通过调用 readxxx
方法获取结果。Proxy真正干的就是这些,真正计算的还是服务端Stub的实现类。当Proxy调用
mRemote.transact(TRANSACTION_add, _data, _reply, 0);
方法后,Stub的onTransact方法会被调用,进而调用真正的add方法。

Android跨进程通信:图文详解-Binder机制-原理 / 方法对象标识符让Server进程在Binder对象中根据"add two int"通过queryLocalIInterface()查找相应的IInterface对象(即Server创建的plus),Client进程需要调用的相加方法就在该对象中。// 2. 之后,Binder对象 可根据add two int通过queryLocalIInterface()获得对应IInterface对象(即plus)的引用,可依靠该引用完成对请求方法的调用。// 注:运行在Server进程的Binder线程池中; 阅读详情

相关推荐

Android AIDL跨进程通信指南

本文还有配套的精品资源,点击获取 简介:在Android开发中,跨进程通信(IPC)是实现应用间共享数据和服务的关键技术。AIDL(Android Interface Definition Language)提供了一种机制,允许不同进程通过定义接口进行通信。本篇将引导你通过创建一个AIDL服务来掌握跨进程通信的核心概念和实现步骤。首先介绍AIDL的定义和作用,随后详细说明创...

weixin_33759613的博客 1889

Android Binder 服务端分析

本篇文章以这篇为锚点Android Binder 应用程序Binder 启动源码分析_we1less的博客-优快云博客 从startThreadPool开始进行分析 joinThreadPool 路径 frameworks/native/libs/binder/IPCThreadState.cpp 循环执行getAndExecuteCommand void joinThreadPool(bool isMain = true); ...

we1less的博客 708

从零搭建自动驾驶仿真环境:我的Nuplan-devkit实战笔记(含PyCharm配置技巧)

本文详细记录了从零搭建Nuplan-devkit自动驾驶仿真环境的完整流程,包括conda环境配置、pip版本控制、PyCharm专业版集成等关键步骤。特别针对Ubuntu系统下的依赖管理、数据目录优化和性能调优提供了实用技巧,帮助开发者高效构建稳定的自动驾驶仿真开发环境。

weixin_30505225的博客 479

深入Android系统 Binder-3-原理

Binder的实现原理 涉及到原理源码肯定是少不了的,9.0 binder 相关的源码分为三部分: Java:frameworks/base/core/java/android/os/Binder.java native:frameworks/native/libs/binder/ driver:common/drivers/android/binder.c 还有一点需要明确的是: 用户进程:针对内核空间或者binder驱动来说的,这里指的是向binder驱动发送消息的进程 客户进程:针对binder

鸿蒙开发知识记录 579

利用OTSU阈值算法在ZYNQ上实现浒苔识别

利用OTSU阈值算法进行图像二值化,结果用HDMI显示

qq_38075564的博客 1275

ArcGIS:根据DEM数据提取区域水系

利用DEM数据提取区域水系是常见的水文分析应用,为了获取区域的矢量水系数据,我们可以通过ArcGIS对高程DEM数据进行水文分析,为地表水流建立模型,进而获取到该地的水系数据,DEM数据精度越高,获取到的水系数据精度也就越高。以下介绍如何用ArcGIS提供的工具提取水系。

Oruizn的博客 9109

Android-深入理解Binder(一)

文章目录深入理解Binder概述解析MediaServerMediaServer的入口函数ProcessStatedefaultServiceManager注册MediaPlayerService 深入理解Binder 概述 Binder是Android系统提供的一种IPC机制(进程间通信),由于Android是基于Linux内核的,因此除了Binder以外,还存在其他的IPC机制,如管道和Socket等。Android系统基本上可以看作是一个基于Binder通信的C/S架构,Binder就像是网络一样,把

李木子的博客 3440

GLMM(广义线性混合模型)原理以及分析步骤

广义线性混合模型(GLMM)是生态与进化研究中处理非正态数据的定制化工具,能同时分析固定效应和随机效应。它通过链接函数连接响应变量与预测因子,支持二项分布、泊松分布等非正态数据。研究流程包括:明确分析目标(固定效应影响与随机效应方差)、选择合适变量与分布、数据验证、参数估算(需根据模型复杂度选择PQL、拉普拉斯近似等方法)及模型优化(检验过离散与残差,通过信息准则或假设检验筛选最优模型)。GLMM能有效解决传统方法无法处理的"伪重复"和推广性问题,为复杂生物数据提供可靠分析框架。

wewil_lwin的博客 4978

android binder机制---ProcessState和线程池

3, ProcessState和线程池      Android系统启动完成后,ActivityManager, PackageManager等各大服务都运行在system_server进程, app应用需要使用系统服务都是通过binder来完成进程之间的通信。      对于binder线程是如何管理的呢,又是如何创建的呢?其实无论是system_server进程,还是app进程, 都是

Jack的博客 1万+

YOLOv8安防监控实战:跌倒/闯入/徘徊实时检测(附TensorRT加速+声光报警部署代码)

精准性:针对跌倒/闯入/徘徊的行为特征优化,准确率达89.3%,误报率低于5次/天;实时性:TensorRT加速到50+FPS,报警延迟<1秒,满足安防“黄金响应时间”;低成本:无需专用AI芯片,RTX 3060或Jetson Orin就能跑,硬件成本比传统方案低60%;易部署:代码全开源,提供从模型训练到硬件联动的完整流程,2天即可搭起原型系统。如果你的安防监控还在“漏报误报”“响应慢”,建议先从跌倒检测的姿态过滤改起——用100张样本测试,再集成TensorRT加速,90%能看到明显改善。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 680

在YOLO中扩充新类别并且不影响旧类的识别精度

让我们先从简单的部分开始:用我们的新类训练自定义 YOLOv8 模型。在本教程中,我们将向模型添加车牌类。我们将使用Roboflow 中的一个数据集。这个数据集有两个车牌类。在开始训练之前,我们还必须对库进行一些更改。为了节省时间,我还将本教程中我们将进行的更改转换为补丁该补丁包含多项更改,但大多数更改都用于指南的下一部分。if RANK!= -1:是的,我们将编写一个回调。我们希望将此自定义训练模型的头部与 COCO 预训练模型中的旧头部一起使用。

如果想成为中心,那么就到中心去吧。 1225

【Android话题-3.2应用进程】应用是怎么启动Binder机制的

考察内容: 了解binder是用来干什么的? (binder是用来跨进程通信的) 应用里面哪些地方用到了binder机制? 应用的大致启动流程是怎样的? 一个进程是怎么启动binder机制的? 应用启动流程 什么时候支持binder机制的? boolean runOnce(){ String[] args = readArgumentList(); int pid = Zygote.fo...

menghaocheng的专栏 562

PINN求解PDE

PINN求解Dirichlet泊松方程 泊松方程引入 −Δu=f,x∈Ω=(0,1)2-\Delta u=f,x \in \Omega=(0,1)^2−Δu=f,x∈Ω=(0,1)2 u=g,x∈∂Ωu=g,x \in \partial \Omegau=g,x∈∂Ω import torch import time import numpy as np import matplotlib.pyplot as plt import torch.nn as nn def UU(X, order,prob):

forrestguang的博客 3804

Android Framework概述

转发请注明转自:http://blog.youkuaiyun.com/zcxwww/article/category/6139115             这里写一些关于Android Framework比较重要的知识点,这些东西对于之后理解和研究Android Framework有很大好处,就是让我们脑子里先有一个大概的模型,以及认识一点之后经常会碰见的角色。       首先贴一张图,刚

南朝烟雨的博客 1万+

YOLOv8性能提升:基于SPD-Conv的高效空间深度转换卷积技术解析【YOLOv8】

SPD-Conv是一种结合了空间和深度信息的卷积技术。与传统卷积不同,SPD-Conv通过在卷积过程中动态调整空间维度和深度维度之间的关系,使得模型能够在较少的参数下捕捉到更多的空间细节。这种方法尤其适用于检测小目标和复杂场景中的细微特征。SPD-Conv的核心思想是通过引入一个空间深度转换矩阵,将输入特征图的空间信息有效地映射到更高维度的深度信息中。这种转换不仅可以保留输入图像的空间细节,还可以在卷积操作中增强特征的表达能力。空间深度转换:通过一个线性变换矩阵,将输入特征图的空间信息转换为深度信息。

博客 1809

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Binder 通信机制(ServiceManager、AIDL、Binder Proxy)

Binder 是 Android 的核心 IPC 机制,它允许不同进程之间进行通信。Android 中的进程通常是隔离的,Binder 作为中介桥梁,通过对象引用的传递来解决进程间通信的问题。Binder 不仅支持不同应用之间的通信,还能在应用与系统服务之间进行高效的数据交换。Android 中的 Binder 机制是进程间通信(IPC)的基石,它通过AIDL和等组件实现了跨进程的高效通信。提供了服务注册和查找的机制,AIDL定义了进程间接口,则作为客户端与远程服务之间的桥梁,传递调用请求。

qq1014206292的博客 1247

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

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

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

Yvan 5203

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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

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

Android中跨进程通信的几种方式

安卓中的四大组件,就是为了解决跨进程通信的问题 1.广播 2.contentProvide 3.Service里面常用的AIDL=====其实就是Binder机制 4.Activity    如调用系统通话应用(需要一个URI) Intent callIntent=new Intent(Intent.ACTION_CALL,Uri.parse("tel:1234567

深南大盗的博客 1868

Binder系列10—总结

1. Binder概述从IPC角度来说:Binder是Android中的一种跨进程通信方式,该通信方式在linux中没有,是Android独有;从Android Driver层:Binder还可以理解为一种虚拟的物理设备,它的设备驱动是/dev/binder;从Android Native层:Binder是创建Service Manager以及BpBinder/BBinder模型,搭建与binde...

bob_fly1984的专栏 488

Binder机制

在Android系统中,每一个应用程序都是由一些Activity和Service组成的,这些Activity和Service有可能运行在同一个进程中,也有可能运行在不同的进程中。那么,不在同一个进程的Activity或者Service是如何通信的呢?这就是本文中要介绍的Binder进程间通信机制了。 我们知道,Android系统是基于Linux内核的,而Linux内核继承和兼容了...

weixin_30702887的博客 68

Android:安卓学习笔记之Binder 机制的简单理解和使用

Binder 机制 的简单理解和使用Binder 机制参考 Binder 机制 参考 1、图解Android中的Binder机制 2、Android Binder(也许是最容易理解的) 3、图文详解Binder跨进程通信原理 4、Android 接口定义语言 (AIDL) ...

JMW1407的博客 1万+

【Binder】Android跨进程通信:详解 Binder机制

粘合剂,意思为粘合了两个不同的进程。

qq_30885821的博客 1869

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

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

Carson带你学Android 14万+

Android跨进程通信Binder机制与AIDL实例

文章目录进程通信1.1 进程空间划分1.2 跨进程通信IPC1.3 Linux跨进程通信1.4 Android进程通信Binder 跨进程通信2.1 Binder简介2.2 Binder驱动2.3 Binder原理AIDL编程Demo3.1 服务端3.2 客户端 在操作系统中,进程与进程间的内存和数据都是不共享的。这样做的目的,是为了避免进程间相互操作数据的现象发生,从而引起各自的安全问题。为了实现进程隔离,采用了虚拟地址空间,两个进程各自的虚拟地址不同,从逻辑上来实现彼此间的隔离。两个进程之间要进行通信

道阻且长,行则将至 6744
上一篇: 【Android自定义控件】之仿网易星球浮动小球
下一篇: OkHttp和Retrofit
zc2echo
博客等级 码龄9年 6粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值