エラー:要求されたクラスを単一のdexファイルに適合できません。main-dexリストを指定してください。#メソッド:72477> 65536


309

位置情報サービスを追加したいのですが、エラーが表示されます。助けて。

apply plugin: 'com.android.application'

android {
    compileSdkVersion 26
    buildToolsVersion "27.0.1"
    defaultConfig {
        applicationId "com.example.adil.bloodbankapplication"
        minSdkVersion 15
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:appcompat-v7:26.1.0'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    compile 'com.google.firebase:firebase-auth:11.8.0'
    compile 'com.google.firebase:firebase-database:11.8.0'
    compile 'com.android.support:support-v4:26.1.0'
    compile 'junit:junit:4.12'
    compile 'com.android.support:design:26.1.0'
    compile 'com.github.joielechong:countrycodepicker:2.1.5'
    compile 'com.jaredrummler:material-spinner:1.2.4'
    compile 'hanks.xyz:htextview-library:0.1.5'
    compile 'com.firebaseui:firebase-ui-database:1.2.0'
    compile 'com.google.android.gms:play-services:11.8.0'
}


apply plugin: 'com.google.gms.google-services'

回答:


385

彼らがあなたに与えた答えはすべて網羅的ではありませんでした。問題はMultidexにあります。ライブラリをアプリグラドルに追加する必要があります。

implementation 'com.android.support:multidex:1.0.3'

その後、アプリgradleのdefaultConfigに追加します。

multiDexEnabled true

アプリケーションはMultidexタイプでなければなりません。マニフェストにそれを記述する必要があります。

android:name=".MyApplication"

「MyApplication」はMultidexクラスであるか、それを拡張する必要があります。


5
それでMyApplication extends android.support.multidex.MultiDexApplication
ban-geoengineering 2018

2
私は、このソリューションを試してみましたが、私はこの新しい問題で終わる:stackoverflow.com/questions/49518115/...
禁止-ジオエンジニアリング

22
:ここでは、なぜこれが起こると、より良いリリースバージョンのAPKを作成する方法の詳細な説明を提供公式アンドロイドドキュメントのページですdeveloper.android.com/studio/build/multidex
Vrakfall

2
それは問題を解決するための良い方法ではなく、未使用のコードとライブラリを削除し、プロジェクトコードをリファクタリングする方が良い
user25

5
Googleライブラリに80000メソッドがなかった場合、80000メソッドがないことは良い解決策です(multidexを追加したのは、誰もが使用したい独自のサービスライブラリに数万のメソッドがあったためです)。
Lassi Kinnunen、

195

以下の解決策で問題を修正しました:

Gradleビルドファイルで、依存関係を追加します。

実装 'com.android.support:multidex:1.0.3'

そして、「defaultConfig」セクションに、以下を追加します。

multiDexEnabled true


8
私のために働いた。ここでの構成の詳細な説明:developer.android.com/studio/build/multidex#mdex-gradle
Alex Burdusel

ほとんどのアプリケーションでは、multidexサポートを有効にする必要はありません。未使用のライブラリを削除することを検討する必要があります。以下の私の回答を参照してください。
MG開発者

106

アプリまたはモジュールを変更する build.gradle

android {
    defaultConfig {
        ...
        minSdkVersion 21 <----- *here
        targetSdkVersion 26
        multiDexEnabled true <------ *here
    }
    ...
}

公式ドキュメントによると

Android 5.0以降のMultidexサポート

Android 5.0(APIレベル21)以降では、APKファイルから複数のDEXファイルの読み込みをネイティブでサポートするARTと呼ばれるランタイムを使用します。ARTはアプリのインストール時にプリコンパイルを実行し、classesN.dexファイルをスキャンして、Androidデバイスで実行するためにそれらを単一の.oatファイルにコンパイルします。したがって、minSdkVersionが21以上の場合、multidexサポートライブラリは必要ありません。

Android 5.0ランタイムの詳細については、ARTとDalvikを参照してください。

https://developer.android.com/studio/build/multidex


59

dexファイルとは: Androidアプリ(APK)ファイルには、アプリの実行に使用されるコンパイル済みコードを含むDalvik実行可能(DEX)ファイルの形式で実行可能なバイトコードファイルが含まれています。

この例外の理由: DEX仕様では、1つのDEXファイル内で参照できるメソッドの総数が65,536(64K参照制限)に制限されています。これには、Androidフレームワークメソッド、ライブラリメソッド、独自のコード内のメソッドが含まれます。

ステップ01.次の依存関係を次のように追加します

Androidx以外のユーザーの場合、

dependencies {
  implementation 'com.android.support:multidex:1.0.3'
}
defaultConfig {
    minSdkVersion 16
    targetSdkVersion 28
    multiDexEnabled true  //ADD THIS LINE
}

Androidxユーザーの場合、

dependencies {
  implementation 'androidx.multidex:multidex:2.0.1'
}
    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 28
        multiDexEnabled true  //ADD THIS LINE
    }

ステップ02:

これらのSyncプロジェクトを追加した後、プロジェクトを実行する前に、実行前にプロジェクトをビルドしてください。そうしないと、例外が発生します。


53

あなたはこれに従うことができます。

Android 5.0(APIレベル21)より前のバージョンのプラットフォームでは、Dalvikランタイムを使用してアプリコードを実行します。デフォルトでは、DalvikはアプリをAPKごとに単一のclasses.dexバイトコードファイルに制限します。この制限を回避するために、プロジェクトにmultidexサポートライブラリを追加できます。

dependencies {
  implementation 'com.android.support:multidex:1.0.3'
}

minSdkVersionが21以上に設定されている場合、次のように、モジュールレベルのbuild.gradleファイルでmultiDexEnabledをtrueに設定するだけです。

android {
    defaultConfig {
        ...
        minSdkVersion 21 
        targetSdkVersion 28
        multiDexEnabled true
    }
    ...
}

34

依存関係を使用しているので、メソッドが増えました!グーグルはそのためのソリューションを持っています。それはMultidexと呼ばれています!

注:最小SDKが14を超えていることを確認してください。

あなたのbuild.gradleで:

android {
    defaultConfig {
        ...
        minSdkVersion 15 
        targetSdkVersion 28
        multiDexEnabled true
    }
    ...
}



  dependencies {
      implementation 'com.android.support:multidex:1.0.3'
    }

androidXの場合:

 def multidex_version = "2.0.1"
 implementation 'androidx.multidex:multidex:$multidex_version'

詳細については、元のリンクにアクセスしてください:

https://developer.android.com/studio/build/multidex


素晴らしい解決策!私の問題を修正
Vaibhav Herugu

29

こんにちは問題はここにそれを削除します

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

どうして?

注意: play-servicesの組み合わせのターゲットは使用しないでください。それはあなたのアプリケーションを膨らませる数十のライブラリをもたらします。代わりに、アプリが使用する特定のGoogle Play開発者サービスAPIのみを指定してください。

そして、必要なものを使用してください。https://developers.google.com/android/guides/setup

位置情報サービスのように

com.google.android.gms:play-services-location:11.8.0

クラウドメッセージングの場合

com.google.android.gms:play-services-gcm:11.8.0

うん、実行ボタンが無効になっている問題に直面しています。
ムハンマドアディルサタール

27

DEBUG APKをビルドしている場合は、以下を追加します。

debug {
            multiDexEnabled true
        }

内部 buildTypes

あなたが構築している場合やRELEASE APKを追加 multiDexEnabled trueリリースブロックにしたままの

release {
                ...
                multiDexEnabled true
                ...
        }

25

フラッタープロジェクトの場合は、この問題も解決できます

\ android \ app \ build.gradleを開きます

次のようになります。

android {
    defaultConfig {
        ...
        minSdkVersion 16
        targetSdkVersion 28

    }

}

minSdkVersionが21以上に設定されている場合は、defaultConfigでmultiDexEnabledをtrueに設定するだけです。このような

android {
    defaultConfig {
        ...
        minSdkVersion 16
        targetSdkVersion 28
        multiDexEnabled true 

    }

}

minSdkVersionが20以下に設定されている場合、defaultConfigにmultiDexEnabled trueを追加します

そして実装を定義する

dependencies {
  implementation 'com.android.support:multidex:1.0.3'// or 2.0.1
}

最後に次のものが必要です。

android {
    defaultConfig {
        ...
        minSdkVersion 16
        targetSdkVersion 28
        multiDexEnabled true  // added this
    }

}

dependencies {
  implementation 'com.android.support:multidex:1.0.3'
}

詳細については、こちらをご覧くださいhttps : //developer.android.com/studio/build/multidex


1
ははは!お役に立てて嬉しいです!
リチャード

18

次のようにしてください:

build.gradle

(module:app)


android {
            ....
      defaultConfig {
              multiDexEnabled true // enable mun
      }
}

そして、build.gradleアプリレベルファイルに以下の依存関係を追加します

dependencies {
    implementation 'com.android.support:multidex:1.0.3'
} 

13
multiDexEnabled true

これをアプリのdefaultConfig {}に追加してみてください。これは問題解決に役立ちます


12

Gradleビルドファイルで、依存関係を追加します。

implementation 'com.android.support:multidex:1.0.2'

または

implementation 'com.android.support:multidex:1.0.3'

または

implementation 'com.android.support:multidex:2.0.0'

そして、「defaultConfig」セクションに、以下を追加します。

multiDexEnabled true

targetSdkVersionの下

   minSdkVersion 17
    targetSdkVersion 27
    multiDexEnabled true

このエラーが発生した場合

エラー:解決に失敗しました:multidex-instrumentation Open File

あなたのgradleを3.0.1に変更する必要があります

        classpath 'com.android.tools.build:gradle:3.0.1'

そして、次のコードをgradle-wrapper.propertiesファイルに入れます

distributionUrl = https://services.gradle.org/distributions/gradle-4.1-all.zip

最後に

プロジェクトにクラスApplitionを追加し、MultiDexApplicationから拡張されたAndroidManifestに導入します。

public class App extends MultiDexApplication {

@Override
public void onCreate( ) {
    super.onCreate( );
}

}

最初にプロジェクトを実行してエラーを作成し、次にプロジェクトをクリーンアップします

最後に、プロジェクトを再起動して楽しんでください


私はまだ「Failed to resolve:multidex-instrumentation」を持っています
Makalele

11

ProifyでminifyEnabledを使用している場合、おそらくmulti-dexを有効にする必要はありません。可能な限りmulti-dexを回避するようにすべきであるというMG Developerに同意します。私の解決策は、デバッグビルドに対してのみmulti-dexを有効にすることでした。minifyEnabledはリリースビルドの問題を解決します

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
    debug {
        // getting error: Cannot fit requested classes in a single dex file.  # methods: 65537 > 65536
        // https://developer.android.com/studio/build/multidex
        // minifyEnabled true (used with release) will fix this by getting rid of unused method calls, but this will hide debugging info on crash
        multiDexEnabled true
    }
}

私たちがしなければならない場合、multidexを使用することの欠点のいくつかは何ですか?
isJulian00

1
非常に良い質問ですが、答えはありません。あなたがいない場合、以下を読むにdeveloper.android.com/studio/build/multidex#mdex-gradle API> = 21のために、多くの問題が存在しないようです。21未満の場合、Androidは、問題が発生する可能性のある高度なフットワークを実行する必要があるようです。多くの人がこれをオンにする必要があるので、Androidはうまく機能していると思うので、あまり心配する必要はありません。できるだけ保守的になりたいです。
Ernie Thomason

10

理由はわかりませんが、おそらくKotlinで開発したためかもしれませんが、このエラーを修正するには、最終的に次のように拡張するクラスを作成する必要がありますMultiDexApplication

class MyApplication : MultiDexApplication() {
}

と私のManifest.xml中で設定する必要があります

<application
        ...
        android:name=".MyApplication">

誰も混乱させないために、私は次のことも行います。

multiDexEnabled true
implementation 'com.android.support:multidex:1.0.3'

androidxの場合、これも私にとっては機能します:

implementation 'androidx.multidex:multidex:2.0.0'

...

<application android:name="android.support.multidex.MultiDexApplication">

私には効かない


multiDexEnabledをtrueに設定した後は、プロジェクトのクリーンアップと再構築を必ず実行してください。これで解決しました。
疑似ザック

マニフェストのアプリケーション名属性の変更も機能しませんでしたが、gradleビルドファイルでmultiDexを有効にして実装を追加すると機能しました。今すぐマニフェスト名タグを変更するのはオプションのようですか?
コーディ

9

メソッド数が多すぎます。Android dexファイルには、許可されている65536メソッドの制限があります。

まず、すべてのGoogle Play Services APIと場所だけが必要ない場合は、

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

compile 'com.google.android.gms:play-services-location:11.8.0'

それを回避する方法について、またはさらに許可する必要がある場合は、このページを参照してください:https : //developer.android.com/studio/build/multidex.html


うん、でもそれは本当の問題ではない。私は同じ依存関係を追加していると思います。1つはFirebase用で、もう1つは場所用です。次の2行を確認してください。
ムハンマドアディルサッター


6

ファイルandroid / app / build.gradleを追加します

 defaultConfig {
        applicationId "com.ubicacion"
        minSdkVersion rootProject.ext.minSdkVersion
        targetSdkVersion rootProject.ext.targetSdkVersion
        versionCode 1
        versionName "1.0"
        multiDexEnabled true // ✔
        missingDimensionStrategy 'react-native-camera', 'general'
    }

5

このエラーに2回遭遇しましたが、これに対する解決策は次のとおりです。アプリのgradleファイルをチェックして、ターゲットのSDkを確認します。20以上の場合は、1行追加してくださいdefaultconfig { multiDexEnabled true }

そうでない場合、targetSDKが20未満の場合、その行をdefaultConfigに追加し、依存関係も追加します

implementation 'com.android.support:multidex:1.0.3'.

詳細については、このリンクを確認してください。

https://developer.android.com/studio/build/multidex#mdex-gradle


5

multidexサポートの使用は、最後の手段でなければなりません。デフォルトでは、gradleビルドはAPKの大量の推移的な依存関係を収集します。Google Developersドキュメントで推奨されているとおりで、最初にプロジェクトから不要な依存関係を削除してみてください。

コマンドラインを使用して、Androidプロジェクトのルートに移動します。次のようにしてコンパイル依存関係ツリーを取得できます。

gradlew app:dependencies --configuration debugCompileClasspath

依存関係ツリーの完全なリストを取得できます

gradlew app:dependencies

ここに画像の説明を入力してください

次に、不要な推移的な依存関係をアプリのbuild.gradleから削除します。例として、アプリが「com.google.api-client」という依存関係を使用している場合、不要なライブラリ/モジュールを除外できます。

implementation ('com.google.api-client:google-api-client-android:1.28.0'){
   exclude group: 'org.apache.httpcomponents'
   exclude group: 'com.google.guava'
   exclude group: 'com.fasterxml.jackson.core'
   }

次に、Android Studioで[ビルド]> [APKの分析...]を選択します。リリース/デバッグAPKファイルを選択して、内容を確認します。これにより、メソッドと参照カウントが次のように表示されます。

APKを分析


1
必要に応じてmultidexを使用する場合の欠点のいくつか
isJulian00

2

ビルド:アプリ

apply plugin: 'com.android.application'
android {
compileSdkVersion 28
defaultConfig {
    applicationId "com.proyecto.marketdillo"
    minSdkVersion 14
    targetSdkVersion 28
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    multiDexEnabled true
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
  }
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0-rc02'
implementation 'com.google.firebase:firebase-core:16.0.7'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
implementation 'com.android.support:support-v4:28.0.0-rc02'
implementation 'com.android.support:design:28.0.0-rc02'
implementation 'com.google.firebase:firebase-auth:16.1.0'
implementation 'com.squareup.picasso:picasso:2.5.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation 'com.google.firebase:firebase-firestore:17.1.5'
implementation 'com.android.support:multidex:1.0.3'
}
apply plugin: 'com.google.gms.google-services'

1
android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.dev.khamsat"
        minSdkVersion 16
        targetSdkVersion 28
        versionCode 1
        versionName "2.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        multiDexEnabled true
    }

これでも十分でした。
nyxee

1

このエラーは、アプリのGradleファイルにあるクラスの依存関係の数が原因で発生します。クラスが72,400を超える場合は、ファイルのインデックス作成をより適切に処理するソリューションとしてmultidexを使用することができます。詳細はこちらから:https ://developer.android.com/studio/build/multidex

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.