Google Play Core ライブラリの更新と対応

# 背景
Androidアプリリリース時に、こんなメールが来ました。

> Google Play Core (com.google.android.play:core) has added this note for SDK version 1.10.3:
Update your Play Core Maven dependency to an Android 14 compatible version! Your current Play Core library is incompatible with targetSdkVersion 34 (Android 14), which introduces a backwards-incompatible change to broadcast receivers to improve user security. As a reminder, from August 31, Google Play requires all new app releases to target Android 14. Update to the latest Play Core library version dependency to avoid app crashes: https://developer.android.com/guide/playcore#playcore-migration

<details><summary>日本語訳</summary>
Google Play Core (com.google.android.play:core) は、SDKバージョン1.10.3に以下の注意書きを追加しました：
Play CoreのMaven依存関係をAndroid 14互換バージョンに更新してください！現在のPlay CoreライブラリはtargetSdkVersion 34 (Android 14) と互換性がありません。Android 14では、ユーザーのセキュリティを向上させるためにブロードキャストレシーバーに後方互換性のない変更が導入されています。なお、8月31日以降、Google Playではすべての新しいアプリリリースがAndroid 14をターゲットにすることが求められます。アプリのクラッシュを回避するために、最新のPlay Coreライブラリバージョンに更新してください：https://developer.android.com/guide/playcore#playcore-migration
</details>

まとめると、
- Google Play Core では、SDKバージョンに注意事項が追加された
- Play Core Maven の依存関係を Android14 の互換バージョンに更新してほしい

って感じかな。

# Google Play Core とは
Google が提供する Android 向けのライブラリです。アプリ開発者が様々なGoogle Play 機能をアプリに統合できるように手助けをしてくれます。主に以下のような機能をアプリに追加できます。

- 追加の言語リソースをダウンロード
- 機能モジュールの配信を管理
- アセットバックの配信を管理
- アプリ内アップデートをトリガーする
- アプリ内レビューをリクエストする


# この警告について
この警告は、Google Play Core ライブラリを使用しているアプリに対して表示されます。
この警告が表示された理由として、Google Play Core の Java と Kotlin ライブラリは機能別に複数の Android ライブラリに分割されたからです。
複数のライブラリに分かれることによって、Play Core ライブラリがアプリに追加するサイズが減り、個々の機能のリリースサイクルを短縮できるようになりました。

# この対応で何が変わるの？
この対応でソースコードが大きく変わることはありません。
公式ドキュメントにもありますが、唯一大きな変更点は、新しいバージョンで、[Google Play 開発者サービスの Task API](https://developers.google.com/android/reference/com/google/android/gms/tasks/Task)が採用されたくらいです。そのほかはほとんど変更することはありませんでした。

# 対応方法
## Task オブジェクト
プロジェクト内で `import com.google.android.play.core.tasks.*;` があれば、変更する必要があります。
しかし、変更はとても容易で、`play.core.tasks.*` 参照を `gms.tasks.*` に変更するだけです。クラス名などを変更する必要はありません。

```diff_kotlin
- import com.google.android.play.core.tasks.*;
+ import com.google.android.gms.tasks.*;
```

## Gradle の対応
build.gradle(:app) ファイルにあるライブラリを修正していきます。

### Play Core ライブラリの削除
分割されたライブラリを導入するため、既存の Play Core ライブラリは削除しましょう。

```diff_gradle: build.gradle(:app)
...
dependencies {
    ...
    
-  implementation 'com.google.android.play:core:[任意のバージョン]'

    ...
}
...
```

### 必要なライブラリを導入
次に必要なライブラリを導入していきます。

#### Play Asset Delivery Library を統合する
```diff_gradle: build.gradle(:app)

...
dependencies {
    ...
    
+    implementation 'com.google.android.play:asset-delivery:2.2.2'

    // プロジェクトがKotlinの場合
+    implementation 'com.google.android.play:asset-delivery-ktx:2.2.2'
    ...
}
```

#### Play Feature Delivery Library を統合する
```diff_gradle: build.gradle(:app)
dependencies {
    ...
    
+    implementation 'com.google.android.play:feature-delivery:2.1.0'

    // プロジェクトがKotlinの場合
+    implementation 'com.google.android.play:feature-delivery-ktx:2.1.0'
    ...
}
```

#### Play In-App Review Library を統合する
```diff_gradle: build.gradle(:app)
dependencies {
    ...
    
+    implementation 'com.google.android.play:review:2.0.1'

    // プロジェクトがKotlinの場合
+    implementation 'com.google.android.play:review-ktx:2.0.1'
    ...
}
```

#### Play In-App Update Library を統合する
```diff_gradle: build.gradle(:app)
dependencies {
    ...
    
+    implementation 'com.google.android.play:app-update:2.1.0'

    // プロジェクトがKotlinの場合
+    implementation 'com.google.android.play:app-update-ktx:2.1.0'
    ...
}
```

全てのライブラリを入れる必要はありません。必要なライブラリだけ入れてください。
個人的に、私はアップデート周りの機能しか使っていないので、"Play In-App Update Library" のみ入れました。

:::note warn

上記は[公式ドキュメント](https://developer.android.com/guide/playcore?hl=ja#java-kotlin-asset-delivery)のものです。変更される場合があるので、ご注意ください。

:::

# 最後に
これで警告は解消されると思います。
対応していて疑問なのが、今回の対応をしなくてはいけないのに、ドキュメント上では、[`com.google.android.play.core.appupdate.xxxxx`](https://developer.android.com/reference/com/google/android/play/core/appupdate/AppUpdateInfo) となっている点です。

🤖＜全部、修正すれば良いのに

そこも変えると変更箇所が多くなってしまうからでしょうか🤔


# 参考資料

https://developer.android.com/guide/playcore?hl=ja#java-kotlin-feature-delivery

https://qiita.com/razuma/items/a96ddd828cef23139f3d

https://vegcale.com/2024/06/20/solve-play-core-will-cause-crash-warning/