.dex 파일의 메소드 참조 수는 64k API 17을 초과 할 수 없습니다


154

SugarORM Library로 앱을 빌드하고 있지만 API 17 용 프로젝트를 빌드하려고하면 (다른 사람을 확인하지 않은 경우) 빌드 오류가 표시됩니다.

    Information:Gradle tasks [:app:assembleDebug]
:app:preBuild UP-TO-DATE
:app:preDebugBuild UP-TO-DATE
:app:checkDebugManifest
:app:preReleaseBuild UP-TO-DATE
:app:prepareComAndroidSupportAnimatedVectorDrawable2330Library UP-TO-DATE
:app:prepareComAndroidSupportAppcompatV72330Library UP-TO-DATE
:app:prepareComAndroidSupportCardviewV72330Library UP-TO-DATE
:app:prepareComAndroidSupportDesign2330Library UP-TO-DATE
:app:prepareComAndroidSupportMediarouterV72300Library UP-TO-DATE
:app:prepareComAndroidSupportRecyclerviewV72330Library UP-TO-DATE
:app:prepareComAndroidSupportSupportV42330Library UP-TO-DATE
:app:prepareComAndroidSupportSupportVectorDrawable2330Library UP-TO-DATE
:app:prepareComAndroidVolleyVolley100Library UP-TO-DATE
:app:prepareComGithubSatyanSugar14Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServices840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAds840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAnalytics840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAppindexing840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAppinvite840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAppstate840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAuth840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesBase840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesBasement840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesCast840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesDrive840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesFitness840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesGames840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesGcm840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesIdentity840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesLocation840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesMaps840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesMeasurement840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesNearby840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesPanorama840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesPlus840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesSafetynet840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesVision840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesWallet840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesWearable840Library UP-TO-DATE
:app:prepareMeDrakeetMaterialdialogLibrary131Library UP-TO-DATE
:app:prepareDebugDependencies
:app:compileDebugAidl UP-TO-DATE
:app:compileDebugRenderscript UP-TO-DATE
:app:generateDebugBuildConfig UP-TO-DATE
:app:generateDebugAssets UP-TO-DATE
:app:mergeDebugAssets UP-TO-DATE
:app:generateDebugResValues UP-TO-DATE
:app:generateDebugResources UP-TO-DATE
:app:mergeDebugResources UP-TO-DATE
:app:processDebugManifest UP-TO-DATE
:app:processDebugResources UP-TO-DATE
:app:generateDebugSources UP-TO-DATE
:app:compileDebugJavaWithJavac
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
:app:compileDebugNdk UP-TO-DATE
:app:compileDebugSources
:app:prePackageMarkerForDebug
:app:transformClassesWithDexForDebug
Error:The number of method references in a .dex file cannot exceed 64K.
Learn how to resolve this issue at https://developer.android.com/tools/building/multidex.html
Error:Execution failed for task ':app:transformClassesWithDexForDebug'.
> com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/bin/java'' finished with non-zero exit value 2
Information:BUILD FAILED
Information:Total time: 21.663 secs
Information:2 errors
Information:0 warnings
Information:See complete output in console

그러나 안드로이드 v5.0 이상을 위해이 프로젝트를 빌드하면 정상적으로 작동합니다. SugarORM gradle 의존성을 제거하면 장치 v4.2.2 및 v5.0 모두에서 잘 작동합니다.



이 링크를 사용하여 시도 하십시오이 링크 android-arsenal.com/details/1/337 은 proguard와 함께 SugarORM을 사용하도록 지정합니다
Shaan_B

19
API 23으로 업그레이드 한 후에이 문제가 발생했습니다. Android로 생산성을 얻는 것은 불가능합니다. 모든 SDK는 물건을 깰 수 있습니다. AS로 업데이트 할 때마다 문제가 발생합니다. 오류 메시지를 사용할 수 없습니다. AS 고장. 쓰레기, 쓰레기, 쓰레기
RunLoop

1
@RunLoop은 희망을 잃지 않습니다 .... 안드로이드가 개발 한 최고의 플랫폼이라는 것을 알았습니다 .... 유연하고 강력합니다 .... 코딩에 손을 더럽힐 것입니다 .... 괜찮을 것입니다 .... 모든 오류 메시지가 유용합니다. 그러나 메시지를 이해해야합니다
Sandeep Singh Rana

2
@ Balaj Khan One or more of the answers is exemplary and worthy of an additional bounty.Just to the point and accurate answer.나는 최고의 대답을 제안합니다!.
Jon Goodwin

답변:


331

방법이 너무 많습니다. dex 에는 65536 메소드 만있을 수 있습니다 .

제안한대로 멀티 덱스 지원을 사용할 수 있습니다 .

이 줄을 다음에 추가하십시오 module/build.gradle.

android {

    defaultConfig {
        ...

        // Enabling multidex support.
        multiDexEnabled true
    }
    ...
}

dependencies {
  implementation 'com.android.support:multidex:1.0.3'  //with support libraries
  //implementation 'androidx.multidex:multidex:2.0.1'  //with androidx libraries
}

또한 멀티 덱스 지원 라이브러리에서 애플리케이션 요소로 클래스를 Manifest추가하십시오.MultiDexApplication

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.android.multidex.myapplication">
        <application
            ...
            android:name="android.support.multidex.MultiDexApplication">

            <!-- If you are using androidx use android:name="androidx.multidex.MultiDexApplication" -->

            <!--If you are using your own custom Application class then extend -->
            <!--MultiDexApplication and change above line as-->
            <!--android:name=".YourCustomApplicationClass"> -->

            ...
        </application>
    </manifest>

자신의 Application클래스를 사용하는 경우 상위 클래스를에서 Application로 변경하십시오 MultiDexApplication.
그렇게 할 수 없다면 Application 클래스에서 다음 attachBaseContext과 같이 메소드를 재정의하십시오 .

@Override
protected void attachBaseContext(Context newBase) {
    super.attachBaseContext(newBase);
    MultiDex.install(this);
}

또 다른 해결책은 ProGuard로 사용하지 않는 코드를 제거 하는 것입니다.- ProGuard 를 실행하도록 앱 의 ProGuard 설정을 구성하고 릴리스 빌드에 대해 축소가 활성화되어 있는지 확인하십시오.


1
@Override protected void attachBaseContext (Context newBase) {super.attachBaseContext (newBase); MultiDex.install (this); } 또한 무시
Sandeep Singh Rana

1
MultiDexApplication을 클릭하면 디 컴파일 된 .class 파일이 이미 attachBaseContext () 재정의를 수행하는 것을 볼 수 있습니다. 그래서 나는 그것을 다시 무시할 필요가 없다고 생각합니다.
Mete

4
방법이 너무 많지 않으면 어떻게됩니까? 내 앱에는 그렇게 많은 방법이 없습니다. 나는 그것이 심지어 도달하지 못한다고 믿는다.
Neon Warge

6
"multiDexEnabled true"와 build.grandle 파일에서 'com.android.support:multidex:1.0.0'이라는 두 부분 만 수행했습니다. 매니페스트 파일의 내용을 변경하거나 attachBaseContext 등을 재정의하는 것에 대해 언급 한 다른 작업을 수행 할 필요가 없었지만 솔루션에서 문제를 해결했습니다! 감사.
Jaime Montoya

2
@NeonWarge 아마도 당신의 의존성 때문입니다. 아마도 전체 Google Play 서비스를 포함 했습니까? 자세한 내용은
mr5

132

android / app / build.gradle에서

android {

compileSdkVersion 23

 buildToolsVersion '23.0.0'

    defaultConfig {
        applicationId "com.dkm.example"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
    }

이것을 defaultConfig 안에 넣으십시오.

multiDexEnabled true 

그것은 나를 위해 작동


3
이것은 롤리팝 이상입니다.
Vic Torious

1
빌드가 성공하지만 시작 후 앱이 충돌합니다.
Vasanth

18

내 프로젝트에서 프로젝트 자동 업데이트 컴파일 버전을 코딩하는 동안이 오류 메시지가 나타납니다 build.gradle.

android {
    ...
    buildToolsVersion "23.0.2"
    ...
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.4.0'
    compile 'com.android.support:design:23.4.0' }

버전을 수정하여 해결하십시오.

android {
        ...
        buildToolsVersion "23.0.2"
        ...
    }

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.0.1'
    compile 'com.android.support:design:23.0.1'
}

2
간단한 응용 프로그램을 만들고 있는데, Google Map Objects 자습서를 따르기 전까지는 잘 작동했습니다. 갑자기 더 이상 컴파일 할 수 없었습니다. 이 솔루션은 나를 위해 그것을 고쳤습니다. 지구상에서 어떻게 해결 했습니까?
maccaroo 2016 년

4
이 방법은 새로운 컴파일 라이브러리에 너무 많은 메소드가 있고 (65536을 초과 함) 오래된 라이브러리가 없기 때문에 운 좋게 작동했습니다. 따라서 그것은 빠른 해결책 일뿐입니다. 머지 않아 수락 된 답변과 같은 멀티 덱스 지원을 추가하여 수정해야합니다.
Quan Nguyen

15

이것이 나를 위해 일한 것입니다.

사용하지 않는 메소드가 너무 많기 때문에 발생합니다. 이러한 방법의 대부분은 build.gradle에 포함 된 라이브러리에서 제공됩니다.

축소 및 축소 리소스를 사용하여 gradle 로이 문제를 해결하고 동시에 코드를 정리하십시오.

buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug {
            minifyEnabled true
            shrinkResources true
        }
    }

13

앱 레벨 build.gradle을 변경하십시오.

android {

compileSdkVersion 23

 buildToolsVersion '23.0.0'

    defaultConfig {
        applicationId "com.dkm.example"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
    }

그것은 나를 위해 일했다.


예, 이것은 오래된 문제이지만 API의 마지막 버전에서는 multiDexEnabled종속성이나 매니페스트 파일 변경없이 옵션 만 필요합니다
Hpsaturn

11

이 오류는 afew 만 사용할 때 모든 Google Play 서비스 API를로드 할 때 발생할 수도 있습니다.

google에서 언급 한대로 : "6.5 이전의 Google Play 서비스 버전에서는 전체 API 패키지를 앱으로 컴파일해야했습니다. 경우에 따라 앱에 여러 메소드를 유지하기가 더 어려웠습니다 ( 65,536 한도 미만의 프레임 워크 API, 라이브러리 메서드 및 자체 코드).

6.5 버전부터 Google Play 서비스 API를 앱에 선택적으로 컴파일 할 수 있습니다. "

예를 들어 앱에 play-services-maps, play-services-location이 필요한 경우 아래와 같이 앱 수준에서 build.gradle 파일에 두 개의 API 만 추가하면됩니다.

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

대신에:

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

전체 설명서 및 Google Play 서비스 API 목록을 보려면 여기를 클릭 하십시오.


9

앱 참조가 65,536 개의 메소드를 초과 하면 앱이 Android 빌드 아키텍처의 한계에 도달했음을 나타내는 빌드 오류가 발생합니다.

안드로이드 5.0 이전의 멀티 덱스 지원

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

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

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

Android 5.0 (API 레벨 21) 이상은 APK 파일에서 여러 DEX 파일로드를 기본적으로 지원하는 ART라는 런타임을 사용합니다. 따라서 minSdkVersion이 21 이상이면 멀티 덱스 지원 라이브러리 가 필요 하지 않습니다 .

64K 제한을 피하십시오

  • ProGuard로 사용하지 않는 코드 제거-코드 축소 사용

에 대한 앱에서 멀티 덱스 구성

minSdkVersion이 21 이상으로 설정되어 있으면 모듈 수준 build.gradle 파일에서 multiDexEnabled를 true로 설정하기 만하면됩니다.

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

minSdkVersion이 20 이하로 설정된 경우 멀티 덱스 지원 라이브러리를 사용해야합니다

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

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

Application 클래스를 재정의하고 다음과 같이 MultiDexApplication 을 확장하도록 변경하십시오 (가능한 경우).

public class MyApplication extends MultiDexApplication { ... }

매니페스트 파일에 추가

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp">
    <application
            android:name="MyApplication" >
        ...
    </application>
</manifest>

8

나는 같은 문제에 직면 해 왔으며 멀티 덱스 지원을 위해서는 응용 프로그램 의 minSdkVersion 을 명심 해야합니다. minSdkVersion 21 이상을 사용하는 경우 다음 과 같이 multiDexEnabled true를 작성 하십시오.

defaultConfig {
    applicationId *******************
    minSdkVersion 21
    targetSdkVersion 24
    versionCode 1
    versionName "1.0"
    multiDexEnabled true
}

그것은 나를 위해 작동하며 21 미만 ( lolipop 아래 ) minSdkVersion 을 사용하는 경우 두 가지 추가 간단한 작업을 수행해야합니다

1. 먼저이 의존성을 추가하십시오

'com.android.support:multidex:1.0.1'컴파일

build.gradle에서.

2. 마지막으로 두 번째로 아래 줄을 매니페스트의 응용 프로그램에 추가하십시오.

android : name = "android.support.multidex.MultiDexApplication"

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:name="android.support.multidex.MultiDexApplication"
    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>

빙고는 하위 버전에서도 작동합니다 .. :) Happy coding


1

부수적 의견, 멀티 덱스에 대한 지원을 추가하기 전에-불필요한 종속성을 추가하지 않아야합니다.

예를 들어 공식 Facebook 분석 안내서에서

그들은 분명히 다음과 같은 의존성을 추가해야한다고 명시합니다.

implementation 'com.facebook.android:facebook-android-sdk:[4,5)'

이는 실제로 전체 FacebookSDK입니다. 예를 들어 웹 로그 분석 만 필요한 경우 다음과 같이 바꿔야합니다.

implementation 'com.facebook.android:facebook-core:5.+'

Facebook 부분 SDK 옵션


전적으로 동의합니다. 예를 들어 필자의 경우 "페이스 북으로 로그인"버튼이 필요했고 전체 페이스 북 SDK를 사용하고있었습니다. 나는 그것을 대체 한 facebook-corefacebook-login및 오류가왔다.
cleybertandre

0

나를 위해 Gradle을 업그레이드 하십시오 .Android 웹 사이트 에서 업데이트를 찾은 다음 build.gradle (프로젝트)에 다음과 같이 추가하십시오

 dependencies {
        classpath 'com.android.tools.build:gradle:2.2.0-alpha4'   
          ....
    }

그런 다음 프로젝트를 gradle 파일과 동기화하고 java.exe (제 경우)로 인해 때때로 발생할 수 있습니다 .Windows의 작업 관리자에서 java.exe를 강제 종료 한 다음 프로그램을 다시 실행하십시오.


0

이것을 시도 할 수도 있습니다 :

android{
    .
    .
    // to avoid DexIndexOverflowException
    dexOptions {
       jumboMode true
    }
}

그것이 누군가를 돕기를 바랍니다. 감사


0

**

Unity 게임 개발자

**

이 오류가 Unity 프로젝트에 표시되어 누군가 여기에 오면 파일-> 빌드 설정-> 플레이어 설정-> 플레이어로 이동하십시오. 게시 설정으로 이동하여 빌드 탭에서 "사용자 정의 실행기 Gradle 템플릿"을 활성화하십시오. 해당 텍스트 아래에 경로가 표시됩니다. 경로로 이동하여 다음과 같이 multiDexEnabled true를 추가하십시오.

defaultConfig {
    minSdkVersion **MINSDKVERSION**
    targetSdkVersion **TARGETSDKVERSION**
    applicationId '**APPLICATIONID**'
    ndk {
        abiFilters **ABIFILTERS**
    }
    versionCode **VERSIONCODE**
    versionName '**VERSIONNAME**'
    multiDexEnabled true
}

-1

Android Studio에서 "Instant Run"을 활성화하여 멀티 덱스 지원을받을 수 있습니다.


-2

이렇게하면 작동합니다.

defaultConfig {
    applicationId "com.example.maps"
    minSdkVersion 15
    targetSdkVersion 24
    versionCode 1
    versionName "1.0"
    multiDexEnabled true
}

2
답을 설명하십시오. 코드 전용 답변은 SO에 권장되지 않습니다. 감사합니다.
Gennadii Saprykin 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.