最新的Android更新会禁用电池优化白名单吗?

aro*_*oth 5 java android media-player chromecast android-doze

TL; DR

Android 7.1.2的“ 2017年6月5日”安全更新是否导致Android开始忽略电池优化白名单(即让应用程序禁用“打ze”模式的功能)?

如果是这样,如果应用程序需要持续保持CPU和wifi的使用情况,那么现在该如何通过编程方式禁用“打ze”模式?

语境

我有一个Android应用程序,它支持将本地音频文件投射到联网的Chromecast接收器(使用嵌入式HTTP服务器将文件内容流式传输到接收器)。

为了在Android M上实现此功能(就在设备投射音频时没有使Chromecast会话掉落,否则处于空闲状态),我不得不在此答案中使用该方法来禁用打ze模式。

具体来说,AndroidManifest.xml我有:

<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
Run Code Online (Sandbox Code Playgroud)

...,只要建立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);
    }

}
Run Code Online (Sandbox Code Playgroud)

...并且在Chromecast播放处于活动状态时,我还以标准方式获取唤醒/ wifi锁定:

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(); 
Run Code Online (Sandbox Code Playgroud)

该应用程序出现在电池白名单中,而就在几周前,这一切都运行良好。但是,该应用程序现在被打ze睡模式捕获。

测试设备没有改变;这是运行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
Run Code Online (Sandbox Code Playgroud)

此时(经过几秒钟的延迟),我的Chromecast onConnectionSuspended()方法被调用,其值为CAUSE_NETWORK_LOST。这当然是因为打ze模式已关闭wifi。

Android 7.1.2的“ 2017年6月5日”安全更新是否导致Android开始忽略电池优化白名单(即让应用程序禁用“打ze”模式的功能)?

如果是这样,如果应用程序需要持续保持CPU和wifi的使用情况,那么现在该如何通过编程方式禁用“打ze”模式?

编辑

这是一个演示问题的最小示例项目(至少在我的Google Pixel上):

https://github.com/adam-roth/droid-doze-test

这是我在Pixel上运行测试后得到的结果:

在此处输入图片说明