什么是 Complication?它在 Watch Face 中的作用是什么?

解读

国内 Wear OS 面试里,90% 的候选人会把 Complication 直译成“并发症”,结果面试官一听就知道没做过表盘。
这道题考察两个维度:

  1. 是否真正理解 Wear OS 的“数据插件”机制,而不是把它当成普通 View;
  2. 能否把 Complication 与表盘的生命周期、省电、权限、国内无 GMS 场景结合起来讲落地方案。
    答不到“Provider-Manager-Renderer 三角关系”和“省电刷新”这两点,基本会被追问到卡壳。

知识点

  1. Complication 定义:Wear OS 官方抽象出的“表盘数据占位符”,用于把第三方应用的数据安全地渲染到表盘,而表盘无需申请具体权限。
  2. 系统组成:
    • ComplicationProviderService(数据端,国内多为厂商 SDK 或自建 Service)
    • ComplicationManager(系统调度,控制刷新频率与电量)
    • ComplicationRenderer(表盘侧实现,决定样式、位置、层级)
  3. 数据类型:SHORT_TEXT、LONG_TEXT、RANGED_VALUE、ICON、SMALL_IMAGE、LARGE_IMAGE、MONOCHROMATIC_IMAGE 七种,表盘必须声明支持的类型组合。
  4. 权限模型:Provider 端声明 com.google.android.wearable.permission.BIND_COMPLICATION_PROVIDER,系统通过 bindService 沙箱化访问,表盘侧无额外权限。
  5. 省电机制:系统以 1~10 min 的区间批量拉活 Provider,表盘只负责被动 onComplicationUpdate() 回调,禁止主动轮询;国内无 GMS 时,厂商会复用同一套接口但把调度下沉到厂商框架,需用 ProviderUpdateRequester.requestUpdate() 手动触发。
  6. 表盘配置:通过 ComplicationHelperActivity 弹出系统选择器,用户点选后写入 SharedPreferences,表盘在 onCreate() 读取并注册 ComplicationDrawable 或自定义 Renderer。
  7. 折叠/双屏适配:Complication 区域必须跟随 WatchFaceService.Engine.getBounds() 动态计算,防止被铰链遮挡;国内部分圆形 42 mm 手表底部有 30 px 黑边,需额外做安全区 inset。
  8. 国内分发:华为、小米、OPPO 各自维护无 GMS 的 Complication 框架,包名与类名与 AOSP 一致,但权限字符串可能带厂商前缀,上线前需在真机验证 ProviderInfo.isActive() 返回值。

答案

Complication 是 Wear OS 提供的“表盘数据占位符”标准框架,官方中文译名“复杂功能”。
它把第三方应用的数据(如步数、心率、天气、股票)抽象成七种安全类型,通过系统级 ComplicationManager 统一调度,表盘只需实现 Renderer 即可把数据渲染到指定区域,而无需申请任何额外权限。
作用:

  1. 解耦:表盘只关心样式与动画,数据由系统按需唤醒 Provider,降低耦合与电量消耗。
  2. 安全:利用 bindService 沙箱 + SELinux,表盘无法直接访问 Provider 数据,只能拿到系统裁剪后的 Parcelable。
  3. 用户自定义:长按表盘→“复杂功能”入口→系统选择器,用户可零代码替换数据源,提升留存。
  4. 国内无 GMS 场景:厂商把 ComplicationManager 下沉到厂商框架,表盘与 Provider 的 AIDL 接口不变,但刷新频率由厂商电源策略接管,需调用厂商提供的 requestComplicationUpdate() 主动触发。
    一句话总结:Complication 就是 Wear OS 的“数据插件化”方案,让表盘既能展示丰富信息,又不牺牲电量与安全。

拓展思考

  1. 双端省电优化:Provider 侧如何利用 setNextUpdateTimeMillis() 做指数退避,避免国内厂商 5 min 一刀切?
  2. 动效与刷新:表盘侧使用 CanvasComplicationDrawable 时,如何在 ambient 模式下把秒级刷新降到 10 min 一次,同时保证 burn-in protection 像素位移?
  3. 多表盘复用:把 Complication 位置与样式抽成独立模块,通过 Hilt 注入到不同表盘 Engine,减少 30% 包体积的实践。
  4. 国内合规:Provider 采集心率、血氧等敏感数据,如何同时满足工信部 SDK 备案与 Wear OS 权限模型,避免上架被打回?