O número de referências de método em um arquivo .dex não pode exceder 64k API 17

154

Estou criando um aplicativo com a Biblioteca SugarORM, mas quando tento criar o projeto para a API 17 (não verifiquei outras pessoas), ele mostra um erro de compilação.

    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

Mas quando eu construo este projeto para o Android v5.0 ou superior, ele funciona bem. Se eu remover a dependência gradle do SugarORM, ele funcionará bem para os dois dispositivos v4.2.2 e v5.0.

Sandeep Singh Rana
fonte
tente usar Proguard esta ligação android-arsenal.com/details/1/337 especifica usando SugarORM com proguard
Shaan_B
19
Acabei de conseguir isso depois de atualizar para a API 23. É simplesmente impossível ser produtivo com o Android. Todo SDK quebra coisas. Toda atualização para o AS quebra coisas. Mensagens de erro inutilizáveis. COMO quebrado. Lixo, lixo, lixo.
RunLoop
1
@RunLoop não perca a esperança .... Descobri que o Android é a melhor plataforma já desenvolvida .... Moch Flexível e poderoso .... Como você vai sujar as mãos na codificação .... Vai ficar tudo bem .... Toda mensagem de erro é útil. Mas a necessidade de compreender as mensagens
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.Eu sugiro a resposta superior (e aceita)!
21919 Jon Goodwin

Respostas:

331

Você tem muitos métodos. Só pode haver 65536 métodos para dex .

Conforme sugerido, você pode usar o suporte multidex .

Basta adicionar estas linhas no 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
}

Também Manifestinclua a MultiDexApplicationclasse da biblioteca de suporte multidex no elemento de aplicativo

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

Se você estiver usando sua própria Applicationclasse, altere a classe pai de Applicationpara MultiDexApplication.
Se você não conseguir, na classe Application, substitua o attachBaseContextmétodo por:

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

Outra solução é tentar remover o código não utilizado com o ProGuard - defina as configurações do ProGuard para o seu aplicativo para executar o ProGuard e verifique se você está encolhendo habilitado para compilações de versão.

Gabriele Mariotti
fonte
1
@Override anular protegido attachBaseContext (Contexto newBase) {super.attachBaseContext (newBase); MultiDex.install (isto); } também substitui
Sandeep Singh Rana
1
Ao clicar em MultiDexApplication, vejo que o arquivo .class descompilado já executa exatamente a substituição de attachBaseContext () que você descreve. Portanto, não será necessário substituir isso de novo, eu acho .. #
2929 de Mete
4
E se eu não tiver muitos métodos. Não tenho muitos métodos no meu aplicativo. Eu acredito que nem chega a isso.
Neon Warge 11/09/16
6
Eu fiz apenas essas duas partes: "multiDexEnabled true" e compile 'com.android.support:multidex:1.0.0', no meu arquivo build.grandle. Não precisei alterar nada no meu arquivo de manifesto nem fazer as outras coisas que você mencionou sobre a substituição de attachBaseContext, etc. Mas sua solução resolveu o problema para mim! Obrigado.
Jaime Montoya
2
@NeonWarge Provavelmente por causa de suas dependências. Talvez você tenha incluído todo o Google Play Services? Verifique esta resposta para obter detalhes
mr5
131

No 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
    }

Coloque isso dentro do seu defaultConfig:

multiDexEnabled true 

funciona para mim

Dharmendra Mishra
fonte
3
Isto é para pirulito ou superior, não é?
Vic Torious
1
Torna a construção bem-sucedida, mas o aplicativo falha após o lançamento.
Vasanth
18

Recebi esta mensagem de erro porque ao codificar a versão de compilação da atualização automática do meu projeto no meu build.gradlearquivo:

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' }

Resolva-o corrigindo a versão:

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'
}
Quan Nguyen
fonte
2
Estou criando um aplicativo simples, que funcionou bem até tentar seguir o tutorial do Google Map Objects. De repente, não consegui mais compilar. Esta solução corrigiu isso para mim. Como diabos você trabalhou nisso?
maccaroo
4
Felizmente, esse método funcionou porque as novas bibliotecas de compilação têm muitos métodos (excede 65536) e as bibliotecas antigas não. Portanto, é apenas uma solução rápida, mais cedo ou mais tarde você deve corrigir adicionando suporte multidex como a resposta aceita.
Quan Nguyen
15

Isto é o que funcionou para mim:

Isso acontece porque existem muitos métodos não utilizados. A maioria desses métodos é proveniente de bibliotecas incluídas em seu build.gradle

Use os recursos minify e shrink para corrigir isso com gradle e limpar seu código ao mesmo tempo.

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

Altere o build.gradle no nível do aplicativo:

android {

compileSdkVersion 23

 buildToolsVersion '23.0.0'

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

funcionou para mim.

shivanand naduvin
fonte
sim, é um problema antigo, mas para as últimas versões da API precisamos apenas da multiDexEnabledopção, sem dependências ou alterações no arquivo manifesto
Hpsaturn
11

Este erro também pode ocorrer quando você carrega todas as APIs dos serviços do Google Play quando usa apenas algumas.

Conforme declarado pelo google: "Nas versões dos serviços do Google Play anteriores à 6.5, era necessário compilar o pacote inteiro de APIs no seu aplicativo. Em alguns casos, isso tornava mais difícil manter o número de métodos no seu aplicativo (incluindo APIs da estrutura, métodos de biblioteca e seu próprio código) abaixo do limite de 65.536.

A partir da versão 6.5, você pode compilar seletivamente APIs de serviço do Google Play no seu aplicativo ".

Por exemplo, quando seu aplicativo precisa de mapas de serviços de reprodução, localização de serviços de reprodução. Você precisa adicionar apenas as duas APIs no seu arquivo build.gradle no nível do aplicativo, conforme mostrado abaixo:

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

Ao invés de:

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

Para obter a documentação completa e a lista de APIs dos serviços do Google Play, clique aqui

James Kuta Simiyu
fonte
9

Quando as referências do aplicativo excederem 65.536 métodos, você encontrará um erro de compilação que indica que o aplicativo atingiu o limite da arquitetura de compilação do Android

Suporte Multidex anterior ao Android 5.0

Versões da plataforma anteriores ao Android 5.0 (nível 21 da API) usam o tempo de execução Dalvik para executar o código do aplicativo. Por padrão, o Dalvik limita os aplicativos a um único arquivo de bytecode classes.dex por APK. Para contornar essa limitação, você pode adicionar a biblioteca de suporte multidex ao seu projeto:

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

Suporte Multidex para Android 5.0 e superior

O Android 5.0 (nível de API 21) e superior usa um tempo de execução chamado ART, que suporta nativamente o carregamento de vários arquivos DEX a partir de arquivos APK. Portanto, se sua minSdkVersion for 21 ou superior, você não precisará da biblioteca de suporte multidex .

Evite o limite de 64K

  • Remova o código não utilizado com o ProGuard - Habilite a redução de código

Configurar multidex no aplicativo para

Se sua minSdkVersion estiver configurada como 21 ou superior, tudo o que você precisa fazer é configurar multiDexEnabled como true no seu arquivo build.gradle no nível do módulo

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

se sua minSdkVersion estiver definida como 20 ou menos, você deverá usar a biblioteca de suporte multidex

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

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

Substitua a classe Application, altere-a para estender MultiDexApplication (se possível) da seguinte maneira:

public class MyApplication extends MultiDexApplication { ... }

adicionar ao arquivo de manifesto

<?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>
Basi
fonte
8

Estou enfrentando o mesmo problema e, para suporte multidex, você deve ter em mente a minSdkVersion do seu aplicativo. Se você estiver usando minSdkVersion 21 ou superior, basta escrever multiDexEnabled true como este

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

Funciona para mim e, se você estiver usando minSdkVersion abaixo de 21 (abaixo de lolipop ), precisará fazer duas coisas mais simples

1. Primeiro adicione esta dependência

compile 'com.android.support:multidex:1.0.1'

no seu build.gradle.

2. Por último e segundo, adicione um abaixo desta linha ao seu aplicativo no manifesto

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>

Bingo, então ele vai funcionar na versão inferior também .. :) Happy coding

Sudhansu
fonte
1

Apenas um comentário secundário: Antes de adicionar suporte ao multidex - verifique se você não está adicionando dependências desnecessárias.

Por exemplo, no guia oficial de análise do Facebook

Eles afirmam claramente que você deve adicionar a seguinte dependência:

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

que na verdade é todo o FacebookSDK - por isso, se você precisar, por exemplo, apenas do Analytics, precisará substituí-lo por:

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

Opções parciais do SDK do Facebook

Gal Rom
fonte
Concordo plenamente. No meu caso, por exemplo, eu só precisava do botão "acessar com o facebook" e estava usando o facebook sdk inteiro. Eu já substituiu-o por facebook-coree facebook-logineo erro desapareceu.
cleybertandre
0

Para mim, atualizar o Gradle funciona. Procure atualizações no site do Android e adicione-o no seu build.gradle (Project) como este

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

em seguida, sincronize o projeto com o arquivo gradle, mais isso pode acontecer algumas vezes por causa do java.exe (no meu caso), apenas force o kill java.exe do gerenciador de tarefas no Windows e execute o programa novamente

androidXP
fonte
0

Também pode tentar o seguinte:

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

Espero que ajude alguém. obrigado

Lazycoder_007
fonte
0

**

Para desenvolvedores de jogos Unity

**

Se alguém vier aqui porque esse erro apareceu no projeto do Unity, vá para Arquivo-> Configurações de compilação -> Configurações do player -> Player. vá para Configurações de publicação e, na guia Compilar, ative "Modelo de classificação do lançador personalizado". um caminho será mostrado sob esse texto. vá para o caminho e adicione multiDexEnabled true assim:

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

você pode ativar o "Instant Run" no Android Studio para obter suporte multidex.

Quang Vĩnh Hà
fonte
-2

Faça isso, funciona:

defaultConfig {
    applicationId "com.example.maps"
    minSdkVersion 15
    targetSdkVersion 24
    versionCode 1
    versionName "1.0"
    multiDexEnabled true
}
tejasri
fonte
2
Por favor, explique sua resposta. As respostas somente de código são desencorajadas no SO. Obrigado.
Gennadii Saprykin