Android

MultiDex 에러..?

ggbon 2021. 3. 14. 15:15

 

현재 회사에서 앱을 테스트하는 과정에서 다음과 같은 현상이 발생했습니다.

  • API19 테스트 중 앱이 Crash되며 앱이 실행되지 않는 현상 발생!!

    • 에러로그

01-21 15:45:01.823 3747-3747/com.platfarm.example.mojitoksdksampleapp E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.platfarm.example.mojitoksdksampleapp, PID: 3747
    java.lang.RuntimeException: Unable to get provider androidx.lifecycle.ProcessLifecycleOwnerInitializer: java.lang.ClassNotFoundException: Didn't find class "androidx.lifecycle.ProcessLifecycleOwnerInitializer" on path: DexPathList[[zip file "/data/app/com.platfarm.example.mojitoksdksampleapp-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.platfarm.example.mojitoksdksampleapp-1, /vendor/lib, /system/lib]]
        at android.app.ActivityThread.installProvider(ActivityThread.java:4793)
        at android.app.ActivityThread.installContentProviders(ActivityThread.java:4385)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4325)
        at android.app.ActivityThread.access$1500(ActivityThread.java:135)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5017)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
        at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.ClassNotFoundException: Didn't find class "androidx.lifecycle.ProcessLifecycleOwnerInitializer" on path: DexPathList[[zip file "/data/app/com.platfarm.example.mojitoksdksampleapp-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.platfarm.example.mojitoksdksampleapp-1, /vendor/lib, /system/lib]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:457)
        at android.app.ActivityThread.installProvider(ActivityThread.java:4778)
        at android.app.ActivityThread.installContentProviders(ActivityThread.java:4385) 
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4325) 
        at android.app.ActivityThread.access$1500(ActivityThread.java:135) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:136) 
        at android.app.ActivityThread.main(ActivityThread.java:5017) 
        at java.lang.reflect.Method.invokeNative(Native Method) 
        at java.lang.reflect.Method.invoke(Method.java:515) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
        at dalvik.system.NativeStart.main(Native Method) 

 

 

  • Dex란?

    안드로이드의 경우는 클래스를 .dex 형식의 파일로 컴파일해서 APK를 구성하고 있습니다. 문제는 Dex파일은 함수의 개수가 64K개를 초과할 수 없다는 것이죠. 그래서 나온개념이 MultiDex인데요. 함수의 개수가 많아지면 dex파일을 쪼개서 실해하는 것입니다. 런타임별 MultiDex에 대한 지원과 정보는 아래링크에서 확인하실 수 있습니다.

 

 

64K가 넘는 메서드의 앱에 관해 멀티덱스 사용 설정

 

64K가 넘는 메서드의 앱에 관해 멀티덱스 사용 설정  |  Android 개발자  |  Android Developers

앱이 여러 DEX 파일을 빌드하고 읽을 수 있도록 하는 multidex라는 앱 구성의 사용설정 방법에 관해 알아보세요.

developer.android.com

  • API20 이하의 플랫폼에서는 Dalvik 런타임이 MultiDex를 자동으로 지원하지 않으므로 명시적으로 MultiDex 라이브러리를 Gradle에 추가해야합니다.

  • API21 이상의 플랫폼에서는 ART 런타임이 기본적으로 MultiDex를 적용하기때문에 에러가 발생하지 않습니다.

  • Gradle 과 App class들 다음과 같이 변경합니다.

implementation 'com.android.support:multidex:1.0.3'
class App : Application() -> class App : MultiDexApplication()