解决和解决"网络使用过多(背景)"的正确方法

Che*_*eng 19 android android-workmanager

问题背景

目前,我们面临来自Android Vital报告的" 网络使用率过高(背景) ".过去30天是0.04%,但我们只有9%好

  • 过去30天 - 0.04%
  • 基准 - 优于9%

在此输入图像描述

在此输入图像描述

因为只有超过9%看起来像一个可怕的事情.我们决定认真研究这个问题.

该应用程序是一个笔记应用程序(https://play.google.com/store/apps/details?id=com.yocto.wenote),它提供一个可选的特征-同步应用程序结束后,以背景云英寸

这就是我们在后台执行同步到云的方式.

  1. 我们用WorkManager.
  2. 在应用程序onPause,计划OneTimeWorkRequest,有约束NetworkType.CONNECTED.工人计划以8秒的延迟开始.
  3. 如果失败,我们重试使用BackoffPolicy.LINEAR,延迟时间为1.5小时.
  4. 最大重试次数为1次.这意味着,应用程序关闭后应用程序再次重新打开.同步到云进程的最大执行次数为2.
  5. 数据的大小各不相同,可以是几KB到几百MB.

其他信息我们如何执行同步

  1. 我们正在使用Google Drive REST API.
  2. 我们正在从Google Drive App Data文件夹下载zip文件,在本地执行数据合并,然后压缩,并将单个zip文件重新上传回Google Drive App Data文件夹.
  3. zip文件大小可以从几KB到几百MB不等.这是因为我们的笔记应用程序支持图像作为附件.

分析

我们唯一的信息是https://developer.android.com/topic/performance/vitals/bg-network-usage.

当应用程序在后台连接到移动网络时,应用程序会唤醒CPU并打开收音机.反复这样做可能会耗尽设备的电池电量.如果应用程序处于PROCESS_STATE_BACKGROUND或PROCESS_STATE_CACHED状态,则认为该应用程序在后台运行.......当Android应用程序在0.10%的电池会话中在后台运行时,每小时发送和接收总计50 MB的总量时,Android vitals认为后台网络使用率过高.

  1. 我们启动后台同步作业,在8秒之后Application的onPause.在此期间,应用程序内部或外部PROCESS_STATE_BACKGROUND/ PROCESS_STATE_CACHED?我们怎样才能避免运行中PROCESS_STATE_BACKGROUND/ PROCESS_STATE_CACHED?
  2. " 在0.10%的电池续航时间在后台运行 "是什么意思?我们怎能避免这样的?
  3. 另一个假设是同步文件太大,并且使用了太多数据.很快,我们注意到这种假设可能不正确.我们注意到根据" 每小时移动网络使用情况(背景) ",数据大小从0MB到5MB.

在此输入图像描述


问题

我的问题是

  1. 这种" 过度网络使用(背景) "警告的实际根本原因是什么?我们怎样才能准确找出根本原因.
  2. 执行后台同步的其他应用(如Google Photo,Google Keep,Google Doc等)如何解决此问题?

Jak*_*eam 6

对于第一个问题,在以下情况下会触发“网络使用率过高(后台)”:

...某应用在后台运行时,每小时发送和接收总计50 MB的电量,占电池会话的0.10%。电池会话是指两次充满电之间的间隔。

资源

要确定是什么原因造成的,请尝试使用Battery Historian来分析您的应用随时间的电池使用情况。对于我们来说,它有助于确定我们不打算引入的重复唤醒锁。

这是输出的示例,向我们展示了过多的BLE扫描会严重影响电池: 电池历史学家截图


对于第二个问题,如您正确识别的那样,WorkManager可能是您追求的目标。这使您可以计划任务以及希望其出现的窗口。使用此功能,操作系统可以为您以及其他应用程序的作业优化任务计划。例如,可以将所有6个应用程序安排为同时发生,而不是将6个应用程序每10分钟唤醒设备一次的每小时任务,从而增加了在打increasing模式下花费的时间。

请注意,上面的屏幕截图包括“ JobScheduler作业”选项卡。运行分析后,您将能够看到您的工作实际如何执行: 作业计划程序分析屏幕截图

我以前使用Firebase JobDispatcher取得了巨大的成功(我写的教程),它扩展了OS的JobScheduler API,并且最终很相似。

我看到您现在正在使用WorkManager(Jetpack的JobDispatcher版本),但是在8秒钟内,操作系统没有机会优化您的工作。是否有能力以最少几秒钟的时间调度它们,并尽可能将其最大化?


进一步改进

但是,您当前的任务计划设置可能不是根本原因。以下是一些其他想法,可能会为您提供所需的电池改进。在运行Battery Historian并确定了根本原因后,它们的用途将变得更加清晰:

  1. 考虑仅wifi上网是否是可行的数据同步默认选项。您会遇到更好的电池使用情况,更少的网络问题以及可能更好的客户满意度。

  2. 为什么记笔记应用程序需要同步几百 MB?您是否可以仅同步已更改的笔记,而不是每次都同步整个笔记列表?