AndroidでFatal Exception: android.app.RemoteServiceException

現象

Android Oからバックグラウンド・サービスの制限が増えたため、アプリで以下のケースで落ちていた。
– FirebaseからPush通知を送信
– 端末側でPush通知受信時アプリを開いていた
– Pushが表示された数秒後落ちる

条件

  • compileSDK:26
  • targetSDK:26
  • 落ちるOS:Android O
  • とある事情で、FirebaseによるPush通知と2019年4月終了のGCMによるPush通知が混在

原因

  • こちらのとおり、Oから実行制限がついたのでstartForegroundServiceでサービスを開始し、startForegroundでフォアグラウンド化をすればOKと思っていた
  • 条件項目にあるとおり、GCMとFirebase混在状態のため
    GcmIntentService.java, GcmBroadcastReceiver.java, MyFirebaseMessagingService.java, MyFirebaseInstanceIdService.javaという構成だった(2018/6/28にFirebaseInstanceIdServiceはdeperecatedになったけど別件なので置いとく)
  • GcmBroadcastReceiver.java内でAndroid O以上だったらstartForegroundServiceをコールし、MyFirebaseMessagingService.javaとGcmIntentService.javaの両方でstartForegroundしていたのが原因

対処

  • MyFirebaseMessagingService.javaでのstartForegroundをやめてGcmIntentService.javaのみでAndroid O以上の場合にのみstartForegroundすることで掲題のエラーは回避できた。

まとめ

GCMとFirebase混在なケースというのが稀なのもあるのか、どんぴしゃな記事に巡り会えず自力解決となったので記事化しました。