안드로이드 MultiDex 적용하기

개발/안드로이드 2017. 11. 9. 08:05
반응형

안드로이드에서 앱 개발을 하다 규모가 커지게 되면 코드도 많아지고 라이브러리도 많아지게 됩니다.

이럴때 빌드시 오류가 발생하게 됩니다. 


  trouble writing output:

  Too many field references: 131000; max is 65536.

  You may try using --multi-dex option.


이 오류는 65536(64K)개 이상의 함수(Method)를 초과할 경우에 발생 합니다. 안드로이드에서는 JAVA의 class 를 사용하지 않고 class -> dex로 변환하여 사용하고 있습니다. 즉, java에서는 MainActivity.java를 컴파일 하면 MainActivity.class 생성되는데 이를 다시 MainActivity.dex 파일로 변환하게 됩니다.

dex는 Dalvik Executable로 안드로이드 달빅 가상 머신 (DVM)에서 실행되는 포맷입니다.


dex 파일은 함수를 64K를 초과할 수 없습니다. 이를 해결위해 Multidex 개념이 나오게 된것입니다.  

Multidex는 64K 메소드가 넘은 dex파일을 여러개로 쪼개주고 쪼개진 dex를 읽을 수 있도록 해줍니다. 


(글자가 짤리면 스크롤 해보세요.)

 [MainActivity.java] -> [MainActivity.class] -> [MainActivity1.dex, MainActivity2.dex]

이렇게해서 함수가 64K를 넘어가더라도 주의점은 Multidex를 적용하고 Instant Run가 활성화 되어 있을 경우 갤럭시S3 등 Android 4.4 (API 레벨 20) 이하의 기기에서는 오류가 발생하며 실행이 되지 않을 것입니다.

Multidex를 적용했을 경우 Android 5.0 이상에서 테스트하길 권하며 그 아래 일경우 Instant Run 를 비활성화 하시면 됩니다.


이제 Multidex 설정방법에 대해 알아봅시다.


build.gradle 파일에 "multiDexEnabled true" 설정하고 dependencies에 multidex 라이브러리도 추가해줍니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
android {
    compileSdkVersion 26
    buisVersion '26.0.2'
  
    defaultConfig {
        ..
        multiDexEnabled true
        ..
    }
    ..
}
 
dependencies {
    compile('com.android.support:multidex:1.0.1')
}
cs



android studio 3.0 에서 Gradle version 이 4.1로 업그레이드가 되었는데요  multidex 1.0.1 버전으로 컴파일시 에러가 발생됩니다.

multidex 1.0.2 로 변경해 주셔야 합니다.

1
2
3
dependencies {
    compile('com.android.support:multidex:1.0.2')
}
cs



AndroidManifest.xml 파일에 7번째줄 처럼 application class을 추가해 줍니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.sample.multidextest"
>
 
<application
        android:name="com.sample.multidextest.MyApplication"        
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:largeHeap="true"      
        android:theme="@style/AppTheme" >
        <activity
        ..
        </activity>
 
</application>
..
cs



이제 MultiDexApplication를 상속한 MyApplication class를 생성해 줍니다. 이미 생성된 application class 가 있다면 그대로 쓰시고 extends 에 MultiDexApplication 으로 변경 해주시면 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
public class MyApplication extends MultiDexApplication{
 
    ..
    
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }
 
    ..
}
cs











구글 안드로이드 개발자 사이트도 참고하세요.

https://developer.android.com/studio/build/multidex.html#about


반응형
admin