말랑말랑제리스타일

플러터 에러 Cannot fit requested classes in a single dex file 본문

프로그래밍/플러터 앱개발

플러터 에러 Cannot fit requested classes in a single dex file

제리제리 2023. 11. 21. 12:03

플러터에서 Cannot fit requested classes in a single dex file 에러는 안드로이드 앱을 빌드할 때 발생하는 에러로 현재 프로젝트가 single dex로 세팅되어 있지만 single dex로는 빌드가 불가능하다는 뜻으로 이해가 됩니다. 

 

굉장히 복잡한 소리를 늘어놨지만 별거 아닙니다.

Cannot fit requested classes in a single dex file 에러 화면
Cannot fit requested classes in a single dex file 에러 화면

 

일단 Cannot fit requested classes in a single dex file 에러는 해결방법이 간단하니 해결 방법부터 보고 원인을 알아봅시다.

Cannot fit requested classes in a single dex file 에러 해결 방법

일단 가장 간단한 Cannot fit requested classes in a single dex file 에러 해결 방법을 알아봅시다.

먼저 프로젝트 폴더 내의 android 폴더를 확인할 수 있을겁니다.

이 android 폴더 안에 있는 app 폴더로 들어가면 build.gradle 파일이 있는데요.

확인할 build.gradle 파일
확인할 build.gradle 파일

android 폴더 바로 밑에 있는 파일 아니고 app 폴더 안에 있는 build.gradle 파일입니다.

(같은 이름의 파일이 두 개 있어서 헷갈릴 수 있습니다.)

 

파일을 열어서 defaultConfig라는 문구를 찾아갑시다.

그럼 중괄호로 묶여있죠.

그 중괄호의 마지막 줄에는 versionName flutterVersionName이라고 되어있네요.

이 밑에다가 간단하게 한 줄만 입력해 줍니다.

multiDexEnabled true

build.gradle 파일
build.gradle 파일

그림으로 보면 상단의 화면과 같이 들어가게 될 겁니다.

그리고 다시 컴파일 및 빌드를 하면 정상적으로 AVD에서 실행되는 것을 확인할 수 있습니다.

 

플러터 Cannot fit requested classes in a single dex file 에러 발생 원인

일단 플러터에서 Cannot fit requested classes in a single dex file 에러가 발생하는 원인은 최근에 추가한 pub 때문일 겁니다.

pub.dev 사이트로 들어가서 해당 pub의 SDK 지원 버전을 살펴봅시다.

pub.dev 사이트에서 SDK 버전 확인
pub.dev 사이트에서 SDK 버전 확인

Android로 빌드할 때 지원하는 SDK 버전이 21 이상이라고 되어있네요.

SDK 버전 21 이상부터는 안드로이드에서 Single Dex가 아닌 Multi Dex를 디폴트로 사용한다고 합니다.

그렇기 때문에 이 Cannot fit requested classes in a single dex file 에러는 최소 SDK 버전이 20 이하인 경우에만 발생하고 최소 SDK 버전을 21로 지정하면 발생하지 않는다는 거죠.

하지만 대부분의 개발자는 어지간하면 라이브러리 하나 때문에 최소 SDK 버전을 바꾸지 않죠.

그래서 상단의 해결책과 같이 multi dex를 사용하도록 설정해 주는 겁니다.

 

안드로이드에서 Multi dex는 뭐고 single dex는, 아니 심지어 Dex가 뭘까?

여기까지만 알아도 이제 해결은 가능합니다. 하지만 문득 궁금증이 생겼죠. 안드로이드 SDK에서 Multi dex가 뭐고 Single dex는 뭔지에 대한 의문입니다.

심지어 Dex라는 용어도 지금껏 신경을 쓰지 않아도 되었는데 갑자기 나오니 뭔지 궁금해졌습니다.

안드로이드 플랫폼은 Dex라는 파일을 사용해 코드를 패키징 한다고 합니다.

따라서 Dex 파일에는 안드로이드 런타임 환경의 컴파일된 코드가 존재한다고 하네요.

 

그러나 기존 방식인 Single Dex에서 문제점이 생깁니다.

기존 Dex에서 메서드 참조 수가 65536개로 제한이 되어있었던 거죠.

 

그러다 보니 프로젝트가 점점 커진 것을 감당하기가 힘들어지기 시작합니다.

여기서 multi dex라는 안드로이드의 신규 메커니즘이 등장하죠.

이 multi dex라는 메커니즘을 이용해 메서드 참조 가능한 숫자를 65536개를 넘을 수 있게 만들었다고 합니다.

사실상 이걸 모르는 저 같은 개발자들에게 유의미한 메커니즘은 아닐 수도 있겠네요.

그래도 제가 사용하고 싶은 pub을 사용하려면 이 기준에 맞춰야 한다고 하니 build.gradle 파일을 수정해서 맞춰주고 에러가 픽스된 것 같습니다.

반응형
Comments