Multidex와 관련된 문제 정리

2019. 2. 7. 09:11Programming/Android

반응형

안드로이드에서는 Java의 class를 사용하지 않고, Class를 Dex(Dalvik Executable)로 변환하여 사용한다. Dex의 갯수는 65536(64K)개를 초과할 수 없는데, 단일 Dex파일 내에서 참조될 수 있는 메소드의 총 개수가 65536개를 초과하게 되면 오류가 발생한다. 이를 64K 참조 제한 정보라고 하며, 해결하기 위해서는 Multidex를 적용해야 한다. Multidex는 앱이 여러개의 Dex 파일을 빌드하고 읽을 수 있게 해준다.

참조; 안드로이드 MultiDex 적용하기, 투믹스 작업장
참조2; 64K 이상의 메서드로 앱 구성, Android Developers

Multidex 적용하기

Multidex를 적용하는 방법에 대해서는 64K 이상의 메서드로 앱 구성, Android Developers 페이지를 참조하기 바란다. 한글로 잘 정리되어있다. 이하는 예전에 Eclipse 환경에서 개발하던 어플리케이션을, Android Studio 최근 버전으로 빌드하는 과정에서 발생한 Multidex 오류와 해결에 대해 정리한다.

ERROR: Failed to resolve: com.android.support:multidex:[Multidex 버전]

이 경우에는 에러 메시지에 Affected Module이 표시되는데, 해당 모듈에 Multidex가 적용되지 않기 때문에 발생하는 문제다. Android Studio에서 SDK Manager를 실행한 후, Support Repository의 Android Support Repository를 설치한다. (설치되어있는 경우 다시 설치해서 해결되는 경우도 있다고 한다.) 이후 최상위 app의 build.gradle에 위치한 allprojects의 repository 내용을 살펴보자. allproject의 repository에는 google(), jcenter()가 추가되어야한다.

buildscript {
  repository {
    google()
    jcenter()
  }
}

allproject {
  repository {
    google()
    jcenter()
  }
}

이와 관련된 내용은 3 Tips to Help You Migrate to Android Studio 3.0, SafeDK에 잘 정리되어 있다.

Error: Program type already present:[모듈명]

Multidex가 class를 dex로 변환하는 과정에서, 같은 모듈을 두 번 이상 참조하기 때문에 발생하는 현상이다. 이를 Dependency Conflict Error라고 부른다. 이러한 문제를 해결하기 위해서는 build.gradle파일에서 compile, implementation, api 키워드로 의존성을 설정할 때, exclude 키워드로 문제가 발생하는 모듈을 로드하지 않도록 설정하여 해결이 가능하다. 다음의 글을 참조하도록 하자. Resolving Conflicts in android gradle dependencies, Anshul jain

반응형