본문 바로가기
개발/Android

[Android] MultiDex 로 64K 메서드 제한 해결하기

by blacktree 2022. 5. 16.
반응형

안드로이드 애플리케이션을 개발하다 보면 모든 기능을 개발하면 좋겠지만 시간과 인력의 제약 때문에 외부 라이브러리를 다수 사용하게 됩니다. 외부 라이브러리를 많이 쓰면 애플리케이션 전체 메서드의 개수가 65536 개가 넘어갈 수 있습니다.

빌드중에 다음과 같은 에러가 발생하고 빌드가 중지되게 됩니다.
 
 
  1. 오류메시지
    1. <textarea wrap="soft" class="crayon-plain print-no" data-settings="dblclick" readonly="" style="box-sizing: border-box; color: rgb(0, 0, 0); font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; margin: 0px; overflow: hidden; display: block; width: 1138px; height: 30px; padding: 0px 5px; border-width: 0px; border-style: initial; vertical-align: top; max-width: 100%; opacity: 0; border-radius: 0px; box-shadow: none; white-space: pre; word-wrap: normal; resize: none; tab-size: 4; font-size: 12px !important; line-height: 15px !important; font-family: Monaco, MonacoRegular, "Courier New", monospace !important; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"></textarea>
      1Conversion to Dalvik format failed:
      2Unable to execute dex: method ID notin[0,0xffff]:65536

      또는

      <textarea wrap="soft" class="crayon-plain print-no" data-settings="dblclick" readonly="" style="box-sizing: border-box; color: rgb(0, 0, 0); font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; margin: 0px; overflow: hidden; display: block; width: 1138px; height: 45px; padding: 0px 5px; border-width: 0px; border-style: initial; vertical-align: top; max-width: 100%; opacity: 0; border-radius: 0px; box-shadow: none; white-space: pre; word-wrap: normal; resize: none; tab-size: 4; font-size: 12px !important; line-height: 15px !important; font-family: Monaco, MonacoRegular, "Courier New", monospace !important; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"></textarea>
      1trouble writing output:
      2Too many field references: 131000; max is 65536.
      3You may try using --multi-dex option.
  2. 해결
이를 해결하기 위해서는 메서드의 개수를 줄이거나 multi dex 라는 기법을 사용해서 앱을 패키징해야 합니다. 현실적으로 메서드의 개수를 줄이는데에는 한계가 있으므로 안드로이드 스튜디오에서 multi dex 를 적용하는 방법을 알아보겠습니다.
다음과 같이 build.gradle 파일을 수정합니다.
  1. android > defaultConfig 에 applicationId와 multiDexEnabled true를 추가합니다.
  2. depenencies에 compile ‘com.android.support:multidex:1.0.0’ 를 추가합니다.

Application 객체를 정의해서 사용한다면 Application를 상속받는 것이 아닌 MultiDexApplication을 상속받는 형식으로 수정합니다.
applicationId 는 프로젝트의 id 를 지정하도록 합니다.
android {
    …
    defaultConfig {
        …
        applicationId ”com.example.myexample”
    multiDexEnabled true
        …
    }
    …
}
 
depenencies {
     …
     compile ’com.android.support:multidex:1.0.0’
     …
}
public class MyApp extends MultiDexApplication {
   …
}
  1. Application 객체를 사용하지 않는 다면 AndroidManifest.xml 의 Application 태그에 name 속성을 지정합니다.
<application
    android:name=”android.support.multidex.MultiDexApplication”
</application>

 

728x90
반응형

댓글