본문 바로가기
Android

[Android] MultiDex 오류 해결하기

by 방방방땡 2018. 12. 6.

 

MultiDex 오류 해결하기

 

 

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

# methods: 66826 > 65536

 

이 오류는 65536(64K)바이트 이상의 함수(Method)를 초과할 경우에 발생 한다고 합니다.

65536(64K)  단일 DEX(Dalvik Executable) 바이트코드 파일 내에서 코드가 호출할 수 있는 참조의 총 개수를 나타냅니다. 그래서 DEX 파일은 함수를 64K를 초과할 수 없습니다. 이를 해결위해 Multidex 활성화 해야 합니다Multidex dex파일을 여러개로 나눠주고 나눠진 여러개의 DEX 파일을 빌드하고 읽을 있게 해줍니다.

 

안드로이드 개발자 페이지에도 MultiDex에 대해 명시되어 있네요.

 

 

이제 Multidex 적용을 해보도록 하겠습니다.

 

build.gradle 파일편집

 

1. android에 multiDexEnabled true 추가

 

2. dependenciesd에 implementation 'com.android.support:multidex:1.0.3' 추가

 

 

android {
compileSdkVersion 27
defaultConfig {
minSdkVersion 19
targetSdkVersion 27

//multi-dex

multiDexEnabled true
}

}

 

 

dependencies {
//multi-dex
implementation 'com.android.support:multidex:1.0.3'
}

 

매니페스트 파일편집

 

3. <application> 태크에 android:name 추가

 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp">
    <application
        android:name="android.support.multidex.MultiDexApplication" >
        ...
    </application>
</manifest>

 

Application 클래스를 재정의할 경우 다음과 같이 MultiDexApplication을 확장하도록 변경

 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp">
<application
android:name=".GlobalApplication" >

...
</application>
</manifest>

 

저는 카카오톡 로그인 API 를 사용해야 하기때문에 GlobalApplication 클래스에 MultiDexApplication을 확장하였습니다.

 

public class GlobalApplication extends MultiDexApplication {

    private static volatile GlobalApplication obj = null;
    private static volatile Activity currentActivity = null;

    @Override
    public void onCreate() {
        super.onCreate();
        obj = this;
        KakaoSDK.init(new KaKaoSDKAdapter());
    }

    public static GlobalApplication getGlobalApplicationContext() {
        return obj;
    }

    public static Activity getCurrentActivity() {
        return currentActivity;
    }

    // Activity가 올라올때마다 Activity의 onCreate에서 호출해줘야한다.
    public static void setCurrentActivity(Activity currentActivity) {
        GlobalApplication.currentActivity = currentActivity;
    }
}

 

적용완료되었고 프로젝트를 시작하니 정상적으로 작동하였습니다.