초코비니

안드로이드 MultiDex 지원 본문

안드로이드

안드로이드 MultiDex 지원

초코비니 2015. 9. 8. 19:45
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
build-tools 21.1.1부터 MultiDex 지원이 시작되었다.
DexIndexOverflowExcetion 발생
안드로이드 스튜디오에서 빌드하다가 아래와 같은 오류가 발생했다.
Error:Execution failed for task :app:dexDebug.
> com.android.ide.common.internal.LoggedErrorException: Failed to run command:
/work/usr/androidsdkmacosx/buildtools/21.1.2/dx JXmx4g dex nooptimize output/work/myapp/app/build/intermediates/dex/debug inputlist=/work/myapp/app/build/intermediates/tmp/dex/debug/inputList.txt
Error Code:
2
Output:
UNEXPECTED TOPLEVEL EXCEPTION:
com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536
at com.android.dx.merge.DexMerger$6.updateIndex(DexMerger.java:502)
at com.android.dx.merge.DexMerger$IdMerger.mergeSorted(DexMerger.java:277)
at com.android.dx.merge.DexMerger.mergeMethodIds(DexMerger.java:491)
at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:168)
at com.android.dx.merge.DexMerger.merge(DexMerger.java:189)
at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:454)
at com.android.dx.command.dexer.Main.runMonoDex(Main.java:303)
at com.android.dx.command.dexer.Main.run(Main.java:246)
at com.android.dx.command.dexer.Main.main(Main.java:215)
at com.android.dx.command.Main.main(Main.java:106)
위 오류의 주요 내용은
DexIndexOverflowExcetion 이 발생했고, 메소드 ID가 0~65535범위를 벗어났다는 내용이다.
하나의 Dex 파일에 메소드는 65535개가 최대인데 이것을 벗어났다는 의미이다.
오픈소스 라이브러리를 추가하면서 갑자기 오류가 발생했다.



MultiDex
아마.. 안드로이드 OS내부에서 클래스를 로딩하면서 메소드들에 일련번호를 부여하는데 이 일련번호의 데이터 타입이 16비트인가보다. 그럼 구글에서 클래스 로더를 수정해주면 되겠지만.. 이미 배포되어 있는 안드로이드 OS에는 적용할 수 없으니 다른 방법으로 해결해야 한다. 이에 구글에서 내놓은 방법이 MultiDex이다.  Dex 파일 한개의 메소드 개수에 제약이 있으니(65535개), 여러 Dex로 하자는 의미이다.



MultiDex를 사용하려면
1. SDK build-tools를 21.1.1이상으로 업그래이드하고,
2. build.gradle을 수정하고
3. Application 클래스를 수정해야 한다.
gradle 설정을 아래와 같이 바꾼다.
build.gradle
apply plugincom.android.application 
android {
compileSdkVersion 21
// 빌드툴버전이 21.1.1이상만 가능
buildToolsVersion 21.1.2
// … 중략 …
defaultConfig {
applicationId com.test.myapp
minSdkVersion 14
targetSdkVersion 21
versionCode 1
versionName 1.0
multiDexEnabled true
}
dexOptions {
javaMaxHeapSize 4g
preDexLibraries = false
}
}
dependencies {
// … 생략
// multidex를 추가
compile com.android.support:multidex:1.0.0
}
앱의 소스코드 수정
앱의 Application 클래스는 아래와 같이 수정한다.
public class MyApplication extends android.support.multidex.MultiDexApplication
{
// …
}
참고
나중에 시간날때 더 읽어보자.
MultiDex와 관련하여 좀 예전 글이지만 개념파악하는데 도움이 된다.
http://blog.osom.info/2014/10/generating-main-dex-list-file.html
안드로이드 개발자문서: Building Apps with Over 65K Methods
https://developer.android.com/tools/building/multidex.html#about

출처 : http://ohlab.kr/w/?p=153


Comments