TL; DR
Приведены ли обновления безопасности для Android 7.1.2 от 5 июня 2017 г. к тому, что Android начал игнорировать белый список оптимизации батареи (то есть то, что позволяет приложению отключать режим Doze)?
И если да, то как теперь приложение может программно отключить режим Doze, если у него есть вариант использования, который требует, чтобы ЦП и Wi-Fi были постоянно активными?
Контекст
У меня есть приложение для Android, которое поддерживает трансляцию локальных аудиофайлов в сетевой приемник Chromecast (с использованием встроенного HTTP-сервера для потоковой передачи содержимого файла на приемник).
Чтобы это работало на Android M (с точки зрения отсутствия прерывания сеанса Chromecast, когда устройство транслирует звук, но в остальном бездействует), мне пришлось использовать подход из этот ответ, чтобы отключить режим дремоты.
В частности, в моем AndroidManifest.xml
у меня есть:
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
... и следующий код выполняется всякий раз, когда устанавливается сеанс Chromecast:
if (Build.VERSION.SDK_INT >= 23) {
String packageName = context.getPackageName();
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
if (! pm.isIgnoringBatteryOptimizations(packageName)) {
//reguest that Doze mode be disabled
Intent intent = new Intent();
intent.setAction(
Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
intent.setData(Uri.parse("package:" + packageName));
context.startActivity(intent);
}
}
... и я также получаю блокировки пробуждения / Wi-Fi стандартным способом, пока активно воспроизведение Chromecast:
PowerManager powerManager = (PowerManager) getApplicationContext().getSystemService(Context.POWER_SERVICE);
wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "myapp-cast-server-cpu");
wakeLock.acquire();
WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
wifiLock = wifiManager.createWifiLock(WifiManager.WIFI_MODE_FULL_HIGH_PERF, "myapp-cast-server-net");
wifiLock.acquire();
Приложение появляется в белом списке батарей, и всего несколько недель назад все работало нормально. Однако теперь приложение попадает в режим Doze.
Устройство тестирования не изменилось; это Google Pixel под управлением Android 7.1.2. Единственное изменение программного обеспечения - это то, что я установил исправления безопасности от 5 июня 2017 года.
Системный журнал Android сообщает следующее (при активной трансляции):
06-16 17:44:24.842 1095-1150/? I/DreamManagerService: Entering dreamland.
06-16 17:44:24.846 1095-1145/? I/DreamController: Starting dream: name=ComponentInfo{com.android.systemui/com.android.systemui.doze.DozeService}, isTest=false, canDoze=true, userId=0
В этот момент (после задержки в несколько секунд) вызывается мой метод Chromecast onConnectionSuspended()
со значением CAUSE_NETWORK_LOST
. Что, конечно, было бы потому, что режим Doze отключил Wi-Fi.
Приведены ли обновления безопасности для Android 7.1.2 от 5 июня 2017 г. к тому, что Android начал игнорировать белый список оптимизации батареи (то есть то, что позволяет приложению отключать режим Doze)?
И если да, то как теперь приложение может программно отключить режим Doze, если у него есть вариант использования, который требует, чтобы ЦП и Wi-Fi были постоянно активными?
Изменить
Вот минимальный пример проекта, демонстрирующего проблему (по крайней мере, на моем Google Pixel):
https://github.com/adam-roth/droid-doze-test
Вот результат, который я получил, запустив тест на своем Pixel:
DreamController: Starting dream: name=ComponentInfo{com.android.systemui/com.android.systemui.doze.DozeService}, isTest=false, canDoze=true, userId=0
. На самом деле происходит выдача сообщения (обязательно отключите фильтрацию при просмотре вывода logcat). Я не уверен, как сделать его более понятным, не делая код менее простым. Режим дремоты не должен запускаться, потому что приложение находится в белом списке и удерживает блокировки пробуждения. Режим дремоты запускается. Это ошибка. - person aroth   schedule 22.06.2017WifiLock
, я ожидаю, что Wi-Fi останется включенным. Вы видите, как он выключается; это то, что я надеюсь каким-то образом воспроизвести - person CommonsWare   schedule 22.06.2017DreamController
сообщений. Я проделал это дважды, каждый раз с одним и тем же результатом. - person CommonsWare   schedule 23.06.2017