Функция оптимизации приложений Samsung убивает фоновые приложения через 3 дня

В настоящее время мы разрабатываем приложение для Android, которое представляет собой фитнес-трекер. Он постоянно работает в фоновом режиме и отлично работает на большинстве устройств, но у нас были проблемы с полной остановкой приложения на некоторых устройствах Samsung. После некоторого расследования выяснилось, что некоторые устройства Samsung имеют полностью настраиваемую функцию «Оптимизация приложений» (http://forums.androidcentral.com/samsung-galaxy-s6/599408-app-optimisation-after-updating)..html), который в основном является (очень) примитивным версия функции Doze, которая существует в более поздних версиях Android, которая просто убивает приложения, если они не использовались в течение трех дней.

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

В функции Samsung App Optimization четко указано, что она «оптимизирует» приложения, если они не использовались в течение трех дней. Кто-нибудь знает, что Samsung считает "использованным", и могу ли я каким-то образом вызвать это?

Side-rant: На мой взгляд, это плохо реализованная функция, которая делает разработку на Android более враждебной. Помимо нашего варианта использования, это сломает любые приложения для обмена сообщениями. Если бы не тот факт, что Facebook Messenger и Whatsapp запрограммированы на исключение для приложения, пользователи сошли бы с ума, потому что это сломало бы их опыт.


person Mattias Petter Johansson    schedule 25.04.2016    source источник
comment
Та же проблема здесь, в 2020 году. Вы как-то решили это?   -  person Keyne Viana    schedule 08.05.2020


Ответы (7)


Я владел (и в настоящее время владею) устройствами Samsung, поэтому я немного знаю, как это работает с точки зрения пользователя. Технические характеристики и то, как это работает внутри, — это совершенно отдельная тема, на которую я не могу ответить.

Система может определить, открываете ли вы приложение. Samsung использует это в оптимизации своих приложений и будет экономить энергию на приложениях, которые не использовались более трех дней. Хотя это ужасная система.

Он игнорирует фоновые процессы, которые могут иметь решающее значение для приложений, и даже если это приложение, которое вы активно используете, например, фитнес-трекер, у него будут проблемы. Чтобы процитировать то, что он говорит в списке оптимизации приложения:

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

(Грубый перевод с норвежского, первоначально взятого с S6 под управлением Android 6)

Таким образом, приложения, которые были установлены вручную или автоматически (3 дня неиспользования), могут вызывать различные проблемы с фоновыми процессами. Но помните, что пользователь может настроить любое приложение так, чтобы оно никогда не экономило заряд батареи и игнорировало автоматическую настройку. Итак, имея это в виду, давайте рассмотрим возможные решения.

Существует один сценарий, в котором вам не нужно беспокоиться о приложении и его оптимизации: когда оптимизация приложения полностью отключена.

Помимо этого, вы можете сделать только две вещи:

  1. Попросите пользователей Samsung отключить оптимизацию батареи для вашего приложения, чтобы предотвратить проблемы.

  2. Как предложил @MinaSamy (в их теперь удаленном ответе), SyncAdapter и периодическая синхронизация. Обратите внимание, что я не проверял это, поэтому я не знаю, работает это или нет.

И есть также третий вариант, который на самом деле не является решением, но вы можете проигнорировать его и сделать ставку на отключение оптимизации приложения или просто не заботиться об этом вообще.

Кто-нибудь знает, что Samsung считает используемым, и могу ли я как-то это вызвать?

Насколько я знаю, если Samsung не добавила какие-то меры защиты от случайного открытия или не добавила какие-то минимальные требования к активности, открытия было достаточно. Это кажется глупой функцией, которая работает по жестко запрограммированным правилам, а не по динамической системе, которая фактически определяет использование приложения и устанавливает энергосбережение относительно этого. Его легко включить, но, к счастью, также легко отключить.

Это означает, что вы не можете инициировать событие, которое будет поддерживать его (если только SyncAdapter не поможет)

И чтобы прояснить факты, из @Neil answer:

Похоже, что пользователь может это сделать, поэтому должна быть какая-то база данных или настройка, которая управляет этим.

Типа есть. Всего существует четыре параметра, три из которых относятся к конкретному приложению, и они хранятся в базе данных (или в каком-либо другом виде хранилища данных). Эти четыре параметра можно использовать, хотя и крайне поверхностно, для изменения поведения оптимизации приложения:

  • Всегда оптимизировать
  • Автоматическая оптимизация
  • Никогда не оптимизируйте
  • Отключить оптимизацию приложения

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

Существует также веб-сайт, на котором перечислены способы обхода оптимизации для каждого бренда. Запись для Samsung более или менее соответствует тому, что я сказал: скажите пользователю вручную отключить оптимизацию. Девелоперских решений нет.

person Zoe    schedule 29.03.2017
comment
Спасибо за ответ. У меня есть аналогичная проблема, когда приемник вещания, зарегистрированный в манифесте (для событий подключения Bluetooth), кажется, работает со сбоями через 3 дня (не получает все события). Решит ли это добавление моего приложения в список неконтролируемых приложений в настройках батареи Samsung? Это единственное решение? Спасибо! - person dor506; 18.06.2018
comment
@ dor506, если предположить, что это проблема только Samsung, да. Если вы видите это на других устройствах, вероятно, есть проблема с вашим кодом (при условии, что устройство не имеет чего-то похожего на функцию Samsung, не считая Doze) - person Zoe; 18.06.2018
comment
Спасибо за быстрый ответ. Я почти уверен, что это не проблема в моем коде, так как единственное, что я делаю, это записываю события в файл журнала. Журнал показывает, что события получают нормально в течение ~ 3 дней. по истечении этого периода, согласно журналу, события не всегда получаются - что, по-видимому, связано с 3-дневным Samsung, описанным здесь. Похоже, что по истечении этого периода приоритет получателя снижается. - person dor506; 18.06.2018

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

Похоже, это твоя проблема.

https://forums.androidcentral.com/samsung-galaxy-s10-s10-plus/964083-whats-disabling-some-my-apps-background.html

person Chin Nguyen    schedule 07.11.2019

Есть ли причина, по которой вы не можете добавить свой сервис в список «не оптимизировать»?

Похоже, что пользователь может это сделать, поэтому должна быть какая-то база данных или настройка, которая управляет этим.

В качестве альтернативы, если вы обнаружите, что выполняете установку на одном из устройств, откройте страницу действий по оптимизации и отобразите сообщение «Не оптимизируйте нас!».

person Neil    schedule 12.05.2016
comment
Похоже, что пользователь может это сделать, поэтому должна быть какая-то база данных или настройка, которая управляет этим. Это идея, но что это будет за база данных? Как я мог это узнать? - person Mattias Petter Johansson; 12.05.2016
comment
Первое, что я бы сделал, это покопался в файловой системе одного из пострадавших телефонов. Может быть что-то столь же простое, как список оптимизированных приложений, разделенных запятыми (вероятно, нет, но кто знает). - person Neil; 12.05.2016
comment
К сожалению, у меня нет прямого доступа ни к одному из этих телефонов. Возможно, мне придется приобрести один. - person Mattias Petter Johansson; 12.05.2016
comment
Похоже, у вас есть отличный повод купить новый телефон :-) - person Neil; 12.05.2016
comment
Это не дает мне возможности выбора Galaxy S10 - person IgorGanapolsky; 14.04.2020

В качестве обходного пути я реализовал механизм SyncAdapter, взяв за основу эту ссылку: https://github.com/bmeike/MiniSync Это не работает идеально (для тестирования, в моем приложении я пишу журнал каждые 1 час, и через 3 дня оно начинает не соблюдать это расписание), но, по крайней мере, оно не останавливается после 3 дня, без необходимости переводить приложение в игнорируемый режим оптимизации.

ОБНОВЛЕНИЕ: после обновления Android PIE планирование снова остановилось через 3 дня. На другом устройстве то же приложение с Android Oreo, планирование работает (даже если не полностью соблюдается).

person izio    schedule 01.03.2019

На телефонах Samsung виноват этот параметр Сон:

введите здесь описание изображения

Вы должны вывести своих пользователей на этот экран системных настроек и попросить их отключить эту функцию.

person IgorGanapolsky    schedule 15.04.2020

На мой взгляд, вы должны реализовать «Broadcast Receiver», который прослушивает настраиваемое «Intent», и это «Intent» будет транслироваться с помощью «Service» из метода «onDestroy()» «Service», потому что когда «System» убить «Сервис», этот метод будет вызываться определенно. И когда «Broadcast Receiver» получает «Intent», вы должны снова запустить «Service». И чтобы различать, останавливаете ли вы «Службу» или «Систему», останавливая «Службу», просто используйте некоторые «логические значения», хранящиеся в «SharedPreferences», а затем в «Приемнике широковещания» вы решаете, активировать ли «Службу» или нет

person Mohammad Haidar    schedule 10.05.2016
comment
убитое приложение не получает произвольные трансляции - person Tim; 23.11.2017

у нас все в порядке с нормальным управлением питанием Android

Ты? Из документации по Android

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

Три дня кажется, что это подпадает под «долгоиграющий... гарантированно убитый».

Если проблема не в том, что ваша служба убита, а в том, что она не перезапущена, вы можете использовать AlarmManager для регулярной проверки состояния вашей службы и перезапуска, если это необходимо.

person Enrico    schedule 25.04.2016
comment
Я хорошо знаю, как работает стандартное управление питанием Android, и что службы случайным образом убиваются и перезапускаются. Это нормально. У нас есть много устройств сторонних производителей с одним и тем же номером версии Android, которые отлично работают в течение многих дней. Но то, что делает Samsung App Optimizer, отличается: ровно через три дня он полностью убивает все приложение. Постоянно. Он никогда ничего не перезапускает. Он даже не может получать сообщения GCM или получать события обновления пакетов. Это НЕ то же самое, что стандартное управление питанием Android. - person Mattias Petter Johansson; 26.04.2016
comment
Таким образом, службы не работают должным образом с такими константами, как START_REDELIVER_INTENT. , Имеет ли это? - person Maxim G; 05.05.2016
comment
Нет, это не так. Приложение полностью закрыто (кнопка принудительного выхода отключена в настройках Android), и ничто не заставит его снова появиться, кроме фактического повторного нажатия значка приложения. - person Mattias Petter Johansson; 12.05.2016