태그 보관물: 멀티 dex

멀티 dex 사용하기

안드로이드(Android) 앱(APK) 파일은 DEX(Dalvik Executable) 파일 형식의 실행 가능 바이트코드 파일을 포함하고 있다. 개별 .dex파일은 사용할 수 있는 메서드의 총 개수가 65,536로 제한되어 있다. 그래서 이 제한을 보통 ’64K 참조 제한’이라고 한다.

안드로이드 스튜디오의 메뉴에서 Build > Analyze APK… 를 선택하면 .apk 파일을 구성하는 것들을 자세히 살펴볼 수 있고, 이 제한을 넘어서 더 많은 메서드등을 사용하는데는 2개 이상의 .dex 파일이 필요하다. 그래서 2개 이상의 .dex 파일을 생성하도록 앱 빌드 프로세스를 구성해야 하며, 이것을 multidex 구성이라고 한다. 아래 이미지를 보면, classes.dex와 classes2.dex파일로 .dex 파일이 2개 있는 것을 알 수 있다. 

안드로이드 앱에서 멀티 dex를 사용하는 방법은 3가지의 형태가 있을 수 있다. 첫번째가 Application 클래스를 사용하지 않는 경우, 두번째는 Application 클래스를 사용하는 경우, 그리고 마지막은 MultiDexApplication 클래스를 사용하는 경우이다.

멀티 dex를 사용하는데 필요한 과정의 기본은 build.gradle 파일에 multidex 라이브러리를 추가하고, multidexEnabled 옵션을 true로 설정하는 것이다.

android {
	defaultConfig {
		multiDexEnabled true
	}
}

dependencies {
	compile 'com.android.support:multidex:1.0.1'
}

이제 위 설정이 완료됐으면, 멀티 dex를 사용하는 3가지 형태에 대해서 살펴보자.

1. Application을 사용하지 않는 경우

이 경우에는 아래의 코드를 AndroidManifest.xml 파일에 아래처럼 Application을 설정해야 한다.



    
        ...
    

2. Application을 사용하는 경우

프로젝트의 AppApplication 클래스가 Application을 상속해서 구현하고 있다고 가정한다. 이 경우에는 아래와 같은 코드가 AndroidManifest.xml 파일에 설정해야 한다.



    
        ...
    

그리고, AppApplication 에 아래의 코드를 추가한다.

@Override
protected void attachBaseContext(Context base) {
	super.attachBaseContext(base);
	MultiDex.install(this);
}

3. MultiDexApplication을 사용하는 경우

이 경우가 가장 간단하게 사용할 수 있다. AndroidManifest.xml은 위 2.와 동일하게 설정한다. 그리고, 아래처럼 Application 클래스가 MultiDexApplication을 상속하면 된다.

public class AppApplication extends MultiDexApplication {
}

어떻게 MultidexApplication만 상속하면 돼는지, 이 클래스의 소스를 살펴보면 다음과 같다.

package android.support.multidex;

import android.app.Application;
import android.content.Context;
import android.support.multidex.MultiDex;

public class MultiDexApplication extends Application {
	public MultiDexApplication() { 
	}

	protected void attachBaseContext(Context base) {
		super.attachBaseContext(base);
		MultiDex.install(this);
	}
}

이 소스를 보면, Application에서 사용하는 코드를 제공하는 래퍼 클래스임을 알 수 있다. 결론으로, Application 클래스를 사용하는 것은 꽤 유용하므로, 개인적으로 3번째 방법을 사용해서 멀티 dex를 제공하는 것이 좋겠다.