ImageCreator/ImageReceiver 与 Surface 生命周期知识入口

适用范围

涉及 ImageCreatorImageReceiver、surface、native buffer、监听回调、生产消费队列、跨进程 buffer 生命周期或 NDK receiver/creator 接口时,先读本文档。

快速代码地图

  • Creator 实现:frameworks/innerkitsimpl/creator/
  • Receiver 实现:frameworks/innerkitsimpl/receiver/
  • JS/NAPI 入口:frameworks/kits/js/ 中 image creator/receiver 相关文件。
  • NDK 入口:frameworks/kits/native/frameworks/kits/js/common/ndk/ 中 image receiver native 相关文件。
  • 相关依赖:graphic_surfacegraphic_2dipceventhandler

术语触发词

ImageCreatorImageReceiver、Surface、SurfaceBuffer、native buffer、native window、fence、listener、acquire、release、close、queue、consumer、producer、fd。

先判断的问题

  • 改动影响生产者、消费者,还是监听和回调调度。
  • buffer 是由应用写入、解码链路写入,还是图形侧生产。
  • 是否涉及 surface id、native window、release/acquire、fence、stride、usage 或跨进程传输。
  • 对外对象是 JS 对象、NDK handle,还是 Native inner 对象。
  • 是否需要真实设备验证显示、相机、图形或硬件 codec 行为。

关键边界

  • Creator/Receiver 的核心风险是 buffer 生命周期,必须成对检查 acquire、release、close、listener 解绑和异常退出路径。
  • JS/NDK handle 生命周期要和底层 surface/native buffer 对齐,不能让应用侧对象悬空引用已释放资源。
  • 回调通常跨线程或事件队列触发,修改时要确认锁顺序、线程退出和重复回调。
  • 真实设备上的 surface、fence、usage 和硬件 codec 行为可能与本地 mock 不一致。
  • 跨进程传输或共享 buffer 时,要额外考虑恶意参数、fd 泄漏和权限边界。

常见风险

  • 异常路径没有 release buffer,导致队列卡死或 fd 泄漏。
  • 监听对象释放后仍被异步回调访问。
  • JS/NDK 层重复 close 或重复 release,引发二次释放。
  • 本地 mock 测试通过,但真实设备上因为 usage、stride 或 fence 行为不同失败。
  • 错误码转换不一致,应用侧无法区分无图、已释放、参数错误和底层 surface 失败。

Ask before / 必须人工确认

  • 改 acquire/release/close 生命周期、监听回调顺序、线程调度或锁顺序。
  • 改 surface/native buffer usage、stride、fence、queue 深度或跨进程传输语义。
  • 改 JS/NDK handle 生命周期、释放函数、错误码或异常行为。
  • 改依赖图形、相机、硬件 codec 或真实设备行为的路径。
  • 没有真实设备但改动影响 surface、native buffer 或显示链路。

验证建议

  • Creator 改动:优先跑 creatortestcreatormocktest
  • Receiver 改动:优先跑 receivertestimage_receiver_native_test
  • JS/NDK 行为变化:补跑 napitestndktest 或最近 native receiver 测试,并验证对应 XTS。
  • 常用单测命令模板:
prebuilts/build-tools/linux-x86/bin/ninja -C out/<product-name> creatortest creatormocktest receivertest image_receiver_native_test
prebuilts/build-tools/linux-x86/bin/ninja -C out/<product-name> napitest ndktest ndktest2
  • 安全和异常路径:补跑 ImageReceiverFuzzTest,加入重复 release、空 buffer、异常尺寸和截断 Parcel/TLV 样例。
  • surface、硬件 codec、显示链路相关:需要真实设备验证,记录产品、场景、buffer 参数和结果。

待补充背景

  • 团队常用的真实设备验证步骤和场景样例。
  • Creator/Receiver 与图形、相机、硬件 codec 子系统之间的接口约定。
  • 历史问题中 fd 泄漏、回调悬空、队列卡死和 usage/stride 不匹配的典型案例。