【UE5】Google Play Consoleの警告に対応する

# はじめに
先日、弊社のアプリのバージョンアップを致しまして、無事完了したと思いきやGoogle Play Console君から警告が出ました。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987446/d3125a87-92a5-d549-2f61-0e737124a940.png)
> 6 より前のバージョンの Play Billing Library を使用したアプリの公開や更新は、上記の日付から Google Play Console でブロックされるようになります。

Google Play Console でブロックされるようになります・・・？
そして警告君のターンはまだ終わっておらず、2つの警告を召喚されました。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987446/cabdd2f3-c687-0e20-5dbb-51792b48c1e1.png)
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987446/b00ad10b-aad4-37f7-c423-ad925fba8ecc.png)
fragment？Play Core？どちら様ですか？

こんな状態でしたが頑張って対応したので、今回の記事ではこれらの解決法を書いておきます。

# 開発環境
- Windows11
- UE5.3.2（ソースコードビルド）
- Visual Studio2022
- Android Studio Flamingo 2022.2.1 Patch 2

# Billing Libraryの更新
Billing Libraryとは課金システムを実装するためのAPIです。
UEでは課金が一切ないアプリでもプラグインでこのAPIを組み込んでしまっているため、この警告が出てしまいます。
対策としてはBilling Libraryが組み込まれている`Online Subsystem GooglePlay`プラグインをオフにすることでおそらく対策可能（試してないので確証はない）ですが、必要なものも消えるとめんどくさいので大人しくバ－ジョンを上げることにします。
### 手順
先ほども書いた通り、Billing Libraryは`Online Subsystem GooglePlay`プラグインで実装されています。
以下のパスからファイルを開きます。`\Engine\Plugins\Online\Android\OnlineSubsystemGooglePlay\Source\OnlineSubsystemGooglePlay_UPL.xml`
18行目の
```
implementation 'com.android.billingclient:billing:6.0.0'
```
を
```
implementation 'com.android.billingclient:billing:7.0.0'
```
に変更します。

# androidx.fragmentの更新
こいつは自分でもあまりわかっていないので、話半分で聞いてください。
android.fragmentとはアプリのUIを管理するためのフレームワークです。
異なる画面サイズのUIに対応したり、UIを動的に変更できるみたいですね。知らんけど。
記事作成当時のfragment最新版は1.8.1です。
しかしfragment:1.8.1の依存関係の中に、
```
org.jetbrains.kotlin:kotlin-stdlib:1.8.22
```
がありまして、UE5.3.2はこのkotlinバージョンに対応していませんでした。
UE5.3.2の場合はkotlin-stdlib:1.6.21（間違ってたらごめんなさい）だったので、このバージョンに依存しているfragment:1.5.7が導入できる最新のものになります。

### 手順
以下のパスからファイルを開きます。
`\Engine\Source\ThirdParty\AndroidPermission\permission_library\additions.gradle`
dependencies内に以下のコードを追加します。
```
constraints.implementation 'androidx.fragment:fragment:1.5.7'
```
constraintsを付けることで、誰かが依存関係でfragment1.0.0を要求している場合でも、最終的に1.5.7を使用するように指定できます。
コード全体は以下のようになります。
```
android {
    namespace="com.google.vr.sdk.samples.permission"
}
dependencies {
	implementation 'androidx.legacy:legacy-support-v13:1.0.0'
	constraints.implementation 'androidx.fragment:fragment:1.5.7'
}

```

# com.google.android.play:coreの更新
[公式ドキュメント](https://developer.android.com/guide/playcore?hl=ja#playcore-migration)を見て、やることはわかるが手順通りやってもエラーが出てしまい、少し苦戦しました。
一応なぜこの更新が必要か簡単に書くと、Play Coreという4つの便利な機能が詰まったパックがあったのですが、4つの機能のうち1つしか機能を使わなかったら容量の無駄じゃね？と考えたGoogleは4つの機能をそれぞれ分割しました。
そして今後はそれぞれ使いたいやつを使ってね、と同時にPlay CoreはAndroid14から対応しなくなるから使わないでね、という感じです。

play:coreが組み込まれているのは`GooglePAD`プラグインです。
play:coreをなくすためにはプラグインをオフにすれば良いですが、現在Play Storeにアプリをアップロードできる拡張子はaabのみで、aabにobbを組み込むにはPADを使うしかありません。
うーん、なんとももどかしい。
### 手順
以下のパスからファイルを開きます。
`\Engine\Plugins\Runtime\GooglePAD\Source\GooglePAD\GooglePAD_APL.xml`
182行目の
```
implementation('com.google.android.play:core:1.10.0')
```
を
```
implementation('com.google.android.play:asset-delivery:2.2.2')
```
に変更します。

さらに214行目に移動し、
```
// for GooglePAD
import com.google.android.play.core.assetpacks.AssetLocation;
import com.google.android.play.core.assetpacks.AssetPackLocation;
import com.google.android.play.core.assetpacks.AssetPackManager;
import com.google.android.play.core.assetpacks.AssetPackManagerFactory;
import com.google.android.play.core.assetpacks.AssetPackState;
import com.google.android.play.core.assetpacks.AssetPackStateUpdateListener;
import com.google.android.play.core.assetpacks.AssetPackStates;
import com.google.android.play.core.assetpacks.model.AssetPackStatus;
import com.google.android.play.core.tasks.OnCompleteListener;
import com.google.android.play.core.tasks.OnSuccessListener;
import com.google.android.play.core.tasks.RuntimeExecutionException;
import com.google.android.play.core.tasks.Task;
```
これを
```
// for GooglePAD
import com.google.android.play.core.assetpacks.AssetLocation;
import com.google.android.play.core.assetpacks.AssetPackLocation;
import com.google.android.play.core.assetpacks.AssetPackManager;
import com.google.android.play.core.assetpacks.AssetPackManagerFactory;
import com.google.android.play.core.assetpacks.AssetPackState;
import com.google.android.play.core.assetpacks.AssetPackStateUpdateListener;
import com.google.android.play.core.assetpacks.AssetPackStates;
import com.google.android.play.core.assetpacks.model.AssetPackStatus;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.gms.tasks.RuntimeExecutionException;
import com.google.android.gms.tasks.Task;
```
に変更します。

# まとめ
今回は、
- Billing Library
- androidx.fragment
- Play Core

この3つの更新方法を書きました。
これ系の更新は毎年くるっぽいので、スマホアプリをリリースしたらこの問題と一生向き合っていかなければなりません。
これに毎回対応するEpic様の苦労が計り知れないですね。
記事内に間違った情報があるかもしれないので、優しく指摘してください。
Androidもう少し詳しくなりたい！

# 参考文献

https://developer.android.com/google/play/billing/release-notes?hl=ja

https://developer.android.com/jetpack/androidx/releases/fragment?hl=ja#declaring_dependencies

https://mvnrepository.com/artifact/androidx.fragment/fragment/1.8.1

https://forums.unrealengine.com/t/google-console-telling-me-androidx-fragment1-0-0-is-outdated/1390776/3

https://developer.android.com/guide/playcore?hl=ja#playcore-migration