みなさんこんにちわー!

M3Softの浅野です。

 

ここ一年くらいUnityで新作ゲームを作っているんですが

今回はその中でハマって死にかけた

NCMBとアドフリくんのSDK導入方法について書いていきたいと思います。

 

もともと両方のSDKを導入して動いてはいたんですが

NCMBが一部APIが利用不可になるとの事で

SDKをアップデートする必要があり

アップデートしたら数日間Androidの実機ビルドエラー地獄にハマって死にかけたので

同じ地獄にハマった人の助けになれればいいなと思います。

※iOSは未確認です。

 

環境

Unity:2017.3.1f1

NCMB:v4.0.0

アドフリくん(静止画):adfurikunSDK_Unity_2_7

アドフリくん(動画):adfurikunSDK_Unity_moviereward_2_20_0

 

先に必要な手順だけ記載

やり方だけ分かれば細かい内容はみる必要ないよ!って方は以下だけみればいいかと。

  1. NCMBのSDKをインポート
  2. AndroidManifestを「Plugins / Android / NCMB」の下に移動

  3. アドフリくん(静止画)のSDKのnogoogle版をインポート

  4. 「support-compat-26.0.2」「support-core-utils-26.0.2」「support-v4-26.0.2」を削除

  5. アドフリくん(動画)のSDKのnogoogle版をインポート

  6. 「android-support-v4」を削除

  7. 「PlayerSettings」→「Publishing Settings」の「Build Systems」を「Gradle」に設定。「Custom Gradle Template」をチェック

  8. Plugins / Androidのフォルダに自動生成された「mainTemplate」に下記を追加

    defaultConfig {
        multiDexEnabled true
    }
  9. 完了!!

※ビルドはできたけど実機に取り込んだらエラーが出て落ちる場合

アドフリくんの動画系のオブジェクト読み込み時にエラーになっている可能性あり。

一度アドフリくんの広告配信設定を全てオフにして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を手動でマージしてて色々やらかしていた気がします。

重複ライブラリはトライ&エラーで潰していくしかないかな。。

 

同じ問題で悩んでる方に少しでもお役に立てれば幸いです!

それでわ!

 

またねー