Flutter Method error? [LEE'Today]

ieed0205·2020년 3월 30일
0

LEE'Today

목록 보기
14/15

오늘 하루엔 뭐했니?

그냥 적어봐! LEE렇게!


2020.03.28 LEE'Today_회고록

목차

1. Flutter error - Method error?
2. 키즈코스와 메모메모 연동?

1. Method error?

메서드 에러가 무엇일까?

Error:Cannot fit requested classes in a single dex file. 
Try supplying a main-dex list.

# methods: 74362 > 65536

이런 에러를 개발하는 과정 중에서 보신적이 있나요?
해당 에러가 발생하고 갑자기 어플리케이션의 실행이 안되었습니다.

그렇담?
구글링을 통해 에러를 해결해보아야겠지요!
에러를 해결한 링크는 여기 입니다!

안드로이드 패키지의 Build.gradle에서,
코드 : multiDexEnabled true
를 포함시키고,
후에 dependencies에 의존성을 추가해줍니다!

바로 에러가 해결되더군요!

1-1. 에러가 왜 발생되었는가?

이곳에서 발견하였습니다!
출처: [개발하는 두더지]

APK 파일에는 DEX(Dalvik Executable) 파일 형식의 실행 가능한 바이트코드 파일이 포함됩니다.

단일 DEX 파일 내에서 참조할 수 있는 메서드의 총 개수를 65,636으로 제한하며 이 DEX 파일에는 프레임워크 메서드, 라이브러리 메서드, 본인 앱에서 정의한 메서드가 모두 포함됩니다. 즉 앱 내의 모든 메서드가 65,536개를 넘어서 이러한 에러가 발생한 것입니다. 64 * 1024의 값과 동일하며 이 제한을 64K 참조 제한이라고 합니다.

안드로이드 L (롤리팝, 5.0 API 21 ) 미만의 플랫폼 버전에서는 앱 코드 실행을 위해 Dalvik 런타임을 사용합니다. APK당 하나의 classes.dex 바이트코드 파일로 앱을 제한합니다. 이러한 제한을 해결하기 위해 multidex 지원 라이브러리를 사용할 수 있습니다.

안드로이드 L (롤리팝 5.0 API 21) 이상에서는 Dalvik이 아닌 ART (Android Runtime)이라는 런타임을 사용합니다. 이 런타임은 APK 파일로부터 여러 개의 DEX 파일을 로드하는 것을 지원합니다. ART는 앱 설치 시에 사전 컴파일 수행하여 classesN.dex 파일들을 스캔하고, 안드로이드 기기가 실행할 수 있도록 .oat 파일로 컴파일 합니다.

그래서 minSdkVersion 21이상이라면 multidex 지원 라이브러리가 필요없습니다. build.gradle에 간단하게 multiDexEnabled true 만 추가하면 됩니다.

1) multidex 속도가 느린 이유?

각 DEX 파일들을 빌드할 때 빌드 툴(buildToolsVersion)은 주 DEX 파일에 어떤 클래스들을 포함할지 고르는 아주 복잡한 의사결정을 수행하게 됩니다. 이러한 과정이 없다면 앱 실행에 필요한 클래스들이 주 DEX에 포함되어있지않아 Crash가 나기때문입니다. 그래서 이러한 과정을 거치게되는데 시간이 상당히 오래걸립니다.

2) 네이티브 코드가 주 dex에 포함이 안되는 경우?

네이티브 코드를 사용하는 라이브러리를 포함한다고 생각해 봅시다. 그 라이브러리에서 네이티브(JNI) 코드를 사용하게되면 의사결정 과정에서 라이브러리가 구동되기위해 필요한 클래스들이 주 DEX 파일에 포함되지 않을 수 있습니다. 그럴 경우에는 multiDexKeepFile, multiDexKeepProguard 를 사용해서 주 DEX에 포함시키도록 해야합니다.

3) 빌드 최적화

위에도 써놨듯이 multidex는 복잡한 의사결정을 수행하면서 빌드 시간이 상당히 커질 수 밖에 없습니다. 빌드 시간을 줄이기 위해서 빌드 사이에 multidex를 재사용하는 pre-dexing을 사용할 수도 있습니다. 하지만 Android 5.0 롤리팝 이상인 ART 환경에서만 가능합니다.

Android Studio 2.3 이상인 경우는 IDE에서 자동으로 pre-dexing을 사용하기 때문에 별도로 작성할 것은 없습니다. android studio와 gradle plugin은 최신버전으로 업데이트하면 빌드 속도를 최적화하는 기능들이 추가적으로 들어있기 때문에 항상 최신버전으로 유지하는 것이 좋습니다.

모두 에러를 간단하고 쉽게 해결하기 위해 구글링 스킬을 길러보도록 합시다 :)

2. 키즈코스와 메모메모 연동?

혹시 지금까지 개발하고 있는 키즈코스와 개발했었던 메모메모를 기억하시나요?

오늘 바로 두 가지를 결합하는 날이랍니다!
다 생각이 있어서튜토리얼을 진행한 것이지요!(엣헴!)

짜잔 더 많은 UI와 이제 어린이집에서 쓸만한 어플리케이션처럼 변했지요??

하지만 오류가 발생하고 있답니다 ㅠㅠ...
바로 메모메모에선 잘되던 메모save가 여기선 구동을 안하네요..

이제 그걸 해결해보아야겠죠?!
오늘은 여기까지!

기억보단 기록하자! LEE'Today로!

profile
하루를 기억하고 기록하는 개발자 LEE'Today입니다.

0개의 댓글