見出し画像

[Unity]Android12に対応するしGoogleMobileAds7.3.0にも対応する

★この記事の内容を動画(ナレーションあり)で見る⇩

概要

テスト用Android実機が折角Android12(API31)に更新できたのに上手くビルドが通せなくて数か月保留にしていたのを、ようやく倒したので作業記録です。

あとGoogleMobileAds(Admob)5.4.0は2022 年 9 月 30 日でサポートが切れてしまったので(そして来年には動かなくなるので)こちらも新しくしました。
お使いのAdmobがサポートが切れてないかはここで確認しよう→サポートの終了と廃止

【更新前】
Unity 2020.2.1f1
GoogleMobileAds Unity Plugin V5.4.0

【更新後】
Unity 2021.3.3f1
GoogleMobileAds Unity Plugin V7.3.0

下準備

必ず作業前にバックアップを取ります。
GitHubとかにコミット&プッシュしていつでも戻せる状態にしておきます。

今回は使っていたUnityエディタがそこそこ古いので新しくします。
新しいといっても最新だとそれはそれで危ないのでほどほどに新しいLTS(長期サポートリリース)を選ぶ。
プロジェクトのエディタバージョンを変更したらアセンブリの更新などお任せする。エラーが出なければ儲けもの。出たらそれぞれ対応しておく。
オールOKになったらこの段階のバックアップも取っておきます。

Android12の対応準備

ビルド対象のバージョンにAndroid12(API31)を含める。
勿論AndroidSDKも31用のものを追加で導入しておく(AndroidStudioなどを使って)。

GoogleMobileAdsの対応準備

GoogleMobileAds7.3.0のUnityパッケージを

こうやってパッケージをインポート……しません!
インポートの前に手動でGoogleMobileAds絡みのファイルを削除します。
更新マークが付いているファイルは根こそぎ削除します。
あと更新マークどころかここに表示されてないファイルも削除します。

事前に消してないとあちこちで競合が発生します……

Assets\ExternalDependencyManager の中身全部消します。

このファイルは避けておきましょう

Assets\GoogleMobileAds\Resources のGoogleMobileAdsSettings.assetは、広告IDの設定ファイルなので避けておきましょう。その上で
Assets\GoogleMobileAds の中身全部消します。
Assets\Plugins\Android の中の
 googlemobileads-unity.aar と
 GoogleMobileAdsPlugin.androidlib も消します。

GADUから始まるファイルは全部消します

Assets\Plugins\iOS の中の
 GADUから始まるファイル全て消します。

更新マークが無ければOK

項目が上書きになってないのを確認してからインポートします。

アセンブリも更新します

アセンブリの更新を促されたらYesで更新しておきます。
※ここで事前に避けておいたGoogleMobileAdsSettings.assetを元の場所に戻しておくとこの後に発生するエラーを回避できます

ひたすらエラーと戦う

更新した状態でゲームが動くかを確認します。
実行したらさっそくエラーが発生しました。

Assembly 'Assets/Assets/Plugins/Editor/JetBrains/JetBrains.Rider.Unity.Editor.Plugin.Repacked.dll' will not be loaded due to errors:
Assembly name 'JetBrains.Rider.Unity.Editor.Plugin.Full.Repacked' does not match file name 'JetBrains.Rider.Unity.Editor.Plugin.Repacked'

※このエラーで検索したところ、既に使わなくなったファイルということで、Assets\Assets\Plugins\Editor内のJetBrainsを除去すればエラーは消えます。

ゲームが動くようになったらAndroidビルドを試みます。
エラーが発生しました。

BuildMethodException: [GoogleMobileAds] Android Google Mobile Ads app ID is empty. Please enter a valid app ID to run ads properly.

→Admob用のアプリIDが入ってないよ!
事前に避けておいたGoogleMobileAdsSettings.assetを、Assets\GoogleMobileAds\Resourcesに戻して上書きするか、広告IDを再度入力します。

本番IDとテストIDの入れ間違いに注意

Androidビルドを試みます。
エラーが発生しました。

Exception: OBSOLETE - Providing Android resources in Assets/Plugins/Android/res was removed, please move your resources to an AAR or an Android Library. See "AAR plug-ins and Android Libraries" section of the Manual for more details.
UnityEditor.Android.PostProcessor.Tasks.CheckUserResources.Execute (UnityEditor.Android.PostProcessor.PostProcessorContext context) (at <089eca9a0a77417a901dda0093fda7f3>:0)

→Assets/Plugins/Android/resはもう使えないよ!
前回はここで詰まりました。resフォルダを使わなければいいわけですが、アプリ名を多言語対応するための設定が入っているので使わざるを得ないのです。
Assets/Plugins/Android/の中に新しいフォルダを作って、名前を
 res.androidlib に変更したら
今あるresフォルダはフォルダごとres.androidlibの中に移動させます。
res.androidlibの中にテキストファイルを新規作成して、名前を
 AndroidManifest.xml に変更したら、中身をこうします。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="custom.android.res" android:versionCode="1" android:versionName="1.0">
</manifest>

更に同じ場所にテキストファイルを新規作成して、名前を
 project.properties に変更したら、中身をこうします。

target=android-9
android.library=true

※実行したら再度resフォルダが作られて再度エラーになったりもしましたが、消したり再起動したりでどうにか作られなくなりました……何だったんだ……?

Androidビルドを試みます。
エラーが発生しました。

* What went wrong:
A problem occurred evaluating project ':launcher'.
> Failed to apply plugin [id 'com.android.internal.version-check']
   > Minimum supported Gradle version is 6.7.1. Current version is 6.1.1. If using the gradle wrapper, try editing the distributionUrl in D:\Unity_project\[Unityプロジェクトフォルダ]\Library\Bee\Android\Prj\IL2CPP\Gradle\gradle\wrapper\gradle-wrapper.properties to gradle-6.7.1-all.zip

→Gradle versionが古すぎるよ!
ほどほどに新しいGradleを公式サイトからDLしてきます。6.7.1より新しければいいようです。今回は7.5.1を持ってきました。
Unity本体のgradleフォルダに置いて、パスの指定も書き換えます。

Gradleのパスを手動で指定

Androidビルドを試みます。
エラーが発生しました。

* What went wrong:
Execution failed for task ':launcher:minifyReleaseWithProguard'.
> java.io.IOException: Can't read [C:\Users\[ユーザー名]\.gradle\caches\transforms-3\14775674f7dedb4775f5a892f7c66357\transformed\googlemobileads-unity-runtime.jar(;;;;;;;**.class)] (Can't process class [com/google/unity/ads/AdNetworkExtras.class] (Unsupported version number [55.0] (maximum 54.0, Java 10)))

→googlemobileads-unity-runtime.jarが対応してないJavaクラスだよ!
このjarファイルはmajor version 55で出来てるけどUnityのJDKはVersion54なので足りてないということらしいです。
Assets/Plugins/Android/ の中にある baseProjectTemplate.gradleの中を修正する必要があるのですが、Unity側が生成してくれるテンプレート類は、一旦別の場所に移動させて再作成→必要な事項を書き足す、という方がスマートかもしれません。

チェックを外す→ファイル名を少し変えるor退避→再度チェックで再作成

baseProjectTemplate.gradle の中の dependencies の中の
 classpath 'com.android.tools.build:gradle:4.2.0' こちらはバージョンの修正をして、
 classpath 'com.guardsquare:proguard-gradle:7.1.0' こちらは書き足しました。
あと  jcenter() という記載があったら mavenCentral() に書き換えます。

書き換え・書き足しが発生した場所

Androidビルドを試みます。
ビルドに成功しました。

実機に.apkファイルを送ってインストールします。

起動……しません。
Assets/Plugins/Android/ の中にある
 launcherTemplate.gradle と
 mainTemplate.gradle の中の
buildtoolsversion を見直し、修正します。今回は'30.0.3'にしました。
(Android SDK 31に付属する'31.0.0'だとmissing DXでエラーになってしまいます……)

buildtoolsversionはこの辺

同じく Assets/Plugins/Android/ の中にある
 AndroidManifest.xml の中の
 activity に exported="true" を書き足します。

Andorid12対応で特に引っ掛かりやすい罠だそう

Androidビルドを試みます。
ビルドに成功しました。
実機に.apkファイルを送ってインストールします。
起動しました。


おまけ①Xcodeでのビルドで起こったこと

・ビルドの途中で失敗し、 Unity/EAGLContextHelper.h と Unity/GlesHelper.h が足りないと言われる
→NCMBを導入しているとよくあることだそう。
対処方法は
「前にビルドしたプロジェクトから同名ファイル(.hと.mm)をコピーして持ってくる。
場所は ビルドしたプロジェクトフォルダ\Classes\Unity の中」。
前にビルドしたプロジェクトが無かったらどうするんだろう?
プロジェクトによって漏れたり漏れなかったりするのも謎です……

・podfileの中のGoogleMobileAds SDKバージョンが古く、ビルド時にあれが足りぬこれが足りぬとエラーになる
→以前に作った ~dependencies.xml の中に古いバージョンのGoogleMobileAdsを指定したままになっていたのが原因でした。何事も無ければ適切な最新の奴がちゃんと入ります。

・AppStoreへのDistributionの段階でビックリマークと共に「non-public selectors in Payload/~」という警告が出る。でもストアへの送信は出来てる。
→Xcode側の不備らしいが数か月前から出てる模様。はよ直して。


おまけ②SocialConnectorをリストラしたこと

SNSとの共有機能として長らくお世話になっていた Social Connector v0.5.0 でしたが、ついに今回の改修後に動作しなくなりました。
色々と手は尽くしたのですが、
・書き換えなきゃ動かないって箇所が沢山ある
(例:android.support.v4.content.FileProvider→androidx.core.content.FileProvider)
・アセットの更新が2018年で止まっている
の2点で限界を感じたので、他のアセットに乗り換えました。
今回導入したのは Native Share v1.4.7 お値段は無料。
アセットストアで配信されているので導入が楽ですし、テキストと画像の同時投稿も可能です。


この記事が気に入ったらサポートをしてみませんか?