Files
android/docs/multi_model_adaptation.md

3.1 KiB

Multi-Model Adaptation Design (Android)

Goals

  • Keep one code path for core remote-control logic.
  • Isolate ROM/device-specific behavior in policy resolvers.
  • Prevent one-device hotfix from breaking other models.

Current Architecture (implemented)

  • util/adaptation/DeviceAdaptationStrategy.kt
    • Defines strategy interface + runtime fingerprint model:
      • DeviceAdaptationStrategy
      • DeviceRuntimeInfo
  • util/adaptation/KeepAliveAdaptationRegistry.kt
    • Registers and resolves keepalive strategies by priority.
    • Current built-in strategies:
      • oppo_family_android14_conservative
      • xiaomi_legacy_aggressive
      • default_balanced
  • util/adaptation/WebRtcTransportAdaptationRegistry.kt
    • Registers and resolves WebRTC/MediaProjection tuning policies.
    • Current built-in strategies:
      • xiaomi13_hyperos_android14
      • xiaomi_android14_balanced
      • oppo_family_android14
      • default_webrtc_transport
  • util/DeviceDetector.kt
    • Keeps public compatibility APIs (getKeepAlivePolicy, getWebRtcTransportPolicy, shouldUseActivityKeepAlive).
    • Internally delegates strategy selection to adaptation registries.
  • util/ForegroundServiceStarter.kt
    • Centralized, throttled starter for RemoteControlForegroundService.
    • Prevents repeated startForegroundService storms.
  • Keepalive modules wired to policy:
    • service/KeepAliveService.kt
    • service/EffectiveKeepAliveManager.kt
    • service/WorkManagerKeepAliveService.kt

Strategy Rules

  • OPPO/VIVO/REALME/ONEPLUS on Android 14+:

    • Conservative mode.
    • Disable aggressive WorkManager one-shot recovery workers.
    • Increase keepalive check interval.
    • Throttle foreground-service restart frequency.
  • Xiaomi <= Android 13:

    • Keep aggressive recovery and auto behavior (legacy-compatible).
  • Others:

    • Balanced defaults.
  • Xiaomi13 / HyperOS (Android 14+):

    • Prefer default-display capture intent.
    • Use shorter projection refresh cooldown and longer auto-retry window.
    • Force mediaProjection FGS upgrade before WebRTC capture.

Why this avoids regressions

  • Device-specific branching is no longer spread across multiple services.
  • New ROM hotfixes are added by appending one strategy class, not editing many call sites.
  • Same APIs remain for existing modules; behavior changes through policy values.

Extension Template

  1. Add a new strategy class implementing DeviceAdaptationStrategy.
  2. Assign a priority (higher value wins).
  3. Implement matches(info) and keepAlivePolicy(info).
  4. Register it in KeepAliveAdaptationRegistry.strategies.
  5. Validate with smoke matrix:
    • OPPO Android 15
    • Xiaomi Android 13
    • Vivo/Realme target model
    • One default-model baseline
  • Extend policy scope to permission-flow strictness:
    • Add PermissionFlowPolicy for dialog step order, spinner selection strategy, and timeout budget.
    • Move remaining manufacturer-specific permission ordering from MainActivity/orchestrator into one resolver.
  • Add per-device smoke matrix in CI:
    • Profile set: Xiaomi13, OPPO A5/Android15, Vivo, Samsung.
    • Gate release on baseline pass rate.