Google Playのリリース前レポートで「Strongly consider using FLAG_IMMUTABLE」のクラッシュ報告 〜Android12関連〜
結論:android/app/build.gradleに設定を追記する
2022/6/29 Flutter エラー・バグ日記
Google Play Consoleでアプリの更新リリースをしたところ、リリース前レポートで以下のクラッシュ報告が来てしまった。
Strongly consider using FLAG_IMMUTABLE, only use FLAG_MUTABLE if some functionality depends on the PendingIntent being mutable, e.g. if it needs to be used with inline replies or bubbles.
同時に、もう一つのクラッシュ報告(こちらの日記に記載)も来ていたが、本件の方が深刻だった。。
Android 12だと発生するエラー
Google Play Consoleの画面は以下のとおり。
端末は「Pixel 2 (Virtual)」、OSは「Android 12(SDK 31)」となっている。
添付されている動画を見ると、確かに起動直後に落ちているっぽい。
エラー文によると、「FLAG_IMMUTABLEの使用を強く検討してください。」とのことだが、さっぱり意味がわからない。。
仕方なくググってみると、多くの情報が見つかった。
つまるところ、Android12(「targetSdkVersion」を31にしていたので対象)だと発生するらしい。
実機もエミューレーターもAndroid11(targetSdkVersion 30)だったので、Android12の検証ができていなかった。恥ずかしながら、盲点。。。
解決策を探すと、上記いずれの記事でも、「build.gradle」ファイルの「dependencies」に、以下の1文を追記すれば解消すると書かれている。
dependencies { // ↓これを追加 implementation 'androidx.work:work-runtime-ktx:2.7.0' }
ただ、「build.gradle」は2つ(プロジェクトレベルとアプリレベル)あるので、どっちの「build.gradle」?と悩む。。。
類似記事を見ても、意外と明記がなく、改めて1つ目のstackoverflowの記事に戻ってよく読むと、下の方に「build.gradle(app)」と書いてくださっている方がいて、「android/app/build.gradle」(アプリレベル)の方だと分かる。
なんとか解決策にたどり着けたっぽい。
途方に暮れそうなエラーだと思っていたので、本当にありがたい情報。
「androidx.work:work-runtime-ktx」とは?
しかし、そもそも「androidx.work:work-runtime-ktx」が、何のことだかさっぱりわからない。。。
気持ちが悪いので、軽く調べてみると、恐らくこちらのAndroid公式ページにある説明が該当している模様。
Androidのネイティブ開発をされている方には常識なのかもしれないが、、、「延期可能な(ただし確実に実行される必要がある)非同期タスクのスケジュールを簡単に設定する」には、「WorkManager」というAPIを使用しないといけない、ということらしい。
下記の記事などを見ると、Admobを使っていると必要になる模様(確かに自分のアプリでも導入している)。
で、先ほどのAndroid公式ページ中段によると、
Android 12(S)をターゲットとするアプリでは、WorkManager バージョン 2.7.0 が必要です。
とある。
また、こちらのページ
によると、
Android 12 以降をターゲットとするアプリでは、少数の特殊なケースを除き、バックグラウンドでの実行中にはフォアグラウンド サービスを開始できません。
・・・
アプリがバックグラウンドで動作しているときに、WorkManager を使用してスケジュールを設定し、優先処理を開始することを検討してください。
とのこと。
だから、上記1文が必要になったのか、と、分かったような、分からないようなレベルだが、一応納得。
Android 12での検証
修正はできても、実際にAndroid 12でクラッシュしないことを確認する必要があるが、自分の実機はAndroid11で検証できず。。。
そこで急ぎ、Android12のエミュレーターを作成して実行。
確かに、「androidx.work:work-runtime-ktx」の記載が無いと起動時にクラッシュするが、記載があるとクラッシュせず、普通に起動できた。
そこで、この修正を加えた上で、再度、Google Play Consoleにアップロードしたところ、今度はリリース前レポートで、Android12の端末でも問題なしの結果が返ってきた。
今まで、リリース前レポートでは警告止まりで、問題(エラー)は発生したことがなかったため、うっかり先にリリースしてしまった。。
今回の反省を活かし、今後はリリース前レポートの結果を確認してから、リリースするようにしよう。
\一般的なエラー対処法をまとめた記事はこちら/
リリースしたアプリ(全てFlutterで開発)
個人アプリ開発で役立ったもの
おすすめの学習教材
\超初心者向けでオススメな元Udemyの講座/
\キャンペーン時を狙えば安価で網羅的な内容が学べる(日本語訳あり)/
\Gitの基礎について無料で学べる/
おすすめの学習書籍
\実用的。image_pickerに関してかなり助けられた/
\Dartの基礎文法を素早くインプットできる/