一次性权限导致后台计划作业和警报被取消

Posted

技术标签:

【中文标题】一次性权限导致后台计划作业和警报被取消【英文标题】:One-time permissions causing background scheduled jobs and alarms to be cancelled 【发布时间】:2020-12-10 04:10:15 【问题描述】:

我们开发了一个 android SDK,在测试 Android 11 Beta 时,我们发现了一个似乎尚未报告的问题。

在 Android 11 中,为位置、麦克风和相机权限引入了新的一次性权限。使用此选项,一旦用户离开应用程序,权限就会被撤销(更多详细信息可以找到here)。

问题是,当应用程序不再处于前台的一小段时间后(没有必要杀死应用程序,只需最小化就足够了),所有未来计划的警报或作业都被删除,好像应用程序被强行杀死。 这只发生在此级别的权限下。 拒绝或提供其他级别会按预期保留先前安排的警报或作业。 我们已经在 Beta 3 版本中重现了这一点,它是在具有 RPB3.200720.005 版本号的 Pixel 2 模拟器中。在repo 中,您可以找到重现该错误的示例应用程序。

这个单一的活动应用程序安排在接下来的五分钟内响起警报,以及在 5-6 分钟内触发的工作。 屏幕上有三个按钮,每个按钮触发相应的权限请求。 JobService 和 BroadcastReceiver 类仅记录它们已被触发。 通过以下步骤可以重现这种情况:

    无论何时启动应用程序,都可以运行adb shell dumpsys alarm | grep com.example.permissions.appadb shell dumpsys jobscheduler | grep com.example.permissions.app 以查看警报和作业都已安排好; 单击任一按钮并授予一次性权限级别; 最小化应用(您可以转到主屏幕或打开其他应用); 大约一分钟后,运行adb shell dumpsys alarm | grep com.example.permissions.appadb shell dumpsys jobscheduler | grep com.example.permissions.app。警报和作业将不再出现; 等待作业和警报的原始计划时间(对系统延迟宽容)将表明它们不会被触发。

你们中有人遇到过类似的情况吗?我们的直觉是,为了撤销一次性权限,应用程序进程会以某种方式被杀死,从而导致这些副作用。 我们还在Android Issue Tracker 上提交了一个问题,如果谷歌回复了,我们会及时更新这篇文章。

【问题讨论】:

不确定最终版本的 Android 11 是否会修复,但您可以在此处阅读:commonsware.com/blog/2020/08/28/… 【参考方案1】:

问题已“解决”。问题实际上是 Android Studio 在关闭应用程序后撤销权限时调用强制关闭。

Google 的实际回应:

非常感谢您提出此问题并提供示例代码 重现它。经过进一步调查,我们发现这 是由于 Android Studio 和通过 “运行”命令。

具体来说,当 Android 撤销应用程序的权限时,它会杀死该应用程序 应用程序的过程。我们发现 Android Studio 发送了强制停止命令 当它观察到它启动的应用程序不再运行时通过 adb。

如果应用是通过启动器启动的(包括在模拟器中) 已连接到 Android Studio),应用程序未强制停止,并且 警报和作业都按预期运行。

因此它不会导致其他问题,除非在开发阶段。如需更多信息,请查看问题中链接的 Android 问题跟踪器。

【讨论】:

以上是关于一次性权限导致后台计划作业和警报被取消的主要内容,如果未能解决你的问题,请参考以下文章

第一次作业

19. Linux的at定时任务调度

团队作业4——第一次项目冲刺(Alpha版本)-第三篇

Linux基础知识---计划任务

如何在 crontab 更改时获得警报?

任务计划cron