IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android 进程通讯机制之Binder(信使)架构以及内存映射详解 -> 正文阅读

[移动开发]Android 进程通讯机制之Binder(信使)架构以及内存映射详解

注册服务

Server进程 通过Binder驱动 向 Service Manager进程 注册服务

注册服务后,Binder驱动持有 Server进程创建的Binder实体

Binder binder = new Stub();

// 步骤1:创建Binder对象 ->>分析1

// 步骤2:创建 IInterface 接口类 的匿名类

// 创建前,需要预先定义 继承了IInterface 接口的接口 -->分析3

IInterface plus = new IPlus(){

// 确定Client进程需要调用的方法

public int add(int a,int b) {

return a+b;

}

// 实现IInterface接口中唯一的方法

public IBinder asBinder(){

return null ;

}

};

// 步骤3

binder.attachInterface(plus,“add two int”);

// 1. 将(add two int,plus)作为(key,value)对存入到Binder对象中的一个Map<String,IInterface>对象中

// 2. 之后,Binder对象 可根据add two int通过queryLocalIInterface()获得对应IInterface对象(即plus)的引用,可依靠该引用完成对请求方法的调用

// 分析完毕,跳出

<-- 分析1:Stub类 -->

public class Stub extends Binder {

// 继承自Binder类 ->>分析2

// 复写onTransact()

@Override

boolean onTransact(int code, Parcel data, Parcel reply, int flags){

// 具体逻辑等到步骤3再具体讲解,此处先跳过

switch (code) {

case Stub.add:{

data.enforceInterface(“add two int”);

int arg0 = data.readInt();

int arg1 = data.readInt();

int result = this.queryLocalIInterface(“add two int”) .add( arg0, arg1);

reply.writeInt(result);

return true;

}

}

return super.onTransact(code, data, reply, flags);

}

// 回到上面的步骤1,继续看步骤2

<-- 分析2:Binder 类 -->

public class Binder implement IBinder{

// Binder机制在Android中的实现主要依靠的是Binder类,其实现了IBinder接口

// IBinder接口:定义了远程操作对象的基本接口,代表了一种跨进程传输的能力

// 系统会为每个实现了IBinder接口的对象提供跨进程传输能力

// 即Binder类对象具备了跨进程传输的能力

void attachInterface(IInterface plus, String descriptor);

// 作用:

// 1. 将(descriptor,plus)作为(key,value)对存入到Binder对象中的一个Map<String,IInterface>对象中

// 2. 之后,Binder对象 可根据descriptor通过queryLocalIInterface()获得对应IInterface对象(即plus)的引用,可依靠该引用完成对请求方法的调用

IInterface queryLocalInterface(Stringdescriptor) ;

// 作用:根据 参数 descriptor 查找相应的IInterface对象(即plus引用)

boolean onTransact(int code, Parcel data, Parcel reply, int flags);

// 定义:继承自IBinder接口的

// 作用:执行Client进程所请求的目标方法(子类需要复写)

// 参数说明:

// code:Client进程请求方法标识符。即Server进程根据该标识确定所请求的目标方法

// data:目标方法的参数。(Client进程传进来的,此处就是整数a和b)

// reply:目标方法执行后的结果(返回给Client进程)

// 注:运行在Server进程的Binder线程池中;当Client进程发起远程请求时,远程请求会要求系统底层执行回调该方法

final class BinderProxy implements IBinder {

// 即Server进程创建的Binder对象的代理对象类

// 该类属于Binder的内部类

}

// 回到分析1原处

}

<-- 分析3:IInterface接口实现类 -->

获取服务

Client进程 使用 某个 service前,须 通过Binder驱动 向 ServiceManager进程 获取相应的Service信息,Client进程与 Server进程已经建立了连接

使用服务

Client进程 根据获取到的 Service信息(Binder代理对象),通过Binder驱动 建立与 该Service所在Server进程通信的链路,并开始使用服务

  • Client进程 将参数(整数a和b)发送到Server进程

  • Server进程 根据Client进程要求调用 目标方法(即加法函数)

  • Server进程 将目标方法的结果(即加法后的结果)返回给Client进程

四.Binder与内存映射mmap


Binder IPC 是基于内存映射(mmap)来实现的,但是 mmap() 通常是用在有物理介质的文件系统上的。

进程中的用户区域是不能直接和物理设备打交道的,如果想要把磁盘上的数据读取到进程的用户区域,需要两次拷贝(磁盘–>内核空间–>用户空间);通常在这种场景下 mmap() 就能发挥作用,通过在物理介质和用户空间之间建立映射,减少数据的拷贝次数,用内存读写取代I/O读写,提高文件读取效率。

而 Binder 并不存在物理介质,因此 Binder 驱动使用 mmap() 并不是为了在物理介质和用户空间之间建立映射,而是用来在内核空间创建数据接收的缓存空间。

一次完整的 Binder IPC 通信过程通常是这样:

文末

初级工程师拿到需求会直接开始做,然后做着做着发现有问题了,要么技术实现不了,要么逻辑有问题。

而高级工程师拿到需求会考虑很多,技术的可行性?对现有业务有没有帮助?对现有技术架构的影响?扩展性如何?等等…之后才会再进行设计编码阶段。

而现在随着跨平台开发,混合式开发,前端开发之类的热门,Android开发者需要学习和掌握的技术也在不断的增加。

通过和一些行业里的朋友交流讨论,以及参考现在大厂面试的要求。我们花了差不多一个月时间整理出了这份Android高级工程师需要掌握的所有知识体系。你可以看下掌握了多少。

混合式开发,微信小程序。都是得学会并且熟练的

这些是Android相关技术的内核,还有Java进阶

高级进阶必备的一些技术。像移动开发架构项目实战等

Android前沿技术;包括了组件化,热升级和热修复,以及各种架构跟框架的详细技术体系

以上即是我们整理的Android高级工程师需要掌握的技术体系了。可能很多朋友觉得很多技术自己都会了,只是一些新的技术不清楚而已。应该没什么太大的问题。

而这恰恰是问题所在!为什么别人高级工程师能年限突破30万,而你只有十几万呢?

就因为你只需补充你自己认为需要的,但并不知道企业需要的。这个就特别容易造成差距。因为你的技术体系并不系统,是零碎的,散乱的。那么你凭什么突破30万年薪呢?

我这些话比较直接,可能会戳到一些人的玻璃心,但是我知道肯定会对一些人起到点醒的效果的。而但凡只要有人因为我的这份高级系统大纲以及这些话找到了方向,并且付出行动去提升自我,为了成功变得更加努力。那么我做的这些就都有了意义。

喜欢的话请帮忙转发点赞一下能让更多有需要的人看到吧。谢谢!

而这恰恰是问题所在!为什么别人高级工程师能年限突破30万,而你只有十几万呢?

就因为你只需补充你自己认为需要的,但并不知道企业需要的。这个就特别容易造成差距。因为你的技术体系并不系统,是零碎的,散乱的。那么你凭什么突破30万年薪呢?

我这些话比较直接,可能会戳到一些人的玻璃心,但是我知道肯定会对一些人起到点醒的效果的。而但凡只要有人因为我的这份高级系统大纲以及这些话找到了方向,并且付出行动去提升自我,为了成功变得更加努力。那么我做的这些就都有了意义。

喜欢的话请帮忙转发点赞一下能让更多有需要的人看到吧。谢谢!

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-02-04 11:08:59  更:2022-02-04 11:10:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 13:46:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码