Androidアプリ開発 Error:Execution failed for task ':app:dexDebug'. multidexに対応する

2016年03月07日(編集2016年08月04日)
このエントリーをはてなブックマークに追加

Google Play Servicesのバージョンを8.3.0から8.4.0にあげた時に、Error:Execution failed for task ':app:dexDebug'が発生しました。その修正方法を記載した記事です。
環境はAndroid 6.0 (API level 23) です。

環境

  • Android sdk 23
  • Build Tools, Revision 23.0.2
  • com.google.android.gms:play-services:8.4.0

事象

Androidアプリで利用しているGoogle play serviceのバージョンを8.3.0から8.4.0に更新。
その後、gradleでビルドした時にError:Execution failed for task ':app:dexDebug'が発生した。

変更前
{project_folder}/build.gradle
dependencies {
    compile 'com.mcxiaoke.volley:library:1.0.19'
    compile 'com.android.support:support-v4:23.1.0'
    compile 'com.google.android.gms:play-services:8.3.0'
    compile 'com.google.code.gson:gson:2.3'
    compile files('libs/twitter4j-core-4.0.2.jar')
    androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.1'
    androidTestCompile 'com.android.support.test:runner:0.4.1'
    compile 'com.android.support:appcompat-v7:23.0.0'
    compile project(':libraries:facebook')
    compile 'com.android.support:cardview-v7:23.0.0'
    compile 'com.android.support:recyclerview-v7:23.0.0'
    compile 'com.android.support:design:23.0.0'
}
        
変更後
{project_folder}/build.gradle
dependencies {
    compile 'com.mcxiaoke.volley:library:1.0.19'
    compile 'com.android.support:support-v4:23.1.0'
    -compile 'com.google.android.gms:play-services:8.3.0'
    +compile 'com.google.android.gms:play-services:8.4.0'
    compile 'com.google.code.gson:gson:2.3'
    compile files('libs/twitter4j-core-4.0.2.jar')
    androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.1'
    androidTestCompile 'com.android.support.test:runner:0.4.1'
    compile 'com.android.support:appcompat-v7:23.0.0'
    compile project(':libraries:facebook')
    compile 'com.android.support:cardview-v7:23.0.0'
    compile 'com.android.support:recyclerview-v7:23.0.0'
    compile 'com.android.support:design:23.0.0'
}
        

gradleビルドでエラー発生!!

発生箇所

android studioを使ったgradleビルド時

原因

Androidアプリでメソッド数が64k(65536)を超えるとビルド時やインストール時にエラーになる。このメソッド数はライブラリも含めてカウントされる。
つまり、Google Play Servicesのバージョンを8.3.0から8.4.0にあげたことにより、Androidアプリ全体のメソッド数が64k(65536)を超えてしまったために発生した。

修正方法

修正方法は以下のように複数あります。

  • メソッドを減らす
  • proguardを使用する
  • multidexに対応する

ここでは一般的な方法のmultidex supportで解決する方法を選択します。

multidex support

multidexの対応方法は、Android 5.0 (API level 21)前と後で異なります

Android 5.0 (API level 21)以降(minSdkVersionが21以上)なら、元々multidexに対応しています。なので対応は不要です。

minSdkVersionが20、もしくは20以下の場合は修正が必要です。
修正が必要なファイルは、build.gradleとAndroidManifest.xmlの2種類です。

{project_folder}/build.gradle
    defaultConfig {
        // something

        // Enabling multidex support.
        +multiDexEnabled true

    }

    dependencies {
        +compile 'com.android.support:multidex:1.0.0'
    }
        

続いて、マニフェストファイルを変更します。

変更前
{project_folder}/main/AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.java_lang.app">
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">
        <activity
            android:name=".ui.SplashActivity"
            android:label="@string/app_name"
            android:noHistory="true"
            android:theme="@android:style/Theme.NoTitleBar" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>
        
変更後
{project_folder}/main/AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.java_lang.app">
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme"
       +android:name="android.support.multidex.MultiDexApplication">
        <activity
            android:name=".ui.SplashActivity"
            android:label="@string/app_name"
            android:noHistory="true"
            android:theme="@android:style/Theme.NoTitleBar" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>
        

上記の変更でgradleビルドが可能になります。

まとめ

Google Play Servicesは利用するライブラリだけをビルドすることもできます。この方法は、ソースコードを修正する時間があれば、apkファイルの容量が減るので良い選択です。現在のGoogle Play Servicesは全てのライブラリを導入すると、結構な容量が増えるので、必要なライブラリだけに絞る方が良いです。

また、dexについて理解が浅い場合は、この機会に学んでおくこともオススメします。

関連記事

タグ検索で調べてみよう

Android6.0 バグ修正