Xiaomi 上的模拟位置:MIUI 和 HyperOS

“开启模拟后过几分钟一切又恢复原样”这类反馈,几乎都来自 Xiaomi、Redmi 和 POCO 手机。原因不在应用:MIUI 和 HyperOS 对后台进程的管理比原生 Android 更严格,会杀掉维持模拟的服务。下面说明具体发生了什么,以及哪三项设置可以解决。

  1. 为应用开启自启动

    设置 → 应用设置 → 应用管理 → Mock Location →“自启动”(某些版本中为“后台运行”)。这是三项设置中最重要的一项:没有它,进程被杀后系统不会再拉起它,在您手动打开应用之前,模拟都不会恢复。

    MIUI 设置中的应用界面:“自启动”开关已开启
  2. 取消电池限制

    在同一个应用界面中找到“省电策略”,选择“无限制”。在此模式下,系统不会再随意让后台服务休眠。

    选择应用的省电策略:已选中“无限制”
  3. 在最近任务中锁定应用

    打开最近任务列表,把 Mock Location 卡片向下拉,会出现锁形图标。已锁定的应用在用“×”清理列表或“全部清除”时不会被关闭。

    最近任务列表:Mock Location 卡片带有锁形图标,清理时不会被关闭
  4. 检查模拟能否保持

    开启模拟,把应用切到后台,让手机静置十到十五分钟。然后检查:通知应仍在通知栏中,其他地图应用应仍显示所选位置。

    通知栏中的 Mock Location 常驻通知:位置模拟正在后台运行

底层发生了什么

系统杀掉了应用进程,在系统日志中表现为由系统决定的强行停止。此后测试提供程序仍以最后写入的值注册在 Android 中,但已经没有谁再向其中写入新坐标:创建它们的进程已不存在。

从外面看就像“模拟卡住了”:坐标不变,但不再更新,过一段时间系统又会恢复真实位置。

应用自己会做什么

有两种恢复机制,与系统设置无关。第一:打开应用时,它会比对已保存的状态和实际状态,如果进程已终止,就恢复模拟,这条路径始终有效。第二:看门狗定时器会在后台定期检查状态,并尝试自行拉起服务。

但两者都有局限:如果系统禁止应用在后台启动,没有您的参与就无法恢复服务,因为此时代码根本不会运行。

为什么自启动比其他设置更重要

差别是可以测量的。关闭自启动时,进程被杀后系统根本不会重启服务,只有在您自己打开应用时才会恢复。开启自启动后,系统大约三秒就会拉起被杀的服务,应用读取已保存的状态,无需您操作就能继续模拟。

所以如果三项设置中只做一项,请选自启动。

重启后的恢复

正在进行的模拟位置会在手机启动时自动恢复,应用使用的是最早的系统事件,甚至在您解锁屏幕之前。在设置了 PIN 码的手机上,这是无需等您拿起手机就能恢复模拟的唯一方法。

在一台真实的 HyperOS 设备上的测量说明了这一点为何重要:早期启动事件队列只需一秒多就能到达应用,常规队列则需要十七秒,因为系统更新程序、云服务和银行应用都排在前面。

其他系统上的相同设置

Huawei(设置 → 电池 → 应用启动管理 → 为应用关闭自动管理)、Samsung(设置 → 电池和设备维护 → 电池 → 后台使用限制)、OPPO、realme 和 vivo 上也有类似情况。名称不同,思路相同:允许应用在后台运行,并把它排除在激进的省电策略之外。如果模拟仍然中断,请看常见原因讲解。

Mock Location — 免 root 的 Android 虚拟定位

免费,不经 Google Play 分发。安装前可以核对文件校验和。

下载 APK