5

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 上运行测试:

在此处输入图像描述

4

0 回答 0