Android12の変更点ピックアップ

久しぶりの投稿です。時間ができたのでせっかくなので。

そろそろAndroid12リリースの時期で、遅れましたが、今年も気になる変更点をピックアップします。
全部を取り上げるというより、既存のアプリへの対応という前提で、特に重要度の高そうなものに絞ります。

Samesiteに関する変更がある（targetSdkVersion>=31時）ので、個人的に最優先でチェックすることをおすすめいたします。
各項目の詳細については、情報引用元が一番正確かつ最新なのでそちらをご参照ください。

# 主な情報引用元

Android12関連ホーム
　https://developer.android.com/about/versions/12?hl=ja
　→　スケジュールもここから。
　→　日本語ページを正とするのが良いと思いますが、英語ページの方が更新が早いので、情報を早めに手に入れたい場合は英語に切り替えるのが良さそうです。

Android12上でアプリを動かす際に適応される項目
　https://developer.android.com/about/versions/12/behavior-changes-all?hl=ja

targetSdkVersion=31とした時に適応される項目
　https://developer.android.com/about/versions/12/behavior-changes-12?hl=ja

（追記 2021/09/27）
手っ取り早くどんな変更があるのか一覧で確認したい場合（変更点のサマリ）
　https://developer.android.com/about/versions/12/summary?hl=ja

# Android12上の変更点

### オーバースクロール効果（OverScrollEffect）

以下のスクロール系Viewに関して、端までスクロールするとぐい～んエフェクト（項目の間が伸びる）が発生します。

- RecyclerView
- ListView
- ScrollView
- NestedScrollView
- HorizontalScrollView
- ViewPager
- ViewPager2

何も設定しないと、容赦なく上記の全てのViewに対して適用されます。
真面目な雰囲気のアプリでもぐい～んとなります。

無効化は可能です。
逆に、よりぐい～ん効果を強めることも可能なようです。

### ウェブ インテントの解決

WebView等でアプリ内遷移してほしいところが、
デフォルトブラウザに遷移してしまう変更のようです。

地味に危険な項目です。

### Bouncy Castle の実装を削除

暗号化アルゴリズムで、BouncyCastleというものが使えなくなった。
憶測ですが、これが決定打でしょうか↓
https://jvndb.jvn.jp/ja/contents/2019/JVNDB-2019-010617.html

とりあえず、keyGenerator周りで処理が失敗していないか確認してみましょう。

### アプリからシステムダイアログを閉じるアクションが不可に

正確には、`ACTION_CLOSE_SYSTEM_DIALOGS`を含むIntent呼び出しをすると`SecurityException`をスローする、です。

よって、`ACTION_CLOSE_SYSTEM_DIALOGS`がまだ使われているか確認してみましょう。
古くは、ホームボタン押下を検知することに使われていたようです。

# targetSdkVersion=31の変更点

### カスタム通知

以前のカスタム通知は、`通知領域全域`で独自のデザインが作れたが、
`システムが標準テンプレートを適用`するようになります。

つまり、通知デザインに最低限の一貫性を持たせるということのようです。
デザイン関連の変更なので、不都合ある方はご注意を。

### アプリの休止状態

Android11で導入された許可のオートリセットの拡張で、
数ヶ月アプリが操作されないと、すべての権限が自動リセットされ、アプリが休止状態になります。

特に注意すべきは、休止状態アプリの特徴である、
　`アプリはバックグラウンドでジョブやアラートを実行できません。`
　`アプリはプッシュ通知（Firebase Cloud Messaging を介して送信される優先度の高いメッセージなど）を受信できません。`
この2点でしょうか。

前者は、一定間隔で何らかの処理をバックグラウンドで動かすとき、
後者は、そもそも通知が届かないのはまずいですし、通知できたかどうかの計測結果等に響きそうです。

となると、数ヶ月とは具体的にどれくらいの期間なのか気になりますね。。

休止状態を解除するリクエストを送信することは可能です。
https://developer.android.com/about/versions/12/behavior-changes-12?hl=ja#request-user-disable-hibernation
> 除外をリクエストするには、Intent.ACTION_APPLICATION_DETAILS_SETTINGS インテント アクションを含むインテントを呼び出します。

### WebView での最新の SameSite Cookie

大変お待たせいたしました。今回の変更の__目玉__です。

Web界隈で話題になったChroniumの変更点ですが、
満を持してAndroidのWebViewにも適応されることになったようです。
（重ね重ねとなりますが、Android12以降で__targetSdkVersion=31以降限定__です。）

WebView上で通信が必要なアプリの場合、スルーすると大変な事になる可能性があります。
Chromeブラウザで既に先行導入されているので、恐らく多くの方は対応済みと思いますが、まだの方は確認と対応を急ぎましょう。

2021/09/05時点の情報引用
> Android 12 における WebView のベース バージョン（89.0.4385.0）には、次に示すプライバシー保護の変更が取り入れられています。

> SameSite 属性が設定されていない Cookie は SameSite=Lax として扱われます。
> SameSite=None の Cookie には、Secure 属性も指定する必要があります。つまり、そうした Cookie はセキュア コンテキストを必要とし、HTTPS で送信する必要があります。
サイトの HTTP バージョンと HTTPS バージョン間のリンクは、クロスサイト リクエストとして扱われるようになりました。したがって、SameSite=None; Secure として適切にマークされていない限り、Cookie は送信されません。

上記のSameSite=Laxの概念自体は以前から存在しており、デフォルト設定となります。

めちゃくちゃ大雑把に解説すると、__特定の種類のリクエスト（ここが地味に重要）__に関して、
DomainAで付与したCookieが、DomainBのサイトからは参照できず、
ホスト部分が同じでも、http ↔ httpsで異なるドメインとして扱う場合がある、ということです。

つまり、外部サイトとの通信が必要な場合は、影響を調査したほうが良いということです。

ここも見ておきましょう。
https://web.dev/schemeful-samesite/

これに伴って、WebView DevToolにテスト用の仕様が追加されたようです。
https://chromium.googlesource.com/chromium/src/+/HEAD/android_webview/docs/developer-ui.md#Flag-UI

### コンポーネントのエクスポートの安全性を改善 ###

Intent-filterを利用する場合、AndroidManifest.xmlに`android:exported`を明示する必要があります。
影響があるのは、__Android Studioの動作__で、明示していない場合、
Android Studio 2020.3.1 Canary 版 11 以降で、ビルドエラーとなります。

### 通知トランポリンの制限 ###

通知をタップした時、BroadcastReceiverで任意のActivityを立ち上げられなくなったようです。
対処法は以下のようです。
https://developer.android.com/about/versions/12/behavior-changes-12?hl=ja#notification-trampoline-update-app
つまり、PendingIntentでNotificationを表示させるようにしている場合は特に問題ないかと思われます。

# まとめ

何はともあれ、Samesite（Schemeful Same-Site）の対応要否は検討しましょう。

Android6～8くらいにあったような、重要度の高い変更が少ないですが、
昨今のAndroidは、昔なら通じていた少々異色な実装を、ことごとく潰しに来ている感があります。