如何实现应用在手机、平板、笔记本间的状态同步?

解读

面试官问“状态同步”,并不是想听“把数据丢到服务器”这么简单。国内设备形态差异大(HarmonyOS 手机、折叠屏、定制平板、Windows 安卓子系统、Chromebook),网络环境复杂(弱网、地铁、校园网、公司代理),还要兼顾合规(数据不出境、个人信息保护)。因此,回答必须体现:

  1. 多端“状态”到底指什么(UI 状态、业务状态、文件、离线任务队列)
  2. 同步链路如何选(Push、Pull、混合)
  3. 冲突与一致性策略(乐观锁、向量时钟、CRDT)
  4. 省电、省流量、省内存
  5. 国内可用且合规的通道(系统级、厂商级、自建)

知识点

  • Android 多窗口与配置变更:Configuration.uiMode、smallestWidth、折叠状态监听
  • 进程复活与挂起:Doze、App Standby、厂商杀后台、Binder 死亡通知
  • 国内 Push 通道:MiPush、HUAWEI Push、OPPO Push、vivo Push、统一推送联盟 UPS,以及 Google FCM(海外机)
  • 数据载体:ProtoBuf、FlatBuffer、JSON、加密 Room、DataStore、MMKV
  • 冲突解决:LWW(Last-Write-Wins)、版本向量、CRDT(G-Counter、LWW-Register)
  • 差量/压缩:Google Binary Diff、Zstd、7z、Google Play Asset Delivery 的 Patch 思路
  • 加密合规:国密 SM4/SM2、HTTPS+TLS1.3、0-RTT、用户同意存储
  • 省电:JobScheduler/WorkManager 网络约束、充电约束、低频率心跳、合并上报
  • 账号体系:OAuth2 + RefreshToken、小米账号、华为账号、微信登录、手机号一键登录
  • 隐私合规:工信部 164 号文、个人信息保护法、数据分类分级、加密后再出域

答案

“我会把状态拆成三层:UI 状态、业务实体、离线任务队列,分别用不同策略同步,确保三端体验一致且省电合规。”

  1. 状态建模

    • UI 状态:页面栈、滚动位置、主题模式,体积<30 KB,用 DataStore Proto 序列化,带自增版本号
    • 业务实体:用户笔记、收藏、草稿,用 Room 存储,整表增加 column version + lastModified
    • 离线任务:图片上传、视频转码,用 WorkManager 持久化,状态字段 pending/completed/failed
  2. 通道选型

    • 实时:国内主流机走厂商 Push,海外机走 FCM;Push 只发“版本号+摘要”,不携带真实数据,防止透传敏感信息
    • 兜底:WorkManager 加网络约束 15 分钟一次差量拉取,防止 Push 漏达
    • 笔记本(Windows 子系统):同一账号下用后台 Socket+TLS 直连自建边缘节点,心跳 90 s,节省公司防火墙连接数
  3. 冲突解决

    • 业务实体采用“版本向量 + 业务时间戳”双因子,向量时钟不一致时弹窗让用户选,后台记录冲突日志
    • UI 状态用 LWW,设备本地时间误差>2 s 则放弃同步,避免页面乱跳
    • 离线任务天然幂等,用 UUID 去重
  4. 数据压缩与加密

    • 差量计算:客户端本地保存上一版本快照,用 Google Binary Diff 生成 patch,平均节省 60% 流量
    • 加密:国密 SM4-128-GCM 加密 patch 包,密钥由 Android Keystore 生成并存储在 TEE,传输再用 TLS1.3 二次加密,满足合规不出境
  5. 省电与性能

    • Push 心跳合并:多个应用共用厂商通道,心跳间隔统一 4.5 分钟,Doze 下允许 1 次/15 分钟
    • 同步任务批量:WorkManager 将 5 分钟内多次修改合并为一次上传,减少无线射频唤醒
    • 内存:差量 patch 在 native 层完成,避免 Java 层大对象,防止 GC 抖动
  6. 发布与灰度

    • 功能开关用 Firebase Remote Config(海外)+ 华为 AGC 远程配置(国内),按设备类型 5% 灰度
    • 异常上报用 Sentry 自托管,确保日志脱敏后再出域

通过上述方案,我们在 1.2 亿用户内测中,将三端状态延迟控制在 400 ms 以内,月均流量消耗 <1.5 MB,后台电量消耗占比 <0.3%,并通过中国信通院数据安全认证。

拓展思考

  1. 折叠屏展开瞬间,UI 状态宽高比突变,如何防止同步后页面错位? 答:在状态模型里记录“折叠状态+窗口大小等级”,同步后先校验当前设备是否支持该等级,不支持则降级到默认布局,避免强制恢复导致异常。

  2. 用户手机断网 7 天,在平板上新增大量数据,手机一旦联网如何防止 OOM? 答:采用分页快照 + 流式差量合并,先下载索引层(主键+版本),本地计算缺失范围,再按 500 条一批拉取,拉取过程使用 SQLite 事务和 Room 的 LIMIT + OFFSET,内存峰值控制在 20 MB 以内。

  3. 如果政策要求“数据不出省”,如何设计多活边缘节点? 答:在各省运营商机房部署最小可用边缘节点,只缓存加密后的差量包;用户接入时通过 HTTP-DNS 就近调度,跨省迁移账号时原节点数据 24 小时内物理销毁,满足数据属地要求。