LoginSignup
0
0

More than 3 years have passed since last update.

Android4系でClassNotFoundExceptionが発生して起動できない件

Last updated at Posted at 2019-04-24

前提

  • 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があるという理解。

参考資料

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0