前提
- cocos2d-x 2系
- Android4系で動作するもの
- antからgradleに移行した際に発生
- ビルド自体はできている
- Android5系以上は特に問題なく動作
- 結論Multidex周りの問題であったが、build.gradleの記載やAndroidManifestの記載は問題なかった
- build.gradleにて、以下の値でビルドするとAndroid4系でも動作した
- debuggable = false
- minifyEnabled = true
(minifyEnabledの指定により、未使用メソッドが削除されてdexファイルが1つに収まっている可能性があるとのこと) @2019/4/25コメント反映 - proguardの指定あり
問題
何故かAndroid4系だけ、class自体は存在しているにも関わらず、以下のようにClassNotFoundExceptionが発生して起動直後にcrashする事象が発生した。
java.lang.ClassNotFoundException: Didn't find class "xxx" on path: /data/app/xxx.apk
解決方法
Applicationを継承しているクラスのOnCreateに、以下のようにMultiDexをインストールするように明記。
(Multidexの対応が不足していた)
XXXApplication.java
public class XXXApplication extends Application
{
~
@Override
public void onCreate()
{
MultiDex.install(this); // ★ここ追記
super.onCreate();
}
~
}
対応済のものは以下であったが、上記と合わせて対応したことで問題なく動作した。
build.gradle
android {
~
defaultConfig {
multiDexEnabled true
}
dexOptions {
javaMaxHeapSize "16g"
}
~
}
dependencies {
~
implementation 'com.android.support:multidex:1.0.3'
~
}
Multidexって?
1dexファイルに対して、メソッドの総数が65,536(64K)の制限があり(ビルドエラーになる)、アプリの規模が大きくなっているこのご時世、余裕で超える状況が多々ある。
ただ、複数のdexファイルに分ければ制限を回避することができるができるので、分けても動作する仕組みとしてMultidexがあるという理解。