본문 바로가기

Android Error

[Error] Execution failed for task ':app:transformClassesWithDexForDebug'


 · Execution failed for task ':app:transformClassesWithDexForDebug' 


Android Studio에서 테스트용 앱을 새로 만들다가 에러가 발생했다!!


  1   무슨 에러인가?


내가 겪은 상황은 아래 스크린샷과 같다.



문제의 원인은 Android는 메소드의 갯수의 제한이 있다. 

메소드의 ID를 지정하게 되는데 그 아이디는 0~0xffff 까지 지정이 된다.

그 갯수가 65536개이고 지금 현상은 그 수를 넘은것이다.

위치 테스트를 하기 위해서 googlePlayService 라이브러리를 추가한것이 문제를 야기했다.

googlePlayService 뿐만아니라도 다른 라이브러리를 여러개 추가해 사용하면 충분히 발생할 수 있는 문제이다.



  2   해결


 - 문제가 된 라이브러리 


compile 'com.google.android.gms:play-services:9.8.0'


이 문제를 해결하기 위해서는 MultiDex 기술을 사용하여야 한다.

MultiDex는 65536의 메소드 수를 멀티멀티하게 사용하게 해준다.


* MulityDex는 SDK Build-tools 21.1.1 이상에서 지원한다.


지금부터 MulityDex를 적용해 보겠다.


처음으로 app 단위의 gradle 설정파일에 들어가서 다음과 같이 

defaultConfig에 multiDexEnabled true 와

dependencies에 multuDex를 추가해준다.

defaultConfig {
applicationId "com.sample.sampleApplication"
minSdkVersion 16
targetSdkVersion 24
versionCode 1
versionName "1.0"
multiDexEnabled true   ← 이 부분 추가

}

dependencies {
compile 'com.android.support:appcompat-v7:24.2.1'
compile 'com.android.support:multidex:1.0.0'        ← 이 부분 추가
compile 'com.google.android.gms:play-services:9.8.0'
}

그다음 Application class를 하나 생성하여 MultiDexApplication을 상속받는다.

public class MyApplication extends MultiDexApplication {
public ApplicationManager() {
super();
}

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

}

생성한 Application Class를 Manifest에 등록해준다.

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:name=".MyApplication"         이 부분 추가

android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>


이렇게만 작성 후 다시 빌드를 하면 에러는 사라진다.

Application class에 대한것은 구글을 검색해보기 바란다.

Application class가 필요없다면 Manifest application name에 바로 MultiDexApplication을 넣어도 된다.