2.类的架构

作者: Wi1ls努力努力再努力 | 来源:发表于2019-07-02 09:25 被阅读0次

支持 Binder 通讯的架构在 Java 和 native 是不同的架构。
先来看 native 的架构,以 SurfaceFlinger 为例先来看类的继承,先来看本地服务。

//SurfaceFlinger.h
class SurfaceFlinger : public BnSurfaceComposer

//ISurfaceComposer.h
class BnSurfaceComposer : public BnInterface<ISurfaceComposer>
class ISurfaceComposer : public IInterface

//IInterface.h
template<typename INTERFACE>
class BnInterface : public INTERFACE, public BBinder

//Binder.h
class BBinder : public IBinder

//IBinder.h
class IBinder : public virtual RefBase

//IInterface.h
class IInterface : public virtual RefBase
SurfaceFlinger 服务端的架构

接下来看提供给 Client 使用的代理类

//ISurfaceComposer.cpp
class BpSurfaceComposer : public BpInterface<ISurfaceComposer>

//IInterface.cpp
template<typename INTERFACE>
class BpInterface : public INTERFACE, public BpRefBase

//Binder.h
class BpRefBase : public virtual RefBase
SurfaceFlinger Client 端的架构

在 IInterface.h 中有两个重要的宏

#define DECLARE_META_INTERFACE(INTERFACE)                               \
    static const android::String16 descriptor;                          \
    static android::sp<I##INTERFACE> asInterface(                       \
            const android::sp<android::IBinder>& obj);                  \
    virtual const android::String16& getInterfaceDescriptor() const;    \
    I##INTERFACE();                                                     \
    virtual ~I##INTERFACE();                                            \


#define IMPLEMENT_META_INTERFACE(INTERFACE, NAME)                       \
    const android::String16 I##INTERFACE::descriptor(NAME);             \
    const android::String16&                                            \
            I##INTERFACE::getInterfaceDescriptor() const {              \
        return I##INTERFACE::descriptor;                                \
    }                                                                   \
    android::sp<I##INTERFACE> I##INTERFACE::asInterface(                \
            const android::sp<android::IBinder>& obj)                   \
    {                                                                   \
        android::sp<I##INTERFACE> intr;                                 \
        if (obj != NULL) {                                              \
            intr = static_cast<I##INTERFACE*>(                          \
                obj->queryLocalInterface(                               \
                        I##INTERFACE::descriptor).get());               \
            if (intr == NULL) {                                         \
                intr = new Bp##INTERFACE(obj);                          \
            }                                                           \
        }                                                               \
        return intr;                                                    \
    }                                                                   \
    I##INTERFACE::I##INTERFACE() { }                                    \
    I##INTERFACE::~I##INTERFACE() { }  

这两个宏在进行本地类和代理类转换的时候异常重要,以 SurfaceFlinger 服务为例。在 ISurfaceComposer.h 中申明了DECLARE_META_INTERFACE,在ISurfaceComposer.cpp 中申明了IMPLEMENT_META_INTERFACE

//ISurfaceComposer.h
class ISurfaceComposer : public IInterface {
public:
  DECLARE_META_INTERFACE(SurfaceComposer);
...
}

//ISurfaceComposer.cpp
IMPLEMENT_META_INTERFACE(SurfaceComposer, "android.ui.ISurfaceComposer");

进行宏替换后

//ISurfaceComposer.h
class ISurfaceComposer : public IInterface {
public:
  static const android::String16 descriptor;
  static android::sp<ISurfaceComposer> asInterface(const android::sp<android::IBinder>& obj);
  virtual const android::String16& getInterfaceDescriptor() const;
  ISurfaceComposer( );
  virtual ~ISurfaceComposer 
  ...
}
//在ISurfaceComposer.cpp中实现
const android::String16 ISurfaceComposer::descriptor("android.ui.ISurfaceComposer");
const android::String16& ISurfaceComposer::getInterfaceDescriptor( ) const {
  return ISurfaceComposer::descriptor;
}
android:sp<ISurfaceComposer> ISurfaceComposer::asInterface(const android::sp<android::IBinder>& obj) {
  android::sp<ISurfaceComposer> intr;
  if (obj != NULL ) {
    intr = static_Cast<ISurfaceComposer*>(obj->queryLocalInterface(ISurfaceComposer::descriptor).get( ));
    if( intr == NULL) {
      intr = new BpSurfaceComposer(obj);
    }
  }
  return intr;  
}

//其中几个方法
//IInterface.h
inline sp<IInterface> BnInterface<ISurfaceComposer::queryLocakInterface>(const String16& _descritprot) {
  if(_descriptor == ISurfaceComposer::descriptor) return this;
  return NULL;
}

inline const String16& BnInterface<ISurfaceComposer>::getInterfaceDescriptor() const
{
  return ISurfaceComposer::getInterfaceDescriptor( );
}

IBinder* BnInterface<ISurfaceComposer>::onAsBinder( )
{
  return this;
}

---

inline BpInterface<ISurfaceComposer>::BpInterface(const sp<IBinder>& remote)
    : BpRefbase(remote)
{
}

inline IBinder* BpInterface<ISurfaceComposer>::onAsBinder(){
  return remote( );
}

有了这些数据结构和重要的函数作为基础,下面就方便我们进行分析了

相关文章

  • 2.类的架构

    支持 Binder 通讯的架构在 Java 和 native 是不同的架构。先来看 native 的架构,以 Su...

  • TabLayout+Fragment+PullToRefresh

    技术点描述: 1.MVC架构,分包明确、抽取Activity基类和Fragment基类2.异步 AsyncTask...

  • java基础-day19-Map和File类

    Map和File类 1. Map双边队列 1.1 Map概述 1.2 Map组织架构 2. File类 2.1Fi...

  • Android UI架构浅析

    1.AndroidUI架构 对于我们一个Activity,其对应的UI架构如下: 而UI类图关系是: 2.应用程序...

  • 2.类

    用类制造对象 对象与类 1.对象是实体,需要别创建,可以为我们做事情2.类是规范,根据类的定义来创建对象对象(这只...

  • AFNetworking笔记

    1.整体架构 2.核心类 AFURLSessionManager 2.1.初始化方法 init 1)首先我们要明确...

  • 非常值得看的文章集合,会持续更新

    1.runloop 2.架构1、架构2、架构3、架构4、架构5

  • 架构之路

    1. 架构之路 (一) —— iOS原生系统架构(一)2. 架构之路 (二) —— APP架构分析(一)3. 架构...

  • MVC、MVP、MVVM

    什么是架构?没有统一的明确定义,架构,类与类的交互、模块与模块之间的交互、业务与业务之间的交互,都可以称之为架构。...

  • 底层-设计模式和架构

    架构 何为架构: 软件开发中的设计方案类与类之间的关系、模块与模块之间的关系、客户端与服务端的关系 常见架构名词:...

网友评论

    本文标题:2.类的架构

    本文链接:https://www.haomeiwen.com/subject/xyyacctx.html