SufraceFlinger图像合成原理(2)-SurfaceFlinger与应用进程间的通信

SF提供与其他进程通信的两个Binder : ISurfaceComposer、ISurfaceComposerClient。

每个应用进程会创建一个SurfaceComposerClient对象,用于和SF通信SurfaceComposerClient实例创建后调用onFirstRef

/frameworks/native/libs/gui/SurfaceComposerClient.cpp

ini 复制代码
void SurfaceComposerClient::onFirstRef() {
    // 1.
    sp<ISurfaceComposer> sf(ComposerService::getComposerService());
    if (sf != nullptr && mStatus == NO_INIT) {
        sp<ISurfaceComposerClient> conn;
        // 2. 
        conn = sf->createConnection();
        if (conn != nullptr) {
            mClient = conn;
            mStatus = NO_ERROR;
        }
    }
}

onFirstRef中获取了ISurfaceComposer和ISurfaceComposerClient两个binder的代理对象

  1. 通过ServiceManager获取SurfaceFlinger 服务代理对象

    1. ComposerService::getComposerService()
    2. -> ComposerService::getInstance().connectLocked()
    3. /frameworks/native/libs/gui/SurfaceComposerClient.cpp
arduino 复制代码
68  bool ComposerService::connectLocked() {
69      const String16 name("SurfaceFlinger");
        //waitForService是通过ServiceManager获取系统服务
70      mComposerService = waitForService<ISurfaceComposer>(name);
71      if (mComposerService == nullptr) {
72          return false; // fatal error or permission problem
73      }
74  
        ... ...
90  }
  1. 通过sf->createConnection(),获取ISurfaceComposerClient代理对象

/frameworks/native/libs/gui/ISurfaceComposer.cpp

kotlin 复制代码
class BpSurfaceComposer : public BpInterface<ISurfaceComposer>
{
  virtual sp<ISurfaceComposerClient> createConnection(){
      Parcel data, reply;
      data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
      remote()->transact(BnSurfaceComposer::CREATE_CONNECTION, data, &reply);
      return interface_cast<ISurfaceComposerClient>(reply.readStrongBinder());
  }       

}

调用到服务端BnSurfaceComposer

css 复制代码
status_t BnSurfaceComposer::onTransact(
  uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags){
  switch(code) {
      case CREATE_CONNECTION: {
          CHECK_INTERFACE(ISurfaceComposer, data, reply);
          sp<IBinder> b = IInterface::asBinder(createConnection());
          reply->writeStrongBinder(b);
          return NO_ERROR;
    ... ...

最后在SurfaceFlinger 中会创建一个Client对象,即BnSurfaceComposerClient对象,所以每个应用进程在SurfaceFlinger中都有一个Client对象与之对应

/frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp

arduino 复制代码
522  sp<ISurfaceComposerClient> SurfaceFlinger::createConnection() {
523      const sp<Client> client = new Client(this);
524      return client->initCheck() == NO_ERROR ? client : nullptr;
525  }

Client对象持有SurfaceFlinger的引用

kotlin 复制代码
class Client : public BnSurfaceComposerClient
{
    ... ...
    sp<SurfaceFlinger> mFlinger;
}

到此涉及到的类关系图如下:

  • ISurfaceComposer:应用端与SurfaceFlinger 通信,主要是SurfaceFlinger提供的各种操作,如 setTransactionState更新状态去触发合成
  • ISurfaceComposerClient:应用端与SurfaceFlinger进程的Client通信,主要是是layer 相关操作,如createLayer 等
相关推荐
天空之城--7 小时前
Android逆向安全合规接单指南
android·安全
消失的旧时光-19439 小时前
Android 系统层扫盲 09:AMS、ATMS、WMS、PMS 到底分别管什么?
android·wms·pms·ams·aosp·atms
Godikov9 小时前
Android 系统级设备应用踩坑实录:sharedUserId 签名、SDK 授权失败 -4、开机自启与 U 盘 OTA 升级
android
IT毕设实战小研13 小时前
基于大数据的国内主要农作物产量趋势分析与可视化
android·java·大数据·django·课程设计
企业数字化笔记14 小时前
固定资产历史数据怎么导入系统?Excel模板、字段映射和数据校验
android·java·数据库·后端
龙之叶14 小时前
Android出海系列-GMS认证介绍
android
潮族大Z14 小时前
Android性能优化:启动、内存、卡顿的一站式排查手册
android
事圆则缓16 小时前
从suspend字节码到 Retrofit 协程桥:挂起函数识别与恢复
android·retrofit
杉氧17 小时前
RN 性能调优指南:重渲染(Re-renders)控制与长列表(FlatList)优化
android·前端·react native
Coffeeee17 小时前
claude-video 一个让你的Agent拥有看视频能力的Skill
android·人工智能·aigc