みなさんこんにちわー!
M3Softの浅野です。
ここ一年くらいUnityで新作ゲームを作っているんですが
今回はその中でハマって死にかけた
NCMBとアドフリくんのSDK導入方法について書いていきたいと思います。
もともと両方のSDKを導入して動いてはいたんですが
NCMBが一部APIが利用不可になるとの事で
SDKをアップデートする必要があり
アップデートしたら数日間Androidの実機ビルドエラー地獄にハマって死にかけたので
同じ地獄にハマった人の助けになれればいいなと思います。
※iOSは未確認です。
環境
Unity:2017.3.1f1
NCMB:v4.0.0
アドフリくん(静止画):adfurikunSDK_Unity_2_7
アドフリくん(動画):adfurikunSDK_Unity_
先に必要な手順だけ記載
やり方だけ分かれば細かい内容はみる必要ないよ!って方は以下だけみればいいかと。
- NCMBのSDKをインポート
-
AndroidManifestを「Plugins / Android / NCMB」の下に移動
-
アドフリくん(静止画)のSDKのnogoogle版をインポート
-
「support-compat-26.0.2」「support-core-utils-26.0.2」「support-v4-26.0.2」を削除
-
アドフリくん(動画)のSDKのnogoogle版をインポート
-
「android-support-v4」を削除
-
「PlayerSettings」→「Publishing Settings」の「Build Systems」を「Gradle」に設定。「Custom Gradle Template」をチェック
-
Plugins / Androidのフォルダに自動生成された「mainTemplate」に下記を追加
defaultConfig { multiDexEnabled true }
- 完了!!
※ビルドはできたけど実機に取り込んだらエラーが出て落ちる場合
アドフリくんの動画系のオブジェクト読み込み時にエラーになっている可能性あり。
一度アドフリくんの広告配信設定を全てオフにして30分くらいして設定が反映されたかな、くらいのタイミングでもっかい試してみて。
それでうまくアプリが表示できるなら広告の問題かも?
私の場合はmaioの配信設定を外してAppLovinのみにしたら動画系広告でエラーはでなくなりました。
NCMBのSDKをインポート
NCMB.unitypackageを実行して全てインポート
NCMBフォルダを作成して、AndroidManifestファイルを移動する。
AndroidManifestの「YOUR_PACKAGE_NAME」を自分のパッケージ名に変更
例:package=”com.sample.project”
アドフリくん(静止画)のSDKのnogoogle版をインポート
nogoogle版のadfurikunPlugins_r2.7.unitypackageを実行して全てインポート
AdfuriStillImageフォルダを作成して、AndroidManifestファイルを移動する。
「android-support-v4」と
「support-compat-26.0.2」「support-core-utils-26.0.2」「support-v4-26.0.2」の
ライブラリが重複している(みたい)なので
「support-compat-26.0.2」「support-core-utils-26.0.2」「support-v4-26.0.2」を削除
※ビルドすると重複エラーがでるので不要なライブラリを削除
アドフリくん(動画)のSDKのnogoogle版をインポート
nogoogle版のadfurikunPlugins_2_20_0.unitypackageを実行してインポート
※AndroidManifestが先ほどインポートしたものを上書きしてしまわないかチェック!
上書きしてしまう場合には一旦チェックを外して、「adfurikunPlugin_googlelib」の方の中にあるAndroidManifestを手動でPlugins / Androidの直下に移動。
「android-support-v4」と「support-v4-23.0.0」ライブラリが重複している(みたい)なので
「android-support-v4」を削除
メソッド数オーバーに対応
このままビルドすると下記のエラーがでます。
com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536
これはメソッド数の最大数の「65536」をオーバーしているからでているようです。
アドフリくんのようなSSPの複数広告会社の配信をするようなサービスだと、それぞれの広告会社用のライブラリを含んでいるのでオーバーしてしまうようです。
※以前やった時はこんなことなかったんだけどなー。色々連携する広告会社が増えたからかな?NCMBの方が増えたのかな。。
なので、メソッド数オーバーの上限を外します。
「Player Settings」の「Publishing Settings」の
「Build System」を「Gradle」に設定
「Custom Gradle Template」にチェック
※Plugins / Androidの直下にmainTemplateというファイルが自動生成されます。
mainTemplateの中身を変更
「multiDexEnabled true」を追加
「useProguard **PROGUARD_DEBUG**」を削除
「useProguard **PROGUARD_DEBUG**」を削除
下記のようになります。
/ GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.0'
}
}
allprojects {
repositories {
flatDir {
dirs 'libs'
}
}
}
apply plugin: 'com.android.application'
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
**DEPS**}
android {
compileSdkVersion **APIVERSION**
buildToolsVersion '**BUILDTOOLS**'
defaultConfig {
multiDexEnabled true
targetSdkVersion **TARGETSDKVERSION**
applicationId '**APPLICATIONID**'
}
lintOptions {
abortOnError false
}
aaptOptions {
noCompress '.unity3d', '.ress', '.resource', '.obb'**STREAMING_ASSETS**
}
**SIGN**
buildTypes {
debug {
minifyEnabled **MINIFY_DEBUG**
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-unity.txt'**USER_PROGUARD**
jniDebuggable true
}
release {
minifyEnabled **MINIFY_RELEASE**
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-unity.txt'**USER_PROGUARD**
**SIGNCONFIG**
}
}
}
これでAndroidの実機ビルドは成功するはずです。
実機でアプリ起動するとエラーで落ちる場合
(以下、各アプリで広告実装が完了している前提)
ビルドができたと油断していたらここでもハマりました。
実機でアプリを起動するとエラーが発生してアプリが落ちてしまったのです。
※問題なく動作している方はここは読み飛ばしてください。
理由が分からずシラミ潰しで調査しました。
※実機のエラーログを見ればよかったのかもしれませんが、なぜか私のPCのAndroid Device Monitorが起動してくれなくて。。
まず、Unity上でアドフリくんの動画系のオブジェクトを無効にしました。
(「AdfurikunMovieInterstitialUtility」など)
広告会社によりエラーが出る場合があるとのことを聞いていたのと、何となく動画系が怪しいなと思ったので。。
そうするとアプリは正常に動作しました。
次に、Unity上の動画系オブジェクトは有効にして、アドフリくん側の動画広告の配信設定を全てOFFにしました。
※設定が反映されるのに30分くらいかかるのでちょっと待つ。
そうするとアプリは正常に動作しました。
次に、もともと動画広告の配信設定に「maio」と「AppLovin」を設定していたので片方ずつ有効にしました。
「maio」を有効にする → アプリがエラーで落ちる。
「maio」を無効にして「AppLovin」を有効にする → 正常に動作する。
んー、maioが何かおかしいのかな。。?
前までのバージョンでは動いていたのでこのバージョンのSDKで問題があるのか、私の導入方法に問題があるのかは定かではありませんが、何とか動くようになりました!
ちょっとここら辺のことはアドフリくんのサポートの方に確認をとってみようと思います。
と言うわけで!
無事実機で正常動作ができましたー!
いろんなSDKを入れる時にAndroidManifestとかライブラリが重複したり毎回問題が発生しますね。
今回の教訓は
AndroidManifestは手動でマージせずにフォルダを分けて複数配置しよう!
と言うこと。
複数配置できるのを知らなかったので手動でマージしてたんですが、危険すぎますね。
この記事に到るまでにAndroidManifestを手動でマージしてて色々やらかしていた気がします。
重複ライブラリはトライ&エラーで潰していくしかないかな。。
同じ問題で悩んでる方に少しでもお役に立てれば幸いです!
それでわ!
またねー