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가 넘는 메서드의 앱에 관해 멀티덱스 사용 설정 | 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()