오류 : 요청한 클래스를 단일 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에 있습니다. 앱 gradle에 라이브러리를 추가해야합니다.

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?
금지

2
이 솔루션을 시도했지만이 새로운 문제로 끝납니다 : stackoverflow.com/questions/49518115/…
ban-geoengineering

22
: 여기에 대한 자세한 설명을 제공하는 공식 안드로이드 문서 페이지 왜 이런 일이 발생하고 어떻게 더 나은 릴리스 버전의 APK 만들기 위해입니다 developer.android.com/studio/build/multidex
Vrakfall

2
문제를 해결하는 좋은 방법은 아니며, 사용하지 않는 코드와 라이브러리를 제거하고, 프로젝트 코드를 리팩터링하는 것이 좋습니다
user25

5
구글 라이브러리에 80000 개의 메소드가 없다면 80000 개의 메소드가없는 것이 좋은 솔루션이 될 것입니다.
Lassi Kinnunen

194

아래 솔루션으로 문제를 해결했습니다.

Gradle 빌드 파일에서 종속성을 추가하십시오.

구현 'com.android.support:multidex:1.0.3'

그런 다음 "defaultConfig"섹션에서 다음을 추가하십시오.

multiDexEnabled true


8
나를 위해 일했다. 구성에 대한 자세한 지침은 developer.android.com/studio/build/multidex#mdex-gradle
Alex Burdusel

대부분의 응용 프로그램에서 멀티 덱스 지원을 활성화 할 필요는 없습니다. 사용하지 않는 라이브러리를 제거하는 것을 고려해야합니다. 아래 답변을 참조하십시오.
MG 개발자

106

앱 또는 모듈 수정 build.gradle

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

공식 문서에 따르면

Android 5.0 이상에 대한 멀티 덱스 지원

Android 5.0 (API 레벨 21) 이상은 APK 파일에서 여러 DEX 파일로드를 기본적으로 지원하는 ART라는 런타임을 사용합니다. ART는 앱 설치시 사전 컴파일을 수행하여 classesN.dex 파일을 스캔하고 Android 장치에서 실행할 수 있도록 단일 .oat 파일로 컴파일합니다. 따라서 minSdkVersion이 21 이상이면 멀티 덱스 지원 라이브러리가 필요하지 않습니다.

Android 5.0 런타임에 대한 자세한 정보는 ART 및 Dalvik을 읽으십시오.

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


59

덱스 파일이란 무엇입니까? APK (Android 앱) 파일에는 Dalvik Executable (DEX) 파일 형식의 실행 가능한 바이트 코드 파일이 포함되어 있으며이 파일에는 앱을 실행하는 데 사용되는 컴파일 된 코드가 포함되어 있습니다.

이 예외의 이유 : DEX 사양은 단일 DEX 파일 내에서 참조 할 수있는 총 메서드 수를 65,536 (64K 참조 제한) (Android 프레임 워크 메서드, 라이브러리 메서드 및 사용자 고유 코드의 메서드 포함)으로 제한합니다.

단계 01. 다음과 같이 다음 종속성을 추가하십시오

Android가 아닌 사용자의 경우

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 단계 :

해당 동기화 프로젝트를 추가 한 후 프로젝트를 실행하기 전에 실행 전에 프로젝트를 빌드하십시오. 그렇지 않으면 예외가 발생합니다.


53

당신은 이것을 따를 수 있습니다 .

Android 5.0 (API 레벨 21) 이전의 플랫폼 버전은 Dalvik 런타임을 사용하여 앱 코드를 실행합니다. 기본적으로 Dalvik은 앱을 APK 당 단일 classes.dex 바이트 코드 파일로 제한합니다. 이 한계를 극복하기 위해 멀티 덱스 지원 라이브러리를 프로젝트에 추가 할 수 있습니다.

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

minSdkVersion이 21 이상으로 설정된 경우 다음과 같이 모듈 수준 build.gradle 파일에서 multiDexEnabled를 true로 설정하기 만하면됩니다.

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

33

의존성을 사용할 때 메소드가 증가했습니다! 구글은 그에 대한 해결책을 가지고 있습니다. 그것은 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'

왜?

참고 : 결합 된 플레이 서비스 대상을 사용하지 마십시오. 수십 개의 라이브러리를 가져와 응용 프로그램을 부풀려줍니다. 대신 앱에서 사용하는 특정 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

yup 이제 실행 버튼이 비활성화되어 문제가 발생했습니다.
Muhammad Adil Sattar

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
하하하! 도움이되어 기쁩니다.
Richardd

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 파일 열기

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( );
}

}

먼저 프로젝트를 실행하여 오류를 만든 다음 프로젝트를 정리하십시오.

마지막으로 프로젝트를 다시 시작하고 즐기십시오.


여전히 "해결 실패 : 멀티 덱스 계측"
Makalele

11

Proguard와 함께 minifyEnabled를 사용하는 경우 멀티 덱스를 활성화하지 않아도됩니다. 가능한 경우 멀티 덱스를 피해야한다고 MG 개발자에 동의합니다. 내 솔루션은 디버그 빌드에만 멀티 덱스를 활성화하는 것이 었습니다. 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
    }
}

멀티 덱스를 사용해야 할 경우 어떤 단점이 있습니까?
isJulian00 2016 년

1
아주 좋은 질문인데, 실제로 답이 없습니다. 그렇지 않은 경우 다음을 읽으십시오. developer.android.com/studio/build/multidex#mdex-gradle API> = 21 인 경우에는 별 문제가 없습니다. <21의 경우 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로 설정 한 후 프로젝트를 정리하고 다시 빌드해야합니다. 이것은 나를 위해 그것을 고쳤다.
pseudozach

매니페스트에서 응용 프로그램 이름 속성을 변경해도 효과가 없었지만 gradle 빌드 파일에서 multiDex를 활성화하고 구현을 추가하면 효과가있었습니다. 이제 매니페스트 이름 태그를 변경하는 것이 선택적인 것 같습니다.
Cody

9

계산 방법이 너무 많습니다. Android dex 파일에는 허용되는 메소드가 65536 개로 제한되어 있습니다.

우선, 모든 Google Play 서비스 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 을 피하거나 피해야 할 경우이 페이지를 참조하십시오.


but하지만 그 진짜 문제는 아닙니다. 나는 같은 의존성을 추가하고 있다고 생각한다. 하나는 Firebase 용이고 다른 하나는 위치 용입니다. 다음 두 줄을 확인하십시오.
Muhammad Adil Sattar

6

파일> 프로젝트 구조> 앱> 맛에서 최소 SDK 버전을 21로 설정하기 만하면됩니다.


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

이 오류가 두 번 발생했으며 이에 대한 해결책은 다음과 같습니다. 앱 gradle 파일을 확인하여 대상 SDk가 20 이상인 경우 한 줄을 추가하십시오.defaultconfig { multiDexEnabled true }

그렇지 않으면 targetSDK가 20보다 작 으면 defaultConfig에 행을 추가하고 종속성을 추가하십시오

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

자세한 내용은이 링크를 확인하십시오.

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


5

최후의 수단은 멀티 덱스 지원을 사용하는 것입니다. 기본적으로 gradle 빌드는 APK에 대한 많은 전이 의존성을 수집합니다. Google Developers Docs 에서 권장하는대로 먼저 프로젝트에서 불필요한 종속성을 제거하십시오.

명령 행을 사용하여 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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.