12

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

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

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

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

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

大家有遇到过类似的情况吗?我们的直觉是,为了撤销一次性权限,应用程序进程会以某种方式被杀死,从而导致这些副作用。我们还在Android 问题跟踪器上提交了一个问题,如果 Google 回答,我们将保持更新此帖子。

4

2 回答 2

0

我知道我的问题与这个问题不完全一样,但是当我点击这个一次性权限时,我也在谷歌地图的 android 11 中遇到了这个问题。我注意到,如果您将应用程序留在后台 1 分钟然后返回,则应用程序进程被终止。

我在 viewpager 中有 2 个 SupportMapFragment 并在 TabLayout 中连接,每次发生这种情况时,都会重新创建视图,但是无法正确重新创建位于 viewpager 当前位置的片段。

对于那些也遇到这种情况的人,您必须更改流程并仅使用 1 个 SupportMapFragment 而不是两个。这样,您的地图片段将正确重新创建。我只是根据标签当前位置处理地图状态和标记

于 2022-01-26T11:54:21.263 回答
0

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

实际谷歌的回应:

非常感谢您提出这个问题,并提供示例代码来重现它。经过进一步调查,我们发现这是由于 Android Studio 与通过“运行”命令启动的应用程序之间的交互所致。

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

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

因此,除了在开发阶段之外,它不会引起其他问题。有关更多信息,请查看问题中链接的 Android 问题跟踪器。

于 2020-09-14T05:38:01.507 回答