TL;博士
Android 7.1.2 的“2017 年 6 月 5 日”安全更新是否导致 Android 开始忽略电池优化白名单(即旨在让应用禁用打盹模式的东西)?
如果是这样,如果应用程序有一个需要 CPU 和 wifi 保持持续活动的用例,它现在如何以编程方式禁用打盹模式?
语境
我有一个 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);
}
}
...而且我还以标准方式获取唤醒/wifi 锁定,同时 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();
该应用程序出现在电池白名单中,就在几周前,这一切都运行良好。但是,该应用程序现在被打盹模式捕获。
测试设备没有变化;这是运行 Android 7.1.2 的 Google Pixel。唯一的软件更改是我安装了 2017 年 6 月 5 日的安全补丁。
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
此时(延迟几秒钟后)我的 ChromecastonConnectionSuspended()
方法被调用,值为CAUSE_NETWORK_LOST
. 这当然是因为打盹模式已经关闭了 wifi。
Android 7.1.2 的“2017 年 6 月 5 日”安全更新是否导致 Android 开始忽略电池优化白名单(即旨在让应用禁用打盹模式的东西)?
如果是这样,如果应用程序有一个需要 CPU 和 wifi 保持持续活动的用例,它现在如何以编程方式禁用打盹模式?
编辑
这是一个演示该问题的最小示例项目(至少在我的 Google Pixel 上):
https://github.com/adam-roth/droid-doze-test
这是我得到的结果,在我的 Pixel 上运行测试: