Android应用程序构成

binder

Android应用程序是由ActivityServiceBroadcast ReceiverContent Provider四种类型的组件构成的, 它们有可能运行在同一个进程中, 也有可能运行在不同的进程中。 此外, 各种系统组件也运行在独立的进程中, 例如, Activity管理服务ActivityManagerService和Package管理服务PackageManagerService都运行在系统进程System中。

image-20200725142202987

Android系统是基于Linux内核开发的。 Linux内核提供了丰富的进程间通信机制, 如管道(Pipe) 、 信号(Signal) 、 消息队列(Message) 、 共享内存(Share Memory) 和 插口(Socket) 等。

image-20200725142429073

而 Android系统开发了一套新的进程间通信机制——Binder。

Binder进程间通信机制在进程间传输数据时, 只需要执行一次复制操作, 所以,提高了效率,节省了内存空间。Binder进程间通信机制是在OpenBinder的基础上实现的, 它采用CS通信方式, 其中, 提供服务的进程称为Server进程, 而访问服务的进程称为Client进程。

同一个Server进程可以同时运行多个组件来向Client进程提供服务, 这些组件称为Service组件。同一个Client进程也可以同时向多个Service组件请求服务, 每一个请求都对应有一个Client组件( Service代理对象) 。

Binder进程间通信机制的每一个Server进程和Client进程都维护一个Binder线程池来处理进程间的通信请求, 因此, Server进程和Client进程可以并发地提供和访问服务。 Server进程和Client进程的通信要依靠运行在内核空间Binder驱动程序来进行。

Binder驱动程序向用户空间暴露了一个设备文件/dev/binder, 使得应用程序进程可以间接地通过它来建立通信通道。

Service组件在启动时, 会将自己注册到一个Service Manager组件中, 以便Client组件可以通过Service Manager组件找到它。

因此, 我们将Service Manager组件称为Binder进程间通信机制的上下文管理者, 同时由于它也需要与普通的Server进程和Client进程通信, 我们也将它看作是一个Service组件, 只不过它是一个特殊的Service组件。

Binder进程间通信机制 :

Binder进程间通信机制

ClientServiceService Manager 运行在用户空间, 而Binder驱动程序运行在内核空间, 其中, Service ManagerBinder驱动程序由系统负责提供, 而 ClientService 组件由应用程序来实现。 ClientServiceService Manager均是通过系统调用 openmmapioctl 来访问设备文件 /dev/binder, 从而实现与 Binder 驱动程序的交互, 而交互的目的就是为了能够间接地执行进程间通信。

分析 Binder 进程间通信机制的四个使用情景, 分别是:

(1) Service Manager的启动过程。

(2) Service Manager代理对象的获取过程。

(3) Service组件的启动过程。

(4) Service代理对象的获取过程。

上述四个使用情景都是基于Binder进程间通信机制的C/C++实现来分析

Binder驱动程序

Binder进程间通信库

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何基于nginx组建多个子目录网站

华子目录 实验要求实验步骤 实验要求 组建多个子目录网站www.openlab.com,该网站有2个子目录www.openlab.com/sxhkt和www.openlab.com/zywww.openlab.com/sxhkt使用http读取www.openlab.com/zy使用https读取 实验步骤 准备工作 [rootserver ~]# setenforce 0[ro…

Matlab|基于多目标粒子群算法的微电网优化调度

目录 1 主要内容 2 部分代码 3 效果图 4 下载链接 1 主要内容 本程序为《基于多目标粒子群算法的微电网优化调度》-王金全文章的方法复现,考虑因素较文章复杂,除了考虑基本机组、储能等的出力,还考虑了弃风和弃光,很值得大家…

Docker Compose如何安装

Docker Compose的安装通常依赖于你的操作系统。以下是在不同操作系统中安装Docker Compose的方法: Linux 系统 //下载最新版本的Docker Compose sudo curl -L "https://github.com/docker/compose/releases/download/v2.5.1/docker-compose-$(uname -s)-$(un…

大厂可视化平台之百度SugarBI:让数据价值一“幕”了然。

百度Sugar是百度智能云推出的敏捷BI和数据可视化平台,可以说是生产力具。 它旨在解决报表和大屏的数据BI分析和可视化问题,同时也是为了解放数据可视化系统的开发人力。百度Sugar基于百度Echarts提供丰富的图表组件,使得用户可以开箱即用、零…

spring框架学习记录(1)

前半个月一直在应付期中考试,快被折磨似了orz 文章目录 SpringIoC(Inversion of Control) 控制反转与DI(Dependency Injection)依赖注入bean相关bean配置bean实例化bean的生命周期 依赖注入相关依赖注入方式依赖自动装配 容器创建容器获取bean Spring IoC(Inversi…

Linux进程——Linux下常见的进程状态

前言:在进程学习这一块,我们主要学习的就是PCB这个进程控制块,而PBC就是用来描述进程的结构体,而进程状态就是PCB结构体中的一个变量。 本篇主要内容: 操作系统中的进程状态Linux下的进程状态 在开始之前,我…

Redis学习笔记(基础)

Redis学习笔记(基础) 一、Nosql概述1.1、为什么使用Nosql1.2、什么是Nosql1.3、阿里巴巴演进分析1.4、NoSQL的四大分类 二、 Redis入门2.1、概述2.2、Windows使用Redis2.3、linux安装2.4、redis-benchmark性能测试2.5、Redis基础知识 三、五大数据类型3.…

Linux专栏08:Linux基本指令之压缩解压缩指令

博客主页:Duck Bro 博客主页系列专栏:Linux专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ Linux基本指令之压缩解压缩指令 编号:08 文章目录 Linu…

初始Java篇(JavaSE基础语法)(7)抽象类和接口(上)

找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏:JavaSE 目录 抽象类 抽象类的概念: 抽象类语法 抽象类特性 抽象类的作用 接口 接口的概念: 语法规则 接口…

ssm104园区停车管理系统+jsp

园区停车管理系统的设计与实现 摘 要 网络技术和计算机技术发展至今,已经拥有了深厚的理论基础,并在现实中进行了充分运用,尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代,所以对于信息的宣传和管…

Atlassian Jira 信息泄露漏洞(CVE-2019-3403) 排查思路

Atlassian Jira: 企业广泛使用的项目与事务跟踪工具,被广泛应用于缺陷跟踪、客户服务、需求收集、流程审批、任务跟踪、项目跟踪和敏捷管理等工作领域。 简述: 近日发现多个内网IP触发的Atlassian Jira 信息泄露漏洞的告警。 告警的检测规…

C语言:内存操作函数memcpy、memmove、memset和memcpy的使用和模拟实现

一&#xff1a;memcpy的使用和模拟 memcpy使用时需要包含的头文件为#include<string.h> void* memcpy(void* destination,const void* source,size_t num) 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置&#xff08;特别注意的是…

Python | Leetcode Python题解之第66题加一

题目&#xff1a; 题解&#xff1a; class Solution:def plusOne(self, digits: List[int]) -> List[int]:n len(digits)for i in range(n - 1, -1, -1):if digits[i] ! 9:digits[i] 1for j in range(i 1, n):digits[j] 0return digits# digits 中所有的元素均为 9retu…

「C++ 内存管理篇 04」动态二维数组

目录 一. 使用calloc/free开辟和释放二维数组 二、 使用new/delete开辟和释放二维数组 一. 使用calloc/free开辟和释放二维数组 让一个二级指针变量存放动态开辟的一级指针数组的起始地址&#xff0c;然后让这些一级指针指向动态开辟的基本类型的数组&#xff1a; // 开辟一个大…

【C++】模拟实现string

文章目录 前言成员变量成员函数构造函数浅拷贝深拷贝构造函数实现 析构函数赋值重载 迭代器begin & endrbegin & rend 空间管理函数元素访问元素修改字符串运算流提取 & 流插入流提取流插入 总结 前言 模拟实现不是为了写得和库里面一样好。而是为了更好的了解底层…

一行代码将文件存储到本地或各种存储平台

一行代码将文件存储到本地或各种存储平台 这里我们介绍的是一个开源项目。 这个是他的官网 简介 (xuyanwu.cn) 下面来看他的一个介绍&#xff1a; 一行代码将文件存储到本地、FTP、SFTP、WebDAV、阿里云 OSS、华为云 OBS、七牛云 Kodo、腾讯云 COS、百度云 BOS、又拍云 USS…

R语言学习—1—将数据框中某一列数据改成行名

将数据框中某一列数据改成行名 代码 结果

【大语言模型LLM】-基于大语言模型搭建客服助手(2)

&#x1f525;博客主页&#xff1a;西瓜WiFi &#x1f3a5;系列专栏&#xff1a;《大语言模型》 很多非常有趣的模型&#xff0c;值得收藏&#xff0c;满足大家的收集癖&#xff01; 如果觉得有用&#xff0c;请三连&#x1f44d;⭐❤️&#xff0c;谢谢&#xff01; 长期不…

408数据结构-树的基本概念与性质 自学知识点整理

树的定义 树是 n n n&#xff08; n ≥ 0 n≥0 n≥0&#xff09;个结点的有限集。当 n 0 n0 n0时&#xff0c;称为空树。 任意一棵非空树应具有以下特性&#xff1a; 有且仅有一个特定的被称为根的结点&#xff08;根结点&#xff09;。当 n &#xff1e; 1 n&#xff1e;1 …

【C语言】/*数据类型和变量*/

目录 前言 一、数据类型的介绍 二、内置数据类型的介绍 2.1 字符型 2.2 整型 2.3 浮点型 2.4 布尔类型 三、数据类型长度的计算 3.1 sizeof 操作符 3.2 数据类型的长度(VS2022) 3.3 sizeof中表达式不计算 四、signed 和 unsigned 五、数据类型的取值范围 六、变…