Skip to Content
Основные понятияOEM-управление питанием

OEM-управление питанием

Укрощение агрессивной экономии заряда

Даже если вы все настроили идеально и запросили службу переднего плана с помощью POST_NOTIFICATIONS, некоторые производители Android (OEM) встроили собственные, очень агрессивные механизмы «Battery Saver» в свои собственные версии Android (например, MIUI, EMUI, ColorOS).

Эти агрессивные убийцы задач закроют ваше приложение через несколько минут после отключения экрана, независимо от стандартных правил Android API. Settings Health API компании Tracelet предоставляет комплексный набор средств для обнаружения этих устройств и автоматического направления пользователя в правильное скрытое меню настроек для внесения вашего приложения в белый список.

Поддерживаемые производители и поведение

Tracelet поддерживает внутренний реестр, содержащий более 100+ структур намерений, специфичных для OEM-производителей. Когда вы вызываете Tracelet.showPowerManager(), механизм автоматически определяет марку устройства и запускает правильную глубокую ссылку.

Вот основные OEM-производители, которых мы поддерживаем, и возможности showPowerManager():

📱 Xiaomi/POCO/Redmi (MIUI/HyperOS)

  • Проблема: MIUI имеет заведомо строгий менеджер «Автозапуск» и функцию «Экономия заряда», которая отключает фоновые службы после 5 минут сна.
  • Что открывает Tracelet:
  1. Скрытое меню Автозапуск (пользователь должен включить приложение).
  2. Специальное меню App Battery Saver (пользователь должен выбрать «Без ограничений»).

📱 Huawei/Honor (EMUI)

  • Проблема: Менеджер «Запуск приложений» EMUI убивает приложения, если для них явно не настроено управление вручную.
  • Что открывает Tracelet: Экран настроек Запуск приложения. Пользователь должен снять флажок с вашего приложения и убедиться, что включены параметры «Автозапуск», «Вторичный запуск» и «Запуск в фоновом режиме».

📱 Samsung (OneUI)

  • Проблема: Samsung агрессивно добавляет приложения в свой список «Глубоко спящие приложения», если они не открывались в течение нескольких дней, навсегда прекращая выполнение всех фоновых операций.
  • Что открывает Tracelet: Меню Неотслеживаемые/никогда не спящие приложения, позволяющее пользователю добавить ваше приложение в постоянный белый список.

📱 OnePlus / Oppo (OxygenOS / ColorOS)

  • Проблема: агрессивное управление зарядом батареи приложений, которое автоматически оптимизирует фоновые задачи.
  • Что открывает Tracelet: Экраны Автозапуск приложения и Оптимизация заряда батареи.

📱 Vivo (ОС Funtouch)

  • Проблема: не позволяет приложениям потреблять большое количество энергии в фоновом режиме.
  • Что открывает Tracelet: Меню белого списка Высокое фоновое энергопотребление.

🌐 Другие устройства и DontKillMyApp

Для устройств, на которые явно не распространяется механизм глубоких ссылок Tracelet, или если вы хотите понять точные технические ограничения, налагаемые конкретными производителями, мы настоятельно рекомендуем проверить DontKillMyApp.com . Это невероятный ресурс, управляемый сообществом, который ранжирует смартфоны по агрессивности их фоновых задач и предоставляет инструкции по ручной настройке практически для каждого устройства Android.


Реализация потока смягчения последствий

Эту проверку следует запустить во время процесса регистрации вашего приложения или на главной панели управления:

import 'package:tracelet/tracelet.dart' as tl; // 1. Check the device health // Returns a Map<String, dynamic> containing the boolean flags final health = await tl.Tracelet.getSettingsHealth(); // 2. Check if the device is a known aggressive OEM if (health['isAggressiveOem'] == true) { // 3. Check if the user has already whitelisted your app if (health['isIgnoringBatteryOptimizations'] == false) { // 4. Show a custom Flutter dialog explaining WHY they need to do this showDialog( context: context, builder: (context) => AlertDialog( title: Text("Background Tracking Required"), content: Text("To ensure your route is recorded, please select 'No Restrictions' on the next screen."), actions: [ TextButton( onPressed: () async { Navigator.pop(context); // 5. Open the specific manufacturer's hidden power menu // Returns true if the intent successfully launched the screen, false otherwise. final success = await tl.Tracelet.showPowerManager(); if (!success) { // Fallback: Open standard Android battery settings await tl.Tracelet.openBatterySettings(); } }, child: Text("Configure"), ) ] ) ); } }

Рекомендации по пользовательскому интерфейсу: никогда не вызывайте showPowerManager() случайно или сразу после запуска приложения. Всегда предваряйте его контекстным диалогом пользовательского интерфейса Flutter. Если пользователь внезапно телепортируется на пугающий системный экран «Оптимизация батареи» без контекста, он запаникует и удалит ваше приложение.


Надежность отслеживания водителей и автопарка в режиме реального времени

Самый распространенный вопрос от команд, создающих приложения для такси, доставки и автопарка: * «Может ли Tracelet отслеживать весь день на Xiaomi, Poco, Infinix, Tecno и других агрессивных OEM-производителях?» * Вот честный и практичный ответ.

Что Tracelet обрабатывает автоматически

Эти меры по снижению риска применяются за вас — настройка не требуется:

  • Служба переднего плана с FOREGROUND_SERVICE_TYPE_LOCATION — Android предоставляет наивысший фоновый приоритет.
  • START_STICKY — ОС воссоздает службу после прекращения работы из-за нехватки памяти.
  • OEM-безопасные пробуждения — на Huawei тег блокировки пробуждения, внесенный в белый список PowerGenie, чтобы процесс не прерывался из-за удержания «неизвестной» блокировки пробуждения.
  • Wakelock загрузочного приемника — короткая блокировка пробуждения во время BOOT_COMPLETED, чтобы процесс продолжался до тех пор, пока после перезагрузки не будет установлена ​​служба приоритета.
  • Правила Consumer ProGuard/R8 — запрещают сборкам выпуска удалять службы, получатели и объекты комнат.

Неизбежный ручной шаг

Никакая библиотека фонового определения местоположения не может отменить удаление OEM без внесения пользователем приложения в белый список. MIUI, EMUI, ColorOS, HiOS/XOS и подобные ПЗУ намеренно игнорируют стандартные правила Android. На этих устройствах исключение из оптимизации батареи + автозапуск являются жесткими требованиями для обеспечения бесперебойной работы в течение всего дня. Рассматривайте их как необходимые этапы адаптации, а не как дополнительные функции.

Ворота начала смены водителя по льготе:

final ignoring = await tl.Tracelet.isIgnoringBatteryOptimizations(); final health = await tl.Tracelet.getSettingsHealth(); if (health['isAggressiveOem'] == true && !ignoring) { // Walk the user through showPowerManager() + battery-optimization exemption // BEFORE letting them go "on shift". }

Обнаружение случаев, когда OEM-производитель ограничил или отключил отслеживание

  • Tracelet.getHealth() — один вызов возвращает состояние отслеживания, состояние поставщика, разрешение/авторизацию, режим энергосбережения, освобождение от оптимизации батареи и количество ожидающих несинхронизированных вызовов с автоматически обнаруженными предупреждениями. Идеально подходит для информационной панели «Состояние устройства».
  • События onProviderChange — срабатывают при изменении состояния служб определения местоположения/GPS.
  • Наблюдение за устареванием серверной части — каждое исправление имеет метку времени и сохраняется, поэтому сравните время последнего исправления каждого устройства с его ожидаемой частотой на вашем сервере и пометьте устройство, чей поток прекратился (классический признак уничтожения OEM) в течение нескольких минут.

Рекомендуемый контрольный список настройки для отслеживания в течение всего дня

  1. Запросите разрешение Always / фоновое местоположение с четким обоснованием.
  2. Запустите службу переднего плана с постоянным уведомлением — не подлежит обсуждению для непрерывного отслеживания.
  3. Установите stopOnTerminate: false и startOnBoot: true, чтобы отслеживание сохранялось при закрытии и перезагрузке приложения.
  4. Во время регистрации позвоните getSettingsHealth(); если isAggressiveOem имеет значение true, проведите пользователя через showPowerManager() и освобождение от оптимизации батареи. Начало смены ворот на isIgnoringBatteryOptimizations().
  5. Используйте HTTP-синхронизацию (пакетную загрузку), чтобы при кратковременных перерывах в сети данные не терялись.
  6. Добавьте наблюдение за устаревшим сервером, чтобы операторы видели, как быстро отключается устройство.
  7. Отправьте tracelet_doctor (или getHealth()) на скрытом экране поддержки, чтобы можно было диагностировать неполадки на реальных устройствах.

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