Android 12 (targetSdk 31) 以降をターゲットとするアプリでは、セキュリティ向上のために PendingIntent の mutability の指定が必要です。 具体的には PendingIntent を作成する際の flags に FLAG_IMMUTABLE または FLAG_MUTABLE のいずれかを指定する必要があります。
以下の課題があります。
PendingIntent.get~ メソッドを見ても flags に FLAG_IMMUTABLE または FLAG_MUTABLE のいずれかが指定されているかは明確とは限らない
flags に FLAG_IMMUTABLE または FLAG_MUTABLE のいずれかが指定されていないことを検知する UnspecifiedImmutableFlag Lint が存在するが、運用するには不十分である
flags は検知できないPendingIntent.get~ メソッドを使った瞬間に気付けないここまで読んで、既に対応したので自分には関係ないと思った方にこそ、この件の一番の課題をお伝えしたいです。この件の一番の課題は、既存コードを対応して終わりではなく、今後の新規の PendingIntent の利用シーンでも常に mutability を意識する必要があるということです。
PendingIntent の flags に FLAG_IMMUTABLE または FLAG_MUTABLE のいずれかを指定する必要があることを覚え続けることができますか?PendingIntent の flags に FLAG_MUTABLE を指定すべきケースを覚え続けることができますか?PendingIntent の flags に FLAG_MUTABLE を指定した理由を覚え続けることができますか?targetSdk 31 対応した直後の人なら可能でしょう。1年後はどうしょうか?チームメンバーは?
Lint 警告をエラーにする、Lint 結果を Danger で PR にコメントする、などで確実に修正するワークフローが構築できていれば UnspecifiedImmutableFlag Lint でも十分かもしれません。
とはいえ、そんなワークフローを経なくても書いた瞬間に修正できる方が良いですよね?
上記の課題を解決する ImmutablePendingIntent というライブラリを公開しました。