You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android 14中启动SYSTEM_EXEMPTED类型前台服务触发InvalidForegroundServiceTypeException的问题求助

Android 14中启动SYSTEM_EXEMPTED类型前台服务触发InvalidForegroundServiceTypeException的问题求助

各位好,我现在遇到一个生产环境的棘手问题,想请教下大家:

最近30天里,我的应用在启动前台服务时出现了约177,000次重复崩溃,崩溃特征非常集中:

  • 近50%发生在三星设备上
  • 约66%的崩溃设备运行Android 14系统
  • 90%的崩溃场景是应用处于后台状态时触发

崩溃抛出的核心异常是:

android.app.InvalidForegroundServiceTypeException: Starting FGS with type none

下面是我这边的实现细节和配置,麻烦大家帮我排查下有没有遗漏:

1. 启动前台服务的代码

我使用兼容库API来启动服务:

ContextCompat.startForegroundService(context, Intent(context, MyService::class.java))

2. Service内部的前台激活逻辑

MyService.onStartCommand()中,我明确指定了前台服务类型为SYSTEM_EXEMPTED

ServiceCompat.startForeground(
    this, 
    getNotificationId(), 
    notification, 
    ServiceInfo.FOREGROUND_SERVICE_TYPE_SYSTEM_EXEMPTED
)

3. AndroidManifest中的Service声明

已经在清单里给服务绑定了systemExempted类型:

<service android:name=".MyService"
    android:enabled="true"
    android:exported="false"
    android:foregroundServiceType="systemExempted" />

4. 已声明的相关权限

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SYSTEM_EXEMPTED" />
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />

另外我的应用还持有DeviceAdmin权限、精确闹钟权限和通知权限,按照官方文档的说明,这些权限应该能让我的应用归入systemExempted豁免组,允许在后台启动前台服务才对。

最困惑的点

我手头的实体三星设备(Note 10、S25 Ultra)和各类模拟器都完全复现不了这个崩溃,但生产日志明确显示:明明我在代码和清单里都指定了SYSTEM_EXEMPTED,系统却仍然判定我启动FGS时使用了type none

我已经翻遍了Android 14前台服务的官方文档,还是没找到问题所在,想请教大家:

  • Android 14对后台启动FGS的规则,在三星设备上有没有什么特殊的细节我没注意到?
  • 有没有其他开发者遇到过同样的问题?有没有可行的临时绕过方案?

以下是完整的崩溃栈信息:

Fatal Exception: android.app.InvalidForegroundServiceTypeException: Starting FGS with type none callerApp=ProcessRecord{8d44878 6376:com.app.myapp/u0a328} targetSDK=34 has been prohibited
    at android.app.InvalidForegroundServiceTypeException$1.createFromParcel(InvalidForegroundServiceTypeException.java:53)
    at android.app.InvalidForegroundServiceTypeException$1.createFromParcel(InvalidForegroundServiceTypeException.java:49)
    at android.os.Parcel.readParcelableInternal(Parcel.java:5089)
    at android.os.Parcel.readParcelable(Parcel.java:5071)
    at android.os.Parcel.createExceptionOrNull(Parcel.java:3251)
    at android.os.Parcel.createException(Parcel.java:3240)
    at android.os.Parcel.readException(Parcel.java:3223)
    at android.os.Parcel.readException(Parcel.java:3165)
    at android.app.IActivityManager$Stub$Proxy.setServiceForeground(IActivityManager.java:7620)
    at android.app.Service.startForeground(Service.java:863)
    at androidx.work.impl.foreground.SystemForegroundService$Api31Impl.startForeground(SystemForegroundService.java:194)
    at androidx.work.impl.foreground.SystemForegroundService$1.run(SystemForegroundService.java:130)
    at android.os.Handler.handleCallback(Handler.java:959)
    at android.os.Handler.dispatchMessage(Handler.java:100)
    at android.os.Looper.loopOnce(Looper.java:249)
    at android.os.Looper.loop(Looper.java:337)
    at android.app.ActivityThread.main(ActivityThread.java:9493)
    at java.lang.reflect.Method.invoke(Method.java)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:636)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1005)

万分感谢大家的帮忙!

内容来源于stack exchange

火山引擎 最新活动