`
daojin
  • 浏览: 689979 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

安卓高手之路之java层Binder

阅读更多

     很多人一提到Binder就说代理模式,人云亦云的多,能理解精髓的少。 本篇文章就从设计角度分析一下java层BInder的设计目标,以及设计思路,设计缺陷,从而驾驭它。

     对于【邦德儿】的理解, 从通信的角度来看,就是一种通信方式而已,与socket没有任何区别。客户端transact,服务端onTransact.  但是,从【邦德儿】本身来说,如果客户端和服务端在一个进程,那么再通过底层驱动去把数据转过去就显得多余了。基于这种理论,设计的时候,如果客户端和服务端在一个进程就直接函数调用,而不再通过驱动。对于调用者来说,他只需要得到一个接口用来transact。并不愿意知道具体的通信细节。也就是说,不关心是否是通过【邦德儿】驱动来传输的,还是直接在同进程通过函数的调用传输的。调用者确实不愿意关心,调用者不愿意关心的,那么被调用者就得关心,不然代码谁来写。所以【邦德儿】本身必须要处理这两种情况:

        1.在同一个进程。这个对应的是Binder。

        2.不在同一个进程。这个对应的是BInderProxy。

    对于调用者来说,这两个东西都实现了IBinder接口中的transact函数。BInderProxy通过底层驱动,把数据传输到服务端而BInder则直接通过内部调用转给onTransact处理。

    附注:

在这里吐槽一下google。命名莫名其妙故弄玄虚。看到一个IBinder,脑子里除了邦德儿之外没有别的想法。我觉得,在设计上transact应该对应一个ISenderBinder,而onTransact对应一个IReceiverBinder。Binder实现了ISenderBinder和IReceiverBinder接口。这样的逻辑才够清晰。客户端只要看到ISenderBinder就倍感亲切,服务端只要看到IReceiverBinder就感觉自己在为别人做好事。一开始要做的事情就是打开通信通道,也就是把ISenderBinder这个东西对应的对象传给客户端。而服务端用谁进行服务都无所谓,只要是跟ISenderBinder是一对的就OK。BInderProxy应该叫做SenderBinder才合适。

 

 

       那么对于应用程序来说,他需要什么?他需要函数调用,而不是transact这类东西。如果整天关心这些底层的打包解包那么也就很头大了。IActivityManager这个是用户需要的接口,之前的transact接口明显不合适让用户使用。把恶心的transact函数适配到IActivityManager。用户用起来更好用了。既然是适配,那么就有个接口转换。一个叫做asInterface,一个叫做asBInder。网上一讲这个东西就说是代理。这是其实是适配。asInterface将IBinder适配为IActivityManager。而asBInder将IActivityManager适配为IBinder。

       google的代码里面,经常把这个能代表远程对象的东西叫做代理。仅此而已。只要能代表远程对象并执行函数。那么就叫做代理。具体怎么实现的,并不关心。在这里代理只是一种脱离实际代码的宏愿。

 

 

  • 大小: 33.1 KB
分享到:
评论

相关推荐

    android 的binder机制在java、c++层的实现

    在Java层,Binder是`android.os.Binder`类的一个实例,它作为接口暴露给应用层,允许服务调用远程对象的方法。在C++层,Binder是基于Linux内核驱动的,实现了跨进程的数据传输和方法调用。 **Java层实现**: 1. **...

    Binder机制在应用程序框架层的Java接口源代码分析

    本文将深入剖析Android应用程序框架层中Binder机制的Java接口源代码,特别是针对`ServiceManager`相关类的实现细节。 #### Binder机制简介 Binder机制主要由以下几部分组成: - **Binder服务**:运行在`Zygote`...

    从java到C解析Binder机制

    `ServiceManager`在C层的实现中,通过binder.h头文件定义的enum常量与Java层的`IServiceManager`接口方法相对应,使得两者能够正确地调用和处理相应的服务请求。例如,`GET_SERVICE_TRANSACTION`与`SVC_MGR_GET_...

    Android Binder C/C++层实现示例

    本示例"Android Binder C/C++层实现示例"着重展示了如何在C/C++层面进行Binder通信的实现,这对于深入理解Android系统的底层工作原理至关重要。 一、Binder架构 Binder架构包括Client、Server、Service Manager和...

    android通信机制binder实例

    在Android系统中,Binder是实现进程间通信(IPC,Inter-Process Communication)的关键技术,它是一种轻量级的通信机制,使得应用程序之间可以共享服务和数据。本篇将通过一个学习实例来深入理解Android Binder的...

    move android binder to linux

    标题中的“move android binder to linux”意味着我们要探讨的是如何将Android系统的Binder通信机制移植到Linux环境中。Binder是Android系统中的核心组件,它负责进程间通信(IPC,Inter-Process Communication),...

    android中c++层binder例子

    3. sdkserver是binder服务(编译后生成sdkserver二进制),sdklib是binder的client(编译生成so),sdkclient(编译生成bin)是用来测试sdklib的。 4. 编译完成后把两个bin文件放到andoid系统的/system/bin目录下,...

    Android学习笔记--Binder

    Java层的Binder接口定义和实现主要位于`android.os.Binder`和`android.os.IBinder`类中,而C/C++层的Binder实现则分布在`frameworks\base\libs\utils`目录下的多个源文件中,如`Binder.cpp`、`BpBinder.cpp`等。...

    java binder资料

    java binder资料java binder资料java binder资料java binder资料java binder资料java binder资料java binder资料java binder资料java binder资料java binder资料java binder资料java binder资料java binder资料

    android binder 简单实例

    在Android系统中,Binder是实现进程间通信(IPC,Inter-Process Communication)的关键技术,它是一种轻量级的通信机制,使得应用可以跨越进程边界,与系统服务或者其他应用进行数据交换。下面,我们将深入探讨...

    Android Binder机制完全解析

    总结,Binder机制是Android系统的核心组件之一,它为Android提供了强大的进程间通信能力,使得系统服务和应用程序能够高效地协同工作。理解和掌握Binder,对于提升Android开发技能,优化系统性能,以及解决复杂的...

    BinderJava

    Binder简化例子, 只使用java演示Binder和Service实现。希望对写新的跨进程Service有帮助。

    Android的IPC机制-Binder

    ### Android的IPC机制-Binder ...通过以上内容,我们可以看到,Binder机制是Android系统中进程间通信的核心技术之一,它不仅提高了系统的效率和安全性,还为开发者提供了强大的工具来构建复杂的应用和服务。

    Android binder_test

    Android系统原本是用Java来编写应用程序,但Binder框架允许开发者使用C++进行底层的IPC实现。C++的Binder实现通常包括`IBinder`接口、`Binder`类以及自定义的Service代理类。`IBinder`是所有Binder接口的基础,`...

    Android aidl Binder框架浅析

    **Android aidl Binder框架浅析** 在Android系统中,服务间的通信是通过Binder机制实现的,它是Android系统中进程间通信(IPC)的核心组件。Binder框架允许不同进程间的对象互相调用方法,使得数据和操作可以在不同...

    Android Binder机制

    Android Binder机制是Android系统的核心组件之一,它负责进程间通信(IPC,Inter-Process Communication),使得不同应用程序或者同一系统中的不同组件能够有效地交互。在Android系统中,由于每个应用程序运行在自己...

    binder java端测试程序

    2. **Binder对象**: 是实现跨进程通信的实际载体,它是一个C++类,但在Java层通常通过`IBinder`接口进行操作。每个Binder服务都由一个实现了`IBinder`接口的类来表示。 3. **Parcel**: Parcel是Android系统提供的一...

    android native层 binder通信机制演示源码

    在Android的Native层进行Binder通信,可以提升性能并降低内存占用,因为Native代码可以直接操作C/C++的数据结构,而无需通过Java的序列化和反序列化过程。 本压缩包提供了基于Android的Native层Binder通信的源码...

    android binder

    根据之前的博文介绍,《Android系统的Binder机制之二——服务代理对象(1)》,`ProcessState`对象负责管理Service的代理对象,确保进程能够正确地使用Binder机制进行通信。 2. **Service注册**: Mediaserver中...

Global site tag (gtag.js) - Google Analytics