본문 바로가기
Development/Android

[에러해결]Error:Cannot fit requested classes in a single dex file

by 메정 2021. 11. 23.

문제상황

Error:Cannot fit requested classes in a single dex file 에러 발생

해결방법

0. 에러발생 이유

안드로이드의 APK 파일에는 dex(Dalvik Executable) 파일 형식의 실행 가능한 바이트코드 파일이 포함되는데, 이 단일 dex 파일 내에서 참조할 수 있는 메서드의 총개수는 65,536으로 제한함. (프레임워크 메서드 / 라이브러리 메서드 / 프로젝트의 앱에서 정의한 메서드가 모두 포함)

라이브러리를 추가하면서 dex 파일 내 제한된 메서드 개수를 초과하여 해당 에러 발생

해결하기 위해 MultiDex로 설정하여 dex 파일이 Multi로 파티션이 나누어서 컴파일되도록 해야 함

1. 해결 과정

안드로이드 L (Lollipop, Android 5.0 API 21) 이상에서는 ART(Android RunTime) 런타임을 사용

  • ART 런타임은 APK 파일로부터 여러 개의 dex 파일을 로드하는 것을 지원함
  • ART는 앱 설치 시에 사전 컴파일 실행 → classesN.dex 파일들을 스캔 → 안드로이드 디바이스가 실행할 수 있도록 oat(Of-Ahead-Time -> Ahead-Of-Time) 파일로 컴파일
  • minSdkVersion 21 이상이라면 multidex 서포트 라이브러리가 필요 없습니다.
  • build.gradle에 간단하게 multiDexEnabled true 추가하면 됩니다.
//build.gradle(:app)
android {
    compileSdkVersion 28
    buildToolsVersion '28.0.3'

    defaultConfig {
        minSdkVersion 19
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        multiDexEnabled true // <- 추가
    }
    ...
}

2. Mutidex를 사용하면 문제가 없을까?

  1. Multidex는 빌드 속도가 느리다.
    • 각 나누어진 dex 파일들을 빌드할 때 빌드툴은 Main dex 파일에 어떤 클래스들을 포함할지 고르는 아주 복잡한 의사결정을 수행
    • 복잡한 과정을 하지 않으면 앱 실행에 필요한 클래스들이 Main dex에 포함되어 있지 않아 충돌이 남
    • 규모가 커지는 만큼 빌드 시간이 소모
  2. 빌드 최적화
    • 빌드 시간을 줄이기 위해서는 빌드 사이에 Multidex를 재사용하는 pre-dexing을 사용할 수도 있음
    • 이 방법은 ART런타임을 지원하는 버전에서만 가능
    • Android studio와 gradle plugin은 최신 버전으로 업데이트하면 패치 사항에 빌드 속도를 최적화하는 기능들이 거의 대부분 추가적으로 들어있음 (특수한 경우를 제외하고는 항상 최신 버전으로 유지하는 것이 좋음)
  3. Native 코드가 Main dex에 포함이 안되는 경우가 발생
    • Native 코드를 사용하는 라이브러리에서 Native(JNI) 코드를 사용하게되면 컴파일러 또는 빌드 툴의 의사결정 과정에서 라이브러리가 구동되기위해 필요한 클래스들이 Main dex 파일에 포함되지 않을 수 있음
    • multiDexKeepFile, multiDexKeepProguard 를 사용해서 Main dex에 포함시키도록 해야함

참고

[Android] Cannot fit requested classes in a single dex file 해결 방법 및 원인 분석

Native 코드 작성 시 에러 해결 방법

댓글