안녕하세요 봉자씨입니다.
ERROR
Error:Execution failed for task ':app:transformClassesWithDexForDebug'.
> com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'C:\Program Files\Java\jdk1.7.0_67\bin\java.exe'' finished with non-zero exit value 1
무슨 에러인가?
결론적으로 이야기 하면 MULTI DEX 문제. 너무 많은 메소드를 참조하여 발생하는 문제.
안드로이드 개발을 하다 보면 앱(APK) 파일은 DEX(Dalvik Executable) 파일 형식의 실행 가능 바이트코드 파일을 포함하고 있다. 개별 .dex파일은 사용할 수 있는 메서드의 총 개수가 65,536로 제한되어 있다. 그래서 이 제한을 보통 ’64K 참조 제한’이라고 한다. 그럼 과연 DEX파일 형식은 왜 추가되고 왜 늘어 나는 것이냐가 중요합니다.
왜 갑자기 멀티DEX에러가 발생하는 걸까?
쉽게 이야기 하자만 너무 많은 메소드를 가져와서 실행을 하려고 하니 담을 수 있는 그릇이 넘치는 것이고 그로 인해서 더 추가해 라고 요구하는 것입니다.
과연 얼마나 들어 가득 찾길래 멀티가 필요하다는 거지?
안드로이드 스튜디오의 메뉴에서 Build > Analyze APK를 선택하면 .apk 파일을 구성하는 것들을 자세히 살펴볼 수 있습니다. 꼭 확인 해보세요!
그래서 멀티 DEX는 어떻게 구성이 되는 거져?
하나의 dex가 모자라서 더 많이 담기 위해서 덱스 파일을 두개를 두겠다는 겁니다.
classes.dex와 classes2.dex파일로 .dex 파일이 2개 있는 것을 알 수 있다.(위에 사진을 보면 보이죠?)
해결 방안!
1. build.gradle 파일에 multidex 라이브러리를 추가하고, multidexEnabled 옵션을 true로 설정
중요한 사항 minSdkVersion 21 이상일 경우는 아래와 같이만 하면 됨.
android {
defaultConfig {
...
minSdkVersion 21
targetSdkVersion 26
multiDexEnabled true
}
...
}
그러나 minSdkVersion 21 미만 즉, 20이하일 경우는 mulidex 지원 라이브러리를 사용해야해서 아래와 같이 수정.
android {
defaultConfig {
...
minSdkVersion 15
targetSdkVersion 26
multiDexEnabled true
}
...
}
dependencies {
compile 'com.android.support:multidex:1.0.1'
}
2. Application 클래스를 재정의 했느냐의 여부에 따라 두가지 방법으로 적용이 가능함.
Application
클래스를 따로 재정의 하지 않았다면 ?
-> 매니페스트 파일을 편집하여 <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
을 확장 변경
public class MyApplication extends MultiDexApplication { ... }
Application
클래스를 재정의하지만 기본 클래스를 변경할 수 없을 경우?
attachBaseContext()
메서드를 재정의하고 MultiDex.install(this)
을 호출하여 multidex를 활성화
public class MyApplication extends SomeOtherApplication {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(context);
Multidex.install(this);
}
}