我们开发了一个 Android SDK,在测试 Android 11 Beta 时,我们发现了一个似乎尚未报告的问题。
在 Android 11 中,为位置、麦克风和相机权限引入了新的一次性权限。使用此选项,一旦用户离开应用程序,权限就会被撤销(更多细节可以在这里找到)。
问题是在应用程序不再处于前台的短时间内(没有必要杀死应用程序,只需最小化就足够了),所有未来计划的警报或作业都会被删除,就好像应用程序是强制的被杀。这只发生在此级别的权限下。拒绝或提供其他级别会按预期保留先前安排的警报或作业。我们已经在 Beta 3 版本中重现了这一点,它是在具有 RPB3.200720.005 版本号的 Pixel 2 模拟器中。在这个repo中,你可以找到一个用于重现 bug 的示例应用程序。
这个单一的活动应用程序安排在接下来的五分钟内响起警报,以及在 5-6 分钟内触发的工作。屏幕上有三个按钮,每个按钮触发相应的权限请求。JobService 和 BroadcastReceiver 类仅记录它们已被触发。通过以下步骤可以重现这种情况:
- 每当启动应用程序时,都可以同时运行
adb shell dumpsys alarm | grep com.example.permissions.app
并adb shell dumpsys jobscheduler | grep com.example.permissions.app
查看警报和作业都已安排; - 单击任一按钮并授予一次性权限级别;
- 最小化应用程序(您可以转到主屏幕或打开其他应用程序);
- 大约一分钟后,同时运行
adb shell dumpsys alarm | grep com.example.permissions.app
和adb shell dumpsys jobscheduler | grep com.example.permissions.app
。警报和作业将不再出现; - 等待作业和警报的原始计划时间(对系统延迟宽容)将表明它们不会被触发。
大家有遇到过类似的情况吗?我们的直觉是,为了撤销一次性权限,应用程序进程会以某种方式被杀死,从而导致这些副作用。我们还在Android 问题跟踪器上提交了一个问题,如果 Google 回答,我们将保持更新此帖子。