【问题标题】:WorkManager throws SecurityException on some Samsung devicesWorkManager 在某些三星设备上抛出 SecurityException
【发布时间】:2021-01-19 12:39:36
【问题描述】:

说明

WorkManager 库计划和警报以跟踪它是否被强制停止。这发生在 ForceStopRunnable 类中(另见:https://android.googlesource.com/platform/frameworks/support/+/a9ac247af2afd4115c3eb6d16c05bc92737d6305/work/workmanager/src/main/java/androidx/work/impl/utils/ForceStopRunnable.java),它将在 WorkManager 初始化期间运行。在某些三星设备上,这将触发 SecurityException,据我所知,当您的应用程序安排超过 500 个警报时,三星会抛出此异常。该应用程序没有充满警报,所以我认为FLAG_UPDATE_CURRENT 将在已取消版本的内存中保留一个旧实例。但我无法重现这一点,而且我也没有看到安排了多个警报副本。

仅在 SDK 28 上发生,在 SDK 29 上发生一些罕见的情况

问题

这里是否有其他人在使用 WorkManager 库时具有相同的经验并且知道如何重现此问题?

这个问题有解决办法吗?

崩溃日志

java.lang.SecurityException: at android.os.Parcel.createException (Parcel.java:1966) at android.os.Parcel.readException (Parcel.java:1934) at android.os.Parcel.readException (Parcel.java:1884) at android.app.IAlarmManager$Stub$Proxy.set (IAlarmManager.java:240) at android.app.AlarmManager.setImpl (AlarmManager.java:722) at android.app.AlarmManager.setExact (AlarmManager.java:571) at androidx.work.impl.utils.ForceStopRunnable.setAlarm (ForceStopRunnable.java:292) at androidx.work.impl.utils.ForceStopRunnable.isForceStopped (ForceStopRunnable.java:151) at androidx.work.impl.utils.ForceStopRunnable.forceStopRunnable (ForceStopRunnable.java:169) at androidx.work.impl.utils.ForceStopRunnable.run (ForceStopRunnable.java:101) at androidx.work.impl.utils.SerialExecutor$Task.run (SerialExecutor.java:91) at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1167) at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:641) at java.lang.Thread.run (Thread.java:764) Caused by: android.os.RemoteException: at com.android.server.SamsungAlarmManagerService.checkMaliciousAppLocked (SamsungAlarmManagerService.java:333) at com.android.server.AlarmManagerService.setImpl (AlarmManagerService.java:1758) at com.android.server.AlarmManagerService$2.set (AlarmManagerService.java:2100) at android.app.IAlarmManager$Stub.onTransact (IAlarmManager.java:92) at android.os.Binder.execTransact (Binder.java:739)

来源: https://github.com/minvws/nl-covid19-notification-app-android

【问题讨论】:

  • 尝试安排 > 500 个作业,您应该能够重现它。查看源代码,文件 ExposureNotificationJob.kt 安排没有 ID 和 UPDATE/CANCEL 标志的作业。你真的打算这样做吗?这可能是安排太多工作的原因吗?

标签: android samsung-mobile android-workmanager securityexception


【解决方案1】:

如果应用程序创建了太多警报,通常会发生这种情况。这不是WorkManager 问题。

【讨论】:

  • 感谢您的回复,我没有收到来自应用程序中其他警报的任何崩溃。我看到的唯一崩溃来自 ForceStopRunnable:请参阅 androidx.work.impl.utils.ForceStopRunnable.setAlarm (ForceStopRunnable.java:292) ForceStopRunnable 是 WorkManager 的一部分。你会怎么解释呢?
  • 这里的警报本身有点无关紧要。仅当您安排了超过 500 个警报时才会发生此崩溃。可能是WorkManager 安排了第 500 个警报。但这仍然意味着应用程序安排了其余部分(这是这里的问题)。
  • @Rahul 这没有回答这个问题,在我们的例子中,即使我们使用 ExistingWorkPolicy.REPLACE,这个问题仍然存在于三星。你对此有何建议?我们应该使用 ExistingWorkPolicy.KEEP 吗?
【解决方案2】:

将 WorkManager 更新到 2.6.0+ 版本解决了这个问题。请参阅以下发行说明:https://developer.android.com/jetpack/androidx/releases/work#2.6.0-alpha01

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-14
    • 2014-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多