Почему подмена сама отключается в фоне на Xiaomi?

Прошивки MIUI и HyperOS (Xiaomi, Redmi, POCO) выгружают фоновые приложения агрессивнее остальных. Нужно включить для Mock Location автозапуск и снять ограничения батареи — приложение подскажет это при первом запуске.

Подмену держит фоновый сервис, и «отключилась сама» почти всегда означает, что прошивка его закрыла. В системных журналах это видно как принудительное завершение процесса по решению системы, а не как ошибка приложения.

Дальше происходит неочевидное: тестовые провайдеры остаются зарегистрированными в Android с последним записанным значением, но новые координаты в них уже никто не пишет — процесс, который их создал, не существует. Снаружи это выглядит как «подмена зависла»: точка держится прежней, но перестаёт обновляться, а через некоторое время система возвращает реальное местоположение. Именно поэтому проблема часто замечается не сразу.

Чаще всего с этим сталкиваются владельцы Xiaomi, Redmi и POCO: MIUI и HyperOS управляют фоновыми процессами жёстче остальных. Лечится тремя настройками — автозапуск, снятие ограничений батареи и закрепление в списке недавних; разбор с точными путями есть в отдельной инструкции про Xiaomi. Если из трёх делать только одну, делайте автозапуск: без него система после закрытия процесса не поднимет сервис вовсе, и подмена не вернётся, пока вы сами не откроете приложение. С включённым автозапуском система поднимает сервис за несколько секунд, приложение подхватывает сохранённое состояние и продолжает работу без вашего участия.

На Samsung причина та же, но механизм называется иначе — «Спящие приложения»: One UI автоматически усыпляет то, чем вы давно не пользовались, а приложение подмены как раз выглядит бездействующим, пока телефон лежит в кармане. Пути для One UI разобраны в инструкции по Samsung. На Huawei и Honor нужно отключить автоматическое управление запуском и включить все три переключателя — автозапуск, косвенный запуск и работу в фоне; подробности — в инструкции по Huawei.

Со своей стороны приложение делает два независимых движения. При открытии оно сверяет сохранённое состояние с фактическим и, если процесс умирал, поднимает подмену заново — этот путь надёжен всегда. Плюс сторожевой таймер периодически проверяет состояние в фоне и пытается восстановить сервис сам. Но у обоих есть предел: если прошивка запрещает приложению стартовать в фоне, поднять сервис без вашего участия невозможно — код в этот момент просто не выполняется. Поэтому настройки прошивки заменить программно нельзя.

Проверять результат удобнее всего по постоянному уведомлению в шторке: пока оно на месте, сервис жив. Пропало — систему всё-таки дожали, и стоит вернуться к настройкам выше.

Остались вопросы? Напишите в поддержку.