今働いている会社でそろそろtargetSDKVersion31への移行を行なっていく必要があり調査していて、発生したことをメモ書きしていきます。
アプリで対応する必要があった項目
・コンポーネントのエクスポートの安全性を改善 ・ペンディング インテントの可変性コンポーネントのエクスポートの安全性を改善
インテントフィルタの設定が入っている場合にはexportedのフラグ設定が必須になりました。元々デフォルトでインテントフィルタ設定がされてたらONになっていたがそれを明示的に指定するように。 そもそも内部でしか利用しないようなパターンがあったときに、勝手にONになっていたため知らず知らずのうちにアプリを公開してしまうっていうのを防ぐのが目的っぽい。ビルド時にエラーで怒られます。対象のAndroidManifest.xmlのタブで「Marged Manifest」をタップするとエラー確認できます。
色々動かしていて分かったこととしては、システム側から起動されるような処理の場合、exported=falseでも問題なく動作したことです。基本的にアプリの外部から呼ばれるものはexported=trueにしなきゃいけないのかな?っと思っていたのですが、大丈夫そうでした。
利用しているライブラリでも影響を受けていたので記載
androidx.test:core:1.4.0 にアップデートで解消しました。
ペンディングインテントの可変性
PendingIntent利用時にPendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_IMUTABLEの設定が必要になります。 こちら、ビルド時ではなく実行時にException発生するので注意です。 アプリ側でも警告文は出るので、一度PendingIntentを利用しているところをチェックした方が良さそうです。基本的にFLAG_IMUTABLEを設定するでOKですが、アプリ側との連携などが必要で起動先から情報を更新してもらうような機能の場合はFLAG_MUTABLEが必要になります。
説明で記載があるのはBubbleを使った例などでした。
notificationなどは特に変更など必要ないのでFLAG_IMUTABLEの対応で問題ないと思います。
アプリでMUTABLEに設定が必要だった箇所としてはジオフェンスで、その際に受信時にintentにデータを詰めているためMUTABLEを設定しないと受信時にデータがnullで返却するため動作しない状況でした。
あらかじめシステム側からデータが返却されることが分かっている場合、MUTABLEでの設定が必要かと思います。
また、ライブラリでは下記が影響を受けてました。下記のバージョンにアップデート。
androidx.media:media:1.4.3
androidx.work:work-runtime-ktx:2.7.0
com.google.android.gms:play-services-analytics:17.0.1
サードパーティ製のライブラリが影響受けてそうな項目
・おおよその位置情報 ACCESS_FINE_LOCATIONとACCESS_COARSE_LOCATIONの両方を指定した場合はUI上でユーザがおおよその位置にするか正確な位置にするかを選択できるようになりました。そのため、正確な精度を強制するのはできなくなった感じです。・フォアグラウンド サービスの起動に関する制限
基本的にはバックグラウンド時にフォアグラウンドサービスの利用ができなくなったので、WorkManagerを利用する必要がありそう。
・新しいBluetooth権限
これだけメインのところに載ってなかった。権限が追加されているのでBluetoothを利用するアプリは追加が必要かも。
まとめ
今回のアップデート対応ではビルド時にエラーになる項目と、実行時にエラーになるパターンもあったので注意です。
ライブラリ側でもアップデートしないといけないところが多くて、意外と更新が必要だった印象です。
targetSDKVersion31にすることでSplashScreenAPIを使うことができるようになるので、アップデートが完了したらそちらも利用していきたいと思います。