いきなりFGSとか言われる
すっかり毎年恒例となった Play ストアの Android 最新版への対応(※これをやらないとそのアプリの更新ができなくなる)ですが、2024年も Android 14 への対応期限が 8/31 に迫ってきたので targetSdk を 33 から 34 にしてビルド&実行してみたところ、下記のエラーが起きて全然動きませんでした。
android.app.MissingForegroundServiceTypeException: Starting FGS without a type callerApp=ProcessRecord{435fc46 16794:jp.takke.cpustats.debug/u0a296} target
at android.app.MissingForegroundServiceTypeException$1.createFromParcel(MissingForegroundServiceTypeException.java:53)
at android.app.MissingForegroundServiceTypeException$1.createFromParcel(MissingForegroundServiceTypeException.java:49)
at android.os.Parcel.readParcelableInternal(Parcel.java:5016)
at android.os.Parcel.readParcelable(Parcel.java:4998)
at android.os.Parcel.createExceptionOrNull(Parcel.java:3178)
at android.os.Parcel.createException(Parcel.java:3167)
at android.os.Parcel.readException(Parcel.java:3150)
at android.os.Parcel.readException(Parcel.java:3092)
at android.app.IActivityManager$Stub$Proxy.setServiceForeground(IActivityManager.java:6960)
at android.app.Service.startForeground(Service.java:776)
at jp.takke.cpustats.NotificationPresenter.doNotify(NotificationPresenter.kt:95)
at jp.takke.cpustats.NotificationPresenter.updateNotifications(NotificationPresenter.kt:63)
at jp.takke.cpustats.UsageUpdateService.execTask(UsageUpdateService.kt:293)
at jp.takke.cpustats.UsageUpdateService.onStartCommand$lambda$0(UsageUpdateService.kt:222)
at jp.takke.cpustats.UsageUpdateService.$r8$lambda$QjSqggJ0C5qeCl9detYR4r2hiz8(Unknown Source:0)
at jp.takke.cpustats.UsageUpdateService$$ExternalSyntheticLambda0.run(D8$$SyntheticClass:0)
at android.os.Handler.handleCallback(Handler.java:959)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loopOnce(Looper.java:232)
at android.os.Looper.loop(Looper.java:317)
at android.app.ActivityThread.main(ActivityThread.java:8592)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:580)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:878)
Starting FGS without a type
ということで、FGS(フォアグラウンドサービス)を使うアプリには特別な権限と宣言が必要になったようですね。
公式情報:
- Understanding foreground service and full-screen intent requirements - Play Console Help
- フォアグラウンド サービスと全画面インテントの要件について - Play Console ヘルプ
フォアグラウンドサービスの権限を追加する
今回は CPU 使用率を通知エリアに表示する CPU Stats というアプリが対象です。ソースコードは github で公開しています。
アプリの実行時は上記のエラーが logcat に出ますが Android Studio でも下記のエラーが出ています。
To call Service.startForeground(), the <service> element of manifest file must
have the foregroundServiceType attribute specified More... (Ctrl+F1)
Inspection info: For targetSdkVersion >= 34, to call Service.startForeground(),
the <service> element in the manifest file must have the foregroundServiceType
attribute specified.
targetSdkVersion
が34以上の場合は、Manifestの service
に foregroundServiceType
属性の記載が必要ということですね。
具体的には下記のように修正しました。foregroundServiceType
に指定する値に応じて uses-permission
も必要です。
<!-- ↓ FOREGROUND_SERVICE_DATA_SYNCを追加 -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
<application>
<!-- ↓ foregroundServiceType を追加 -->
<service
android:name=".UsageUpdateService"
android:foregroundServiceType="dataSync"
android:enabled="true"
android:exported="false">
</service>
</application>
該当コミット:
本アプリでは android:foregroundServiceType
に dataSync
を指定しましたが、使用する service の用途によっては location
や camera
、mediaPlayback
などを選びます。
どれを指定するべきかは フォアグラウンド サービスと全画面インテントの要件について - Play Console ヘルプ に表で書いてありますがいまいち分かりにくい感じがします。
もしどれにも該当しないということであれば「その程度なら service 使うな」あるいは「そんなアプリは作るな」ということでしょうかね。強めの意思を感じます。
ちなみに拙作の Lossless Video Cutter というアプリではバックグラウンドで動画の変換処理を行うために service
を使っていましたが(後述の動画提出も含めると)面倒だったので WorkManager
に置き換える形で、Android 14(targetSdkVersion=34)に対応しました。
用途によってはservice
をWorkManager
やJobScheduler
に置き換える方法もあるのを忘れないようにしたいところです。
※ちなみに CPU Stats は最小で0.5秒おきにCPU使用率を検出する必要があるので WorkManager
に置き換えることはできませんでした。
Playストアで更新しようとすると動画を作れと言われる
無事に実行出来るようになり、aabを作ってストアに申請しようとすると「審査に送信」しようとする段階でエラーが出ます。赤帯でめちゃめちゃ怖いですね。
「問題を表示」をクリックすると…
フォアグラウンド サービスの権限の申告が不完全です
Android 14 で導入されたフォアグラウンド サービスの権限へのアクセスをリクエストするすべてのデベロッパーが、
この申告を完了するか、アプリのマニフェストからこれらの権限を削除する必要があります
などと言われますので、「申告を完了する」をクリックすると「フォアグラウンドサービスの権限」の申告画面が出てきます。
※どのチェックボックスを選んでも「動画リンク」を要求されます。
今回は「その他のタスク⇒その他」を選び、使用している状況を示す動画を作り、YouTubeにアップロードして下記のように記載しました。
提出した動画はこちら。Android Studio で実機で録画してちょっと説明文付けただけです。
審査にちょうど2日かかった
「こんな動画で大丈夫かな?」と思いつつ 7/16(火) 11:30 頃に申請、なかなか結果が出ないとやきもきしていましたが 7/18(木) 11:30 頃に審査が無事完了しました。
ちょうど48時間でした。
今年は例の「デベロッパー確認」もあるためか、Playストアの審査がいつもより長めな気がしますね。
以上です。お疲れさまでした。
さあ次は別アプリ(Data Stats)のFGS権限申請をしないと・・・。
(7/19追記)DataStatsも1日で審査が完了しました
- Data Stats のFGS権限も 7/18 14:30頃に申請し、7/19 14:30頃に審査完了となりほぼ24時間で審査完了となりました。