문제상황
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를 사용하면 문제가 없을까?
- Multidex는 빌드 속도가 느리다.
- 각 나누어진 dex 파일들을 빌드할 때 빌드툴은 Main dex 파일에 어떤 클래스들을 포함할지 고르는 아주 복잡한 의사결정을 수행
- 복잡한 과정을 하지 않으면 앱 실행에 필요한 클래스들이 Main dex에 포함되어 있지 않아 충돌이 남
- 규모가 커지는 만큼 빌드 시간이 소모
- 빌드 최적화
- 빌드 시간을 줄이기 위해서는 빌드 사이에 Multidex를 재사용하는 pre-dexing을 사용할 수도 있음
- 이 방법은 ART런타임을 지원하는 버전에서만 가능
- Android studio와 gradle plugin은 최신 버전으로 업데이트하면 패치 사항에 빌드 속도를 최적화하는 기능들이 거의 대부분 추가적으로 들어있음 (특수한 경우를 제외하고는 항상 최신 버전으로 유지하는 것이 좋음)
- Native 코드가 Main dex에 포함이 안되는 경우가 발생
- Native 코드를 사용하는 라이브러리에서 Native(JNI) 코드를 사용하게되면 컴파일러 또는 빌드 툴의 의사결정 과정에서 라이브러리가 구동되기위해 필요한 클래스들이 Main dex 파일에 포함되지 않을 수 있음
- multiDexKeepFile, multiDexKeepProguard 를 사용해서 Main dex에 포함시키도록 해야함
참고
[Android] Cannot fit requested classes in a single dex file 해결 방법 및 원인 분석
'Development > Android' 카테고리의 다른 글
AsyncTask 란 (0) | 2021.11.23 |
---|---|
OAuth2.0 소셜로그인 처리(1) - [Java]카카오 로그인 API ver2 버전(기존코드 버전) (0) | 2021.08.20 |
OAuth2.0 소셜로그인 처리(0) - 카카오 로그인 API ver2 버전 (0) | 2021.08.19 |
[HTTP] GET / POST 방식 차이 (0) | 2020.03.09 |
[안드로이드]Fragment끼리 데이터 전달 (0) | 2020.03.03 |
댓글