とりあえずメモ。
環境はUnity 2017.1.0f3です。
Unity 2017.1でビルドしたAndroidアプリが落ちる
Unity2017がリリースされたので簡単に試してみたところ、ビルドしたAndroidアプリを実行すると「Caused by: java.lang.NoSuchMethodError: com.unity3d.player.UnityPlayer.<init>」エラーで落ちてしまいました。
コンストラクタの呼び出しっぽいことはわかるのですが、Unity 5.6では正常に動作しているのでよくわからない。
アプリではGREEが作っているWebViewプラグインを使っていて、どうもそれが引っかかっているようでした。
Unity 2017でUnityPlayerの引数が変わったみたい
調べていくと、どうもcom.unity3d.player.UnityPlayerのコンストラクタ引数が変更されているようでした。
Unity 5.6では
public UnityPlayer(ContextWrapper contextwrapper)
ですが、Unity 2017.1では
public UnityPlayer(Context context)
となっているようです。
そのため、Unity 5.6のEditor/Data/PlaybackEngines/AndroidPlayer/Variations/mono( または il2cpp)/Development( または Release)/Classes/classes.jar をリンクしてビルドしているプラグインにおいて、UnityPlayerを継承しているクラスのコンストラクタで、
public ExtendUnityPlayer(ContextWrapper contextwrapper) { super(contextwrapper); }
みたいなコードを書いていた場合に落ちていたようです。
jarのclassは中間言語になっていますから、実行時に落ちてしまう流れですね。
簡易な対応はUnity 2017.1のclasses.jarでビルドする
この問題、Unity 2017.1だけを対象にするなら、2017.1のclasses.jarをリンクしてプラグインをコンパイルしてやればいい話です。
そこでこの部分がエラーになってくるでしょうから、
public ExtendUnityPlayer(Context context) { super(context); }
などとしてやれば良いでしょう。
ただ問題は、5.6との互換性を維持させようとしたときにどうすればいいのか…
Unity側で互換性のあるコンストラクタを用意してくれればそれが一番ラクなんですが、そうでなければ5.6向けと2017.1向けのjarを生成して、ビルド前に入れ替えるとかですかね…今のところ良いアイデアがありません…