【TECH BLOG #39】Android API Level31対応と今後

グリーエンターテインメント株式会社 エンジニア部 技術戦略チームのアンドゥです。
今回は2022年11月に対応期限が迫っているAndroid API Level 31 & Android Billing Library v4 の更新対応の話です。
長期運営タイトルは古い環境を使用していることが多く、その影響によって様々なトラブルが発生します。それらの対応記録となります。
前提条件
私が今回対応したアプリは以下の環境で作成されています。
● パブリッシャー様から開発移管してきたタイトル
● 課金ライブラリや広告ライブラリはパブリッシャー様から提供されているもの
● ゲームエンジンは”Unity2018.4.36f1”を使用
※ こちらで紹介した2つ目のタイトルです
対応した内容の概要
今回の対応では以下のことを行っています。
● ビルド時のtargetSDKVersionを”31”に変更
● AndroidManifestの対応
ー android:exported 属性 追加
ー AAID(広告ID)の取得に関する権限追加
● Android Billing Library v4へのバージョンアップ
● muteOtherAudioSourcesの設定変更
● ローカルPush通知対応
● Gradleのバージョンアップ
● AABファイルのビルドエラー
これまでの経験ではtargetSDKVersionを変更しビルドするだけで、アプリ起動までは出来ていたのですが、今回はアプリのインストールから躓きました。。。
また、Unity2018は既にサポートが終了しており、新しいUnityバージョンで対応 / 修正された機能が含まれておりません。その結果、多くの個別対応を行う必要がありました。
以下に対応内容をいくつか紹介していきます。
対応した内容
ビルド時のtargetSDKVersionを”31”に変更
targetSDKVersionの変更には”Unity”と”Android SDK”での対応が必要となります。
Unityでの対応
対象のアプリではProjectSettings.assetファイルを直接編集し、設定を以下の通り変更しています。

通常はUnityEditorで「PlayerSettings」の「Target API Level」を対象のAPIレベルに設定するのですが、Unity2018では”API Level 31” の選択肢が存在しないので、ProjectSettings.assetファイルを直接編集しています。
なお、UnityEditorで「Target API Level」を”Automatic”に設定すると、ProjectSettings.assetファイルの「AndroidTargetSdkVersion」は”0”が設定されます。ただし、この設定だとAndroid SDK内の環境に依存してしまう為、どの環境でも同じSDK Verdionを使用するようにAPI Levelの値を明示的に設定しています。
Android SDKの対応
まずはAndroid Studioの「SDK Manager」で対象のAPIを追加します。
次に「Build Tools」ですが、こちらは以前から使用している”31.0.0”をそのまま使用します。
なお、Android SDKの各種SDK/Toolの追加では対象バージョンより新しいバージョンは追加しない様に注意します。Unityでのビルドシステムは、ビルドPCに存在する最新のバージョンを使用することが多く、意図しないビルド結果となってしまうことを防ぐ為です。
ビルド結果の確認
最後に意図通りに設定されているか?を確認する為に実際にアプリビルドを行い、以下のコマンドでapkファイル内のAndroidManifestを確認します。
・コマンドの例

・AndroidManifestの確認箇所

これで無事 API Level 31へ更新されていることが分かりました。
AndroidManifestの対応
今回のAPI Level 31の対応ではAndroidManifestに以下の対応を行いました。
● android:exported 属性 追加
● AAID(広告ID)の取得に関する権限追加
上記のアプリインストール失敗は、このAndroidManifestの対応が不足していた為に起こっていた様です。。。
インストール失敗時のログを調べたところ、AAID(広告ID)の権限不足と判明。
・エラーログ

アプリ自体に広告IDは含まれていない為、パブリッシャー様のライブラリを確認したところ、対応が必要であることが分かりました。
これまでのプラットフォーム対応でパブリッシャー様との連携を強化していたお陰で、今回もスムーズに関連情報を頂けました。広告IDだけでなく、”android:exported 属性”もパブリッシャー様のライブラリに関連する内容でしたので、頂いた対応情報をもとに設定を反映しております。
・AAID(広告ID)の取得に関する権限追加内容

無事、アプリのインストールも成功です!!
Android Billing Library v4へのバージョンアップ
対象アプリではパブリッシャー様の課金ライブラリを使用している為、頂いたunitypackageをImport&インターフェース調整を行います。
Android Billing Library v4のファイルも格納されていることを確認し、v3のファイルを削除して完了!
昨年のv3導入に比べるとそれ程対応することがなくホッとしました。
Android Billing Libraryは2年毎の更新が決まっています。今後は情報に注視し、万全の対応をしていきたいですね。
muteOtherAudioSourcesの設定変更
Android OS 12 の端末でアプリを起動するとスプラッシュ画面でフリーズしてしまう現象が発生しました。ログを取ったところ、特にクラッシュエラー等はありません。
色々な情報を集めた結果、最終的にUnityEditorのPlayerSettingsにある「Mute Other Audio Sources」の設定を”true”に変更する対応を行いました。
この設定を”true”にすると他のアプリがバックグラウンドで再生している音をアプリ起動時に流さない様にします。
Android12で動かない原因はUnity2018が対応していない為の様でした。新しいバージョンのUnityでは解決しており、根本解決するにはUnityのバージョンアップが必要です。しかし、Unityのバージョンアップには十分な時間が必要となる為、現時点の対応としては「Mute Other Audio Sources」の設定変更を選択しています。
ローカルPush通知対応
Android OS 12の端末でローカルPush通知が機能しない現象が発生しました。
Androidの公式ページに以下の情報があり、この対応を追加します。
・Androidの公式ページの情報

対象アプリのAndroidのローカルPush通知は独自に作成したライブラリを使用しています。従って、ライブラリのJavaコードを修正し、aarファイルを再ビルドして対応する必要がありました。
・コード対応の1例

まとめ
私はこれまでに複数のAndroid API Level対応を行ってきましたが、”31”対応はその中でもトラブルが1番発生した結果となりました。紹介出来なかったトラブルや他のタイトルでも別のトラブルもあった事も聞いています。
今回私が対応したアプリでの問題点は、使用しているUnityのバージョンが古い為だと思います。これまでは問題なかったUnity2018ですが、今後はUnityのバージョンアップが必須になったと感じています。
Unityのバージョンアップは短時間で出来る事ではありません。
バージョンの選定の為には、パブリッシャー様のライブラリの対応可能バージョンなどを確認する必要があります。Unityのバージョンアップは開発メンバーだけで進められるものではありませんので、まずはしっかりとした情報収集&準備&調整をはじめたいと思います。
最後に
プラットフォームの対応には終わりがありません。
年明けには例年通りiOSの対応を行う必要があるかと思います。加えてUnityのバージョンアップの計画も進めなければなりません。
なかなか安心出来る期間はありませんが、グリーエンターテインメント社で進めている新規開発の技術選定にもつながる事なので、しっかりと確実に進めていきたいと思います。
最後まで読んでいただきありがとうございました。
本件に関するお問い合わせ先
グリーエンターテインメント株式会社 広報担当
東京都港区六本木6-11-1 六本木ヒルズゲートタワー
E-mail:info-ent@ml.gree.net