[Android]Android14(APIレベル34)の影響範囲と実装コードの対応について

## はじめに
毎年iOSもAndroidも夏から秋にかけてメジャーバージョンアップされます。androidはiosほどにコードに変更を加えないといけないほどの致命的なことは少なかった印象です。
今回Android14はそうではないかもしれないということで備忘録メモしておきます。
詳しくはドキュメントを参照してください。
プレビュー版は2月、ベータ版は4月にリリースされているため開発者は動作確認できます。（自分はしていません）
メインスマホはiPhoneを使っているので、Androidはどうもベータ版を入れるモチベーションが出ません。

![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109862/fefbc461-a3b4-1a30-0b67-b3794ebd9fd5.png)

去年のAndroid13は8月、Android12は10月リリースでした。
今年は8月あたりにリリースされそうです。

https://gist.github.com/y-matsumoto/5a48bd982aea5935b4eb

## Android14をターゲットバージョンにした時の影響
アプリのターゲットバージョンを14にした場合の影響のため、ターゲットバージョンを上げない限り影響はありません。一般的にターゲットバージョンは現行バージョンの2から3ほどバージョンを下げるのが今までの慣例的な対処方法でした。

<2024/5更新>
targetSdkVersionを毎年更新してアップデートしないとGoogle Playにアプリをアップデートできなくなるため適切にアップデートが必要になりました。
毎年8/31に前年リリースのAPIバージョンまでアップしなければいけません。開発者は大変ですね。アプリが複数ある場合はより大変です。
https://developer.android.com/google/play/requirements/target-sdk?hl=ja

```
Android 14 では、最新の OpenJDK LTS リリースの機能に合わせて Android のコアライブラリを更新する取り組みが引き続き行われています。これには、アプリ デベロッパーとプラットフォーム デベロッパー向けのライブラリの更新と Java 17 言語のサポートが含まれます。

これらの変更のいくつかは、アプリの互換性に影響する可能性があります。

正規表現の変更: 無効なグループ参照は、OpenJDK のセマンティクスに厳密に従うことができなくなりました。java.util.regex.Matcher クラスが IllegalArgumentException をスローする新しいケースが発生する可能性があるため、正規表現を使用する領域について必ずアプリのテストを行ってください。テスト中にこの変更を有効または無効にするには、互換性フレームワーク ツールを使用して DISALLOW_INVALID_GROUP_REFERENCE フラグを切り替えます。
UUID 処理: java.util.UUID.fromString() メソッドで入力引数を検証する際に、より厳格なチェックが行われるようになりました。これにより、シリアル化解除中に IllegalArgumentException が表示される場合があります。テスト中にこの変更を有効または無効にするには、互換性フレームワーク ツールを使用して ENABLE_STRICT_VALIDATION フラグを切り替えます。
ProGuard の問題: java.lang.ClassValue クラスの追加により、ProGuard を使用するアプリの圧縮、難読化、最適化をしようとすると問題が発生することがあります。この問題は、Class.forName("java.lang.ClassValue") がクラスを返すかどうかに基づいてランタイムの動作を変更する Kotlin ライブラリに起因します。java.lang.ClassValue クラスを利用できない古いバージョンのランタイムを対象にアプリが開発されている場合、これらの最適化により、java.lang.ClassValue から派生したクラスから computeValue メソッドが削除されることがあります。
```
引用元
https://developer.android.com/about/versions/14/behavior-changes-14?hl=ja

### 正規表現の変更
ある程度の規模のアプリはMatcherクラスはバリデーションで使っているはずなのでテストした方が良さそうです。
いくつかのメソッドでIllegalArgumentExceptionが発生するパターンが増えた模様。
https://developer.android.com/reference/java/util/regex/Matcher

### UUID 処理
UUID.fromStringメソッドは文字列からUUIDクラスのオブジェクトを生成するメソッドです。このUUIDに指定する形式にバリデーションがかかり、問題がある場合はIllegalArgumentExceptionが発生するようになった模様。
https://developer.android.com/reference/java/util/UUID#fromString(java.lang.String)

### ProGuard の問題
ちょっと何を指しているのか分かりにくいですが、ClassValueクラスはJava7から追加されているようで、これらを含むコードを書いているか、Gradleで組み込んでいるライブラリがある場合に、難読化すると古いランタイムの場合にcomputeValueメソッドが削除され動作しない（クラッシュしそう）場合があるということです。これは端末に依存するところがあるので顕在化しにくい事象ですね。クラッシュレポートなどでエラーがあった場合に発生している端末があると判断できそうです。対応としてはkeepで難読化から除外が必要そう。
https://developer.android.com/reference/java/lang/ClassValue

### その他
公式ドキュメントより、対象のアプリの関連しそうなポイントを確認するべし
https://developer.android.com/about/versions/14/summary?hl=ja

## Android14端末で動作させたアプリの影響
これはターゲットバージョンではなく、そもそもユーザー側の端末のバージョンがAndroid14だった時の影響についてです。
下記の通りなので特に大体のアプリは影響がなさそうです。

```
正確なアラームのスケジュールはデフォルトで拒否される

アプリがキャッシュされている間、コンテキスト登録されたブロードキャストがキューに追加される

アプリは自身のバックグラウンド プロセスのみを強制終了できる
```

```
セキュリティ
インストール可能な最小対象 API レベル
Android 14 以降では、targetSdkVersion が 23 未満のアプリはインストールできません。これらの最小対象 API レベルの要件をアプリが満たすことを必須とすることで、ユーザーのセキュリティとプライバシーを強化しています。

マルウェアは多くの場合、新しい Android バージョンで導入されたセキュリティとプライバシー保護を回避するため、古い API レベルをターゲットにします。たとえば、一部のマルウェア アプリは、2015 年に Android 6.0 Marshmallow（API レベル 23）で導入された実行時の権限モデルの対象にならないよう、22 の targetSdkVersion を使用します。この Android 14 の変更により、マルウェアが強化されたセキュリティとプライバシー保護を回避することが難しくなります。下位の API レベルをターゲットとするアプリをインストールしようとすると、インストールに失敗し、Logcat に次のメッセージが表示されます。
```
引用元
https://developer.android.com/about/versions/14/behavior-changes-all?hl=ja

一点気になるところとしてはターゲットレベルが23未満になっている場合は対応が必要。書いてあるのを鵜呑みにすると、minSdkVersionも23未満はセキュリティ面でNGのよう。AndroidはiOSと違い機種によりバージョン縛りがあるため、古い端末の場合は動かなくなる可能性がありますが、ユーザーの断捨離も必要です。


## 新機能について

下記サイトに色々載っていました
https://mobilelaby.com/blog-entry-android-14-matome.html

### 新機能スクリーンショットの検出
気になるのを一つだけ。
ユーザが画面のスクリーンショットを撮ったことをハンドリングできるようになったようです。iOSだと漫画アプリなどで使われてましたがAndroidも検出してユーザに注意喚起できるようになったんですね。
https://developer.android.com/about/versions/14/features/screenshot-detection?hl=ja

## 最後に
ターゲットバージョンをAndroid14に能動的にしない限り問題が起きそうなことは少ないため、しばらくは気にしなくて良さそう。ターゲットバージョンを34にすることを検討する場合はテスト必須！
詳しくは引用元の公式ドキュメントを確認してください。

実際のところ問題や、対応内容が把握できてないところも多いため、そのほか何か気づきが出た際に追記します。
誤りや、他に大きな修正事項がある場合はコメントもらえると嬉しいです。

### 2024年8月31日がtargetSdk34アップデートのタイムリミット

2024/5/9時点ではまだ34についての情報記載はありません。
しかし毎年8/31までに統一しているため今年も34にアップデートしなければなりません。

タイムリミットと言ってもアプリをマーケットで常にリリースする予定がある場合はそこまでに対応が必要なだけです。アプリの要件によっては修正が大きくなるため、事前対策が欠かせません。
延長リクエストというものが2024年も使えるのであれば11月まで先延ばしにしてアップデートができるようです。
https://developer.android.com/google/play/requirements/target-sdk?hl=ja