ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Error] Execution failed for task ':app:transformClassesWithDexForDebug'
    Android Error 2016.11.09 19:02


     · 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을 넣어도 된다.



    댓글 1

Designed by Tistory.