理解Binder机制

简单理解 Binder 机制 简单理解 Binder 机制一、为什么要用 Binder二、Binder 进程间通信机制三、Java 层中的 Binder 分析关键一:getIServiceManager()问题一:getIServiceManager() 方法返回是什么,ServiceManager 的代理对象吗关键 1.1:ServiceManagerNative.asInterface() 需要关键 1.2 的返回值作为参... 阅读详情

前言

​ Android中Binder机制的重要性不言而喻,从IPC角度来看, Binder是一种跨进程通信方式,Binder也可以理解为一种虚拟的物理设备,它的设备驱动是/dev/binder;从Android framework角度来说,Binder是Service Manager连接各种Manager和相应ManagerService的桥梁;从Android应用层来说,Binder是客户端和服务端进行通信的媒介,当bindService的时服务端会返回一个包含了服务端业务的Binder对象,用于客户端获取服务端提供的服务或者数据,这里的服务包括普通服务和基于AIDL的服务。

一.什么是Binder

​ 什么是Binder,应该怎么去理解Binder呢?首先介绍Binder为了实现进程之间的通信需要解决哪些问题:

//1.如何知道客户端需要调用哪个进程以及该进程中的方法
//2.客户端如何将函数形参发送给远程进程中的函数,以及如何将远程进程函数计算结果返回客户端
//3.如何去屏蔽底层通信细节,让实现客户端调用远程函数就像调用本地函数一样

第一个问题很容易解决,只要给每个需要远程通信的类一个唯一标识,可以通过包名+类名的字符串以标识,然后在类里面给每个函数编号即可对函数唯一编码。

第二个问题,定义一个可打包的接口Parcelable,这个接口提供2个重要函数,分别是将对象中的属性写入到数组和从数组中的数据还原对象,每个可以发送到远程函数作为形参的对象只需实现Parcelable接口即可。Parcelable具体使用可以参考Android开发——进程间通信之AIDL(二)。

第三个问题,为了屏蔽进程之间的通信细节,那么Android团队肯定想定义一个类,由这个类来实现这些细节。这个类应该做哪些事情呢?首先,这个类得帮用户发送远程请求并将返回结果提交给用户,这是最重要的功能了,有了这个功能,妈妈再也不用担心我的进程间通信了。其次,如果我想实现服务端,什么时候客户端调用我,这些细节不用用户操心。当然,这个类还要帮用户封装更多细节。既然打算定义这个类了,那总得取个响当当的名称吧,什么?你说取名为Binder,好吧,那就叫Binder吧。服务端想要实现被跨进程访问,就必须继承Binder类。

有一点很重要,就是客户端发起远程服务调用时当前线程会被挂起,因此如果远程进程是执行长时间的运算,请不要使用主线程去调用远程函数,以防止ANR。

二. Binder的实现机制

说起Binder机制,下面这张图就是经典中的经典了。
在这里插入图片描述

2.1 Binder驱动

Binder驱动是一段运行在内核空间的代码,它是Binder机制的核心,负责Binder节点的建立,和进程间的信息传递。通过"/dev/binder"的文件在内核空间和用户空间来回搬数据。Linux ioctl 函数实现了从用户空间转移到内核空间的功能。

2.2 ServiceManager

ServiceManager是Init程序启动的守护进程之一,它是Android中Binder通信机制的基础。

ServiceManager提供了注册,检索服务的功能。即这些服务由ServiceManager来统一进行管理。

而ServiceManager启动的过程做了三件事:

(1)通过open打开设备文件/dev/binder,把文件内容映射到内核空间中,由于内核空间是所有进程共享的区域,所以借助这块区域,可以实现进程间通信。

(2)通过IO控制命令BINDER_SET_CONTEXT_MGR将当前进程注册到Binder驱动中,Binder驱动便会为他在内核空间创建一个Binder实体,并且将其句柄设置为0,从句柄值也能看出来,这个节点在Binder驱动中是唯一的,系统会将跨进程服务注册到它的服务列表里面,服务列表中存储的便是服务名字+这个服务在Binder驱动中大于0的句柄。

(3)最终ServiceManager也是会进入一个无限循环,等待客户端的IPC请求。

2.3 服务注册

Zygote进程会孵化出的第一个子进程就是SystemService,我们大部分的系统服务比如ActivityManagerService、WindowManagerService等都是该进程内的一个线程,这些服务会通过调用ServiceManager.addService方法添加到ServiceManager中的服务列表中。

(1)Server首先将自己作为对象,并且附上一个句柄为0的值(用于访问ServiceManager),并将这些内容封装成一个数据包后通过open Binder的设备文件/dev/binder发送给Binder驱动。
(2)Binder驱动首先会查看是否有该Server对应的Binder实体,如果没有就创建Binder实体并赋予一个大于0的句柄,接着会把这个句柄和服务名字等信息发送给ServiceManager。
(3)ServiceManager会首先查看服务列表中是否已经存在这个服务,不存在的话,就把这个服务和它的Binder驱动中的句柄加入到服务列表中。

2.4 服务调用

(4)Client想调用某服务时,会把该服务的名字,加上一个句柄为 0 的值封装为一个数据包并发送给Binder驱动。

(5)Binder驱动接收到句柄为0,就会将这数据包扔给ServiceManager。

(6)ServiceManager接收到数据包后就会找某个名字的服务,然后将对应服务的句柄发送给Binder驱动,再发送回客户端。

(7)Client获取句柄之后,会利用这个句柄信息在自己本地创建一个远程Server的代理,以后Client发消息都是发给这个代理的,随后的通信便变成了代理通过Binder驱动与真正的Server进行交互了。

客户端调用这个服务时,会加上参数、标识符(标记远程对象及其函数)等数据放入到Client的共享内存,Binder驱动根据这些数据找到对应的远程服务进程的共享内存,并把数据拷贝到内核空间,并映射到远程服务进程中,并通知远程进程执行onTransact()函数,远程进程Binder对象执行完成后将结果写入自己的共享内存中,Binder驱动再将结果数据拷贝到内核空间,并映射到客户端进程中,并唤醒客户端线程。

三. Android为什么要使用Binder机制

3.1 性能

Binder数据拷贝只需要一次,而管道、消息队列、Socket都需要2次(共享内存方式一次内存拷贝都不需要)。

3.1.1 Binder如何实现的一次拷贝

Linux内核实际上没有从一个用户空间到另一个用户空间直接拷贝的函数,只有从用户空间拷贝到内核空间的函数(copy_from_user),和反过来的copy_to_user()函数。所以说,为了实现用户空间到用户空间的拷贝,mmap()分配的内存除了映射到接收方进程里,还映射到内核空间。所以调用copy_from_user()将数据拷贝进内核空间也相当于拷贝进了接收方的用户空间,这就是Binder只需一次拷贝的原因。

3.2 方便性

Binder是基于客户端/服务器架构的,Server端与Client端相对独立,在客户端这边实现了一个代理,而在服务端通过线程池的方式来响应请求。客户端能够很方便地、像调用本地方法一样调用远程方法。

3.3 安全性

传统Linux IPC的接收方无法获得对方进程可靠的UID/PID,从而无法鉴别对方身份;而在Android中使用Binder进程间通信时,需要对发送方和接收方的UID/PID进行验证,保证通信信息的安全性。

感谢:

http://blog.youkuaiyun.com/qianhaifeng2012/article/details/51602105

http://blog.youkuaiyun.com/linmiansheng/article/details/37918333

https://www.zhihu.com/question/39440766/answer/89210950

http://blog.youkuaiyun.com/huachao1001/article/details/51504469

跟面试官讲Binder(零) 通过上面的简单描述,我们可以这样认为,每一个提供服务的Server都会通过Binder驱动,将自身给注册到ServiceManager中,方便众多想获取服务的Client可以去ServiceManager找到自己。 那么,这些Service都会经过内核空间的Binder驱动,其实这个"经过"的说法,本质上,就是Server们会将自身作为一个对象,封装在数据包中,将这些数据复制到内核空间中,由Binder驱动访问。 而Binder驱动读取数据包的时候,如果发现其中有Binder实体,类似ServiceMana 阅读详情

相关推荐

Android 关键模块启动流程及 /dev/binder 启动过程

同时,在 Android 系统中,进程之间的通信是通过 Binder 机制实现的,而 /dev/binder 是 Binder 驱动程序提供的设备节点。因此,了解 /dev/binder 的启动过程也是十分必要的。Zygote 进程是 Android 系统中特殊的一个进程,它作为所有应用程序进程的父进程,可以提高应用程序的启动速度。在 Android 系统启动时,init 进程会启动 Zygote 进程,并将 Zygote 进程的 PID 保存到 /dev/.zygote_pid 文件中。

qq_37934722的博客 351

Binder基本概念流程学习

  一 Media Service进程启动 Init.rc中描述的service对应linux 的进程: Media进程定义: service media /system/bin/mediaserver class main user media group audio camera inet net_bt net_bt_admin net_bw_acct...

weixin_33726318的博客 264

用Typora画流程图和序列图:Mermaid语法实战教程(含常见报错解决)

本文是一份详细的Typora与Mermaid语法实战教程,教你如何在Markdown文档中高效绘制流程图和序列图。文章涵盖从环境配置、核心语法到复杂图表构建的全过程,并重点解析了常见报错原因与解决方案,助你将可视化图表无缝融入文档工作流。

weixin_29279101的博客 299

Android-深入理解Binder(一)

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

李木子的博客 3440

KEPServerEX实战:Modbus TCP与RTU双协议配置详解

本文详细解析了如何使用KEPServerEX软件同时配置与管理Modbus TCP和RTU混合网络。通过实战步骤,指导用户建立双协议通道、配置设备与标签,并分享核心的地址映射规则与通讯故障排查技巧,帮助工业自动化工程师高效集成多协议设备,简化数据采集架构。

weixin_29186249的博客 397

【电弧故障检测算法全解析,电弧串扰问题分析和解决算法】

本文系统分析了电弧故障检测算法及串扰问题解决方案。电弧检测主要采用时频域分析和机器学习方法,通过提取高频噪声、波形畸变等特征实现故障识别。针对电弧串扰问题,提出了自适应滤波、盲源分离和时频联合分析等算法。研究给出了Python和C语言的算法实现示例,包括高频能量检测、过零率计算和陷波滤波器设计。最后指出算法优化方向:实时性提升可采用滑动窗口FFT和硬件加速;抗干扰增强需结合硬件滤波;机器学习扩展可引入随机森林等分类器。该研究为电弧故障检测系统开发提供了完整的技术路线。

syttt的专栏 891

Binder通信原理

Binder进程间通信全面解析,包括Binder驱动、引用计数技术、内存映射、JAVA和C++层的代码等

z1804362542的博客 6172

保姆级教程:在Ubuntu 22.04上搞定PX4 V1.14 + ROS2 Humble的HITL仿真(避坑实录)

本文提供在Ubuntu 22.04上配置PX4 V1.14与ROS2 Humble的HITL仿真环境的详细教程,涵盖环境准备、固件编译、QGroundControl配置、ROS2通信设置及联调测试。特别针对版本兼容性、Gazebo插件构建和MicroDDS配置等常见问题提供避坑指南,帮助开发者高效搭建无人机仿真系统。

weixin_30836759的博客 1004

一文分析Binder机制和AIDL的理解

为什么要去理解Android的进程间通信机制 对于Android开发工程师来说,如果不去理解进程间通信机制也可以使用系统提供的API完成应用开发,但如果想要达到更高的层级,那么就不能简单只会调用API。无论是工作中遇到一些疑难问题,还是想要学习源码的一些功能实现,或者是想要提升APP的性能等,这些工作都需要我们去看系统的源码,而系统的源码中进程间通信无处不在,如果不理解进程间通信机制,那么很难看懂系统源码,而且容易迷失在大量的代码中。 Android 进程间通信机制 为什么使用Binder作为Android

nufuli123的博客 2974

GSM的“时间管理大师”:TDMA时隙、突发脉冲与逻辑信道映射实战图解

本文深入解析GSM网络中的TDMA时隙调度与逻辑信道映射技术,揭示2G网络如何通过精密的时间管理和突发脉冲设计实现高效通信。从TDMA帧结构到GMSK调制优化,详细介绍了GSM的工程艺术及其在现代通信中的延续价值。

weixin_30631587的博客 514

ST-LINK调试STM32H743必看:CubeMX工程中缺失的这行代码导致程序跑飞

本文深入剖析了使用ST-LINK调试STM32H743时,因CubeMX工程中缺失电源电压档位配置代码而导致程序跑飞或出现“Can not access memory”错误的问题。文章解释了H7系列电源与时钟耦合的核心原理,提供了具体的代码修复方案和系统化的调试排查思路,帮助开发者从根本上解决这一常见调试困境。

weixin_29191669的博客 281

Android的binder机制理解

Binder是Android系统基于C/S架构的高效IPC机制。Binder驱动作为通信中枢,ServiceManager管理服务注册与查询,Server提供服务实现,Client发起请求。其核心机制包括:一次拷贝提升性能,UID/PID验证保障安全,线程池优化并发处理。AIDL作为开发接口,自动生成通信代码。实际应用中需注意数据大小限制,可通过死亡通知机制增强健壮性,使用oneway实现异步调用。Binder通过mmap等技术实现了高效安全的跨进程通信,是Android系统的基石之一。

weixin_41553587的博客 895

飞牛fnNAS虚拟机标准安装

飞牛NAS是一款基于Debian开发的国产免费NAS系统,支持x86架构设备,可将闲置硬件改造为NAS服务器。系统安装简便,支持多种存储模式与硬盘休眠功能,具备智能影视管理、照片备份等实用功能,并提供多种远程访问方式。飞牛NAS还支持Docker扩展,目前已承诺永久免费。文章详细介绍了在VMware虚拟机中安装飞牛NAS的步骤,包括下载镜像、创建虚拟机、初始化设置等过程,并展示了创建共享文件夹等基本操作,帮助用户快速上手这款功能强大的免费NAS系统。

dgnankai的专栏 3260

Binder机制深入理解

每一个应用程序都是由一些Activity和Service组成的,这些Activity和Service有可能运行在同一个进程中,也有可能运行在不同的进程中。作为一名Android开发,我们每天都在和Binder打交道,虽然可能有的时候不会注意到,譬如:startActivity的时候,会获取AMS服务,调用AMS服务的startActivity方法startActivity传递的对象为什么需要序列化bindService为什么回调的是一个IBinder对象多进程应用,各个进程之间如何通信。

杨充 3869

u-boot-2014.10移植第22天----添加nand flash命令支持(四)

解决问题:nand0: MTD Erase failure: -5 drivers/mtd/nand/nand_bbt.c文件中初始化bbt/* * Allocate memory (2bit per block) and clear the memory bad block * table. */ this->bbt = kzalloc(len, GFP_

fulinux的博客 3632

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Anroid IPC机制之:Binder机制的自我理解

Anroid IPC机制之:Binder机制的自我理解

Jon.Lo 的专栏 800

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Binder机制自己理解

binder 是Android一种进程间通信的一种方式,他是基于c-s 框架的通信方式。 binder通信基本分为4个对象,1.client 客户端 2.service 服务端 3,service manger 服务管理对象,4,binder 驱动 其实客户端和服务端是相当概念,比如 AMS PMS senorService 等一些概念,如果相当于我们自己的应用时,他就是服务端,我们自...

qq_32030555的博客 262

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

NTscan扫描工具

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

Binder机制 简单理解

一、概述 Android系统中,涉及到多进程间的通信底层都是依赖于Binder IPC机制。例如当进程A中的Activity要向进程B中的Service通信,这便需要依赖于Binder IPC。不仅于此,整个Android系统架构中,大量采用了Binder机制作为IPC(进程间通信)方案。 当然也存在部分其他的IPC方式,如管道、SystemV、Socket等。那么Android为什么不使用这...

ZhangJiqun&191cm&85kg 629

理解Binder RPC机制

Understanding AndroidInternals – Binder RPC Mechanism February 14,2014 charlesz2014Leave a comment Binder Services are ubiquitous on anAndroid device; In the framework stack,  probably every shar

山猫号的专栏 818

简单理解binder机制

简单理解binder机制以及其对比传统socket的优势

weixin_47056106的博客 1017

Binder机制完全理解

Binder机制 看过了很多关于Binder的文章,但是总感觉模模糊糊的,没抓住重点。所以写下此文,梳理自己理解的Binder。

zhangxi1224的博客 151

简单理解Binder机制的原理

一、概述 Android系统中涉及到多进程通信底层都是依赖Binder IPC机制。例如当进程A中的Activity想要向进程B的Service通信,这就需要用到IPC。不仅如此,整个Android系统架构中,大量采用了Binder机制作为IPC(进程间通信)方案。 当然也存在其他的通信方式,如管道、消息队列、socket、内存共享、SystemV等。那为什么Android不使用这些原有的技术,而...

慕涵的博客 5639

深入理解Binder机制

Binder概述   Binder其前身是由Be Inc.和Palm,Inc.开发的OpenBinder,而后Google将其带入Android系统作为主要的跨进程通信技术使用。Binder之所以能被Google青睐跟其优越的传输性能及安全性能是分不开的。在传输性能上,传统的linux系统IPC如Socket、管道、消息队列等在跨进程传输时数据会被拷贝2次,而Binder则利用mmap只需一次拷贝...

乌啼夜的酒痕 2684

Binder机制-个人理解

用户空间 client进程:再service manager清单中寻找连接的server进程id,获取proxy代理类,进行通讯 server进程:再service manager清单中注册自己id。 service manager负责维护代理类和相关server清单 由于用户空间数据不能同步,client,server,service manager都是通过ioctl()函数和内核空间操作的 ioctl是设备驱动程序中对设备I/O通道进行管理的函数,就是对设备的一些特性进行控制。 例如串口传输波特率,

云梦九章~ 9431
上一篇: LiveData与MutableLiveData详解
下一篇: adb 操控系统命令开关
金陵张大炮
博客等级 码龄9年 30粉丝 86原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值