Files
MobileGL/docs/Disaggregated/guide/embedded-server.md
T

3.3 KiB
Raw Blame History

在宿主 APK 中嵌入 split server

宿主应用可直接加载 libMobileGL.so,把自己持有的 ANativeWindow 交给 server。 窗口、输入和 Android Service 的生命周期由宿主 APK 管理;不需要安装 MobileGL plugin APK。 公共接口是 EmbeddedServer.h, 只使用 C 类型,也可通过 dlsym 调用。构建必须开启 MOBILEGL_BUILD_DISAGGREGATED。

有窗口的合成器服务

在加载库前设置 MOBILEGL_IPC_ROLE=server、MOBILEGL_IPC_DIAL=no,清除 MOBILEGL_TRANSPORT、MOBILEGL_IPC_SERVER_PATH、MOBILEGL_IPC_RING_MB 和 MOBILEGL_IPC_STAGE_MB。建议放在宿主 APK 的独立服务进程中,以免渲染故障结束 UI 进程。

  1. 调用 mobilegl_server_display_install_android(request_geometry, user)。 回调可为空;有回调时,它在 apply 线程运行,必须快速返回,把尺寸变更交给宿主线程。
  2. 从宿主的 Surface 获取 ANativeWindow,调用 mobilegl_server_display_attach_android(window, width, height)。 server 独立持有引用,调用者随后释放自己的引用。同一窗口再次 attach 只更新尺寸。
  3. 在服务线程调用 mobilegl_server_serve_inprocess("@anland-mobilegl-compositor")。 这会在当前进程接受一个 client 会话。AF_UNIX 控制连接用 SCM_RIGHTS 传递共享内存段, 数据通过 SHM 环传输。客户端设置 MOBILEGL_TRANSPORT=spawn、 MOBILEGL_IPC_CONTROL=unix:@anland-mobilegl-compositor、MOBILEGL_IPC_DATA=shm 和 MOBILEGL_IPC_SURFACE=server。
  4. Surface 销毁时调用 mobilegl_server_display_detach(3000)。 返回值 0/1/2/3 分别为无窗口、直接释放、会话释放后完成、超时。 超时会保留引用,直到 apply 线程停止使用窗口;当前失窗会结束活动会话。
  5. 服务停止时调用 mobilegl_server_stop_inprocess(),等待 serve 线程返回,再调用 mobilegl_server_display_uninstall(3000)。几何回调的 user 对象应至少活到此时。

width/height 为零时,Android attach 从 ANativeWindow 查询尺寸。几何回调收到正尺寸表示 请求固定缓冲尺寸,收到 0/0 表示恢复宿主布局尺寸;宿主应通过后续 attach 报告实际结果。 安装、attach、detach 和 uninstall 由宿主串行调用。库拒绝替换已安装的 display 或尚未结束 的旧窗口租约,避免晚到的释放使用另一组引用回调。

并发的离屏应用服务

一个进程仍只有一套 backend/GL 状态。有窗口的服务只接一个合成器;其他 EGL client 可连接 宿主 APK 打包的 libMobileGLServer.so 可执行文件,由另一个服务进程负责启动和结束:

<nativeLibraryDir>/libMobileGLServer.so @anland-mobilegl --serve --max-sessions 16

--max-sessions 是活动会话上限,接受 1..64,默认仍为 1。大于 1 只适用于 AF_UNIX 的 --serve 离屏 supervisor。每个 client 单独 fork worker,拥有独立 backend, 共享内存与其他会话隔离;worker 退出后归还名额,supervisor 结束时所有 worker 一起结束。 这些 worker 没有 display,客户端应清除 MOBILEGL_IPC_SURFACE,由客户端 WSI 提交窗口图像。

进程隔离解决多个应用同时连接的问题;同一应用中的真正多 context/share-group 支持仍需另行实现。