Erro: Não é possível ajustar as classes solicitadas em um único arquivo dex. Tente fornecer uma lista de dex principal. # métodos: 72477> 65536

310

Quero adicionar serviços de localização fundida, mas isso mostra algum erro. Ajude-me.

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'
Muhammad Adil Sattar
fonte

Respostas:

386

Nenhuma das respostas que eles lhe deram foi exaustiva. O problema está no Multidex. Você deve adicionar a biblioteca no aplicativo gradle:

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

Depois, adicione o defaultConfig do aplicativo gradle:

multiDexEnabled true

Seu aplicativo deve ser do tipo Multidex. Você deve escrevê-lo no manifesto:

android:name=".MyApplication"

"MyApplication" deve ser a classe Multidex ou deve ser estendida.

AlexPad
fonte
5
Então MyApplication extends android.support.multidex.MultiDexApplication?
ban-geoengenharia
2
Eu tentei esta solução, mas acabo com este novo problema: stackoverflow.com/questions/49518115/…
ban-
22
Aqui está a página doc android oficial fornecer mais explicações sobre o por que isso acontece e como fazer um lançamento-versão melhor apk: developer.android.com/studio/build/multidex
Vrakfall
2
não é um bom método para resolver o problema, é melhor remover o código e as bibliotecas não utilizados, refatorar o código do projeto
user25
5
não ter métodos 80000 seria uma solução ótima se as bibliotecas do Google não tivessem métodos 80000 (todo o motivo pelo qual eles adicionaram multidex foi porque sua própria biblioteca de serviços que eles queriam que todos usassem tinha dezenas de milhares de métodos).
Lassi Kinnunen
195

Corrigi o meu problema com a solução abaixo:

No arquivo de construção Gradle, adicione dependência:

implementação 'com.android.support:multidex:1.0.3'

E, em seguida, na seção "defaultConfig", adicione:

multiDexEnabled true

Bofeng
fonte
8
Trabalhou para mim. Instruções detalhadas sobre a configuração aqui: developer.android.com/studio/build/multidex#mdex-gradle
Alex Burdusel
Ativar o suporte multidex não é necessário na maioria dos aplicativos. Você deve remover as bibliotecas não utilizadas. Consulte minha resposta abaixo.
MG Developer
106

modificar seu aplicativo ou módulo build.gradle

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

De acordo com a documentação oficial

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. O ART realiza a pré-compilação no momento da instalação do aplicativo, que verifica os arquivos classesN.dex e os compila em um único arquivo .oat para execução pelo dispositivo Android. Portanto, se sua minSdkVersion for 21 ou superior, você não precisará da biblioteca de suporte multidex.

Para mais informações sobre o tempo de execução do Android 5.0, leia ART e Dalvik.

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

wdanxna
fonte
59

O que são arquivos dex: os arquivos do aplicativo Android (APK) contêm arquivos executáveis ​​de bytecode na forma de arquivos Dalvik Executable (DEX), que contêm o código compilado usado para executar o aplicativo.

Motivo dessa exceção: a especificação DEX limita o número total de métodos que podem ser referenciados em um único arquivo DEX a 65.536 (limite de referência de 64 K) - incluindo métodos de estrutura do Android, métodos de biblioteca e métodos em seu próprio código.

Etapa 01. Adicione a seguinte dependência da seguinte maneira

Para usuários não Androidx,

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

Para usuários do Androidx,

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

Etapa 02:

Depois de adicionar esses projetos de sincronização e antes de executar o projeto, certifique-se de criar um projeto antes da execução. caso contrário, você receberá uma exceção.

gsm
fonte
53

Você pode seguir isso .

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

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, conforme mostrado aqui:

android {
    defaultConfig {
        ...
        minSdkVersion 21 
        targetSdkVersion 28
        multiDexEnabled true
    }
    ...
}
rize
fonte
34

Quando você está usando dependências, seus métodos aumentam! O Google tem uma solução para isso. que chamou Multidex!

NOTA: verifique se o SDK mínimo está acima de 14.

no seu build.gradle:

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



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

PARA USO AndroidX:

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

Para mais informações, acesse o link original:

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

sana ebadi
fonte
Ótima solução! corrigido meu problema
Vaibhav Herugu
29

Olá problema aqui removê-lo

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

porque?

Nota: Não use o destino combinado de serviços de reprodução. Ele traz dezenas de bibliotecas, inchando seu aplicativo. Em vez disso, especifique apenas as APIs específicas dos serviços do Google Play que seu aplicativo usa.

E use o que você precisa. https://developers.google.com/android/guides/setup

Como para o serviço de localização

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

Para mensagens na nuvem

com.google.android.gms:play-services-gcm:11.8.0
Pankaj Kant Patel
fonte
Sim, agora estou enfrentando um problema, meu botão de execução foi desativado.
Muhammad Adil Sattar
27

Se você estiver criando DEBUG APK , basta adicionar:

debug {
            multiDexEnabled true
        }

dentro buildTypes

e se você estiver criando o RELEASE APK , adicione o multiDexEnabled truebloco de liberação como-

release {
                ...
                multiDexEnabled true
                ...
        }
Raj Yadav
fonte
25

Para projetos de vibração, você também pode resolver esse problema

abra seu \ android \ app \ build.gradle

você deve ter o seguinte:

android {
    defaultConfig {
        ...
        minSdkVersion 16
        targetSdkVersion 28

    }

}

Se sua minSdkVersion estiver definida como 21 ou superior, tudo o que você precisa fazer é definir multiDexEnabled como true no defaultConfig. Como isso

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

    }

}

se seu minSdkVersion estiver definido como 20 ou inferior, adicione multiDexEnabled true ao defaultConfig

E defina a implementação

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

No final, você deve ter:

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

}

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

Para mais informações, leia o seguinte: https://developer.android.com/studio/build/multidex

Richardd
fonte
1
hhahaha! Estou feliz que isso te ajudou!
Richardd 13/04
18

Faça o seguinte:

build.gradle

(module:app)


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

E adicione dependência abaixo no seu build.gradlearquivo no nível do aplicativo

dependencies {
    implementation 'com.android.support:multidex:1.0.3'
} 
Saif Khan
fonte
13
multiDexEnabled true

Tente adicionar isso no aplicativo defaultConfig {}. Isso me ajuda a resolver o problema

user2173696
fonte
12

No arquivo de construção Gradle, adicione dependência:

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

ou

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

ou

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

E, em seguida, na seção "defaultConfig", adicione:

multiDexEnabled true

Em targetSdkVersion

   minSdkVersion 17
    targetSdkVersion 27
    multiDexEnabled true

Agora, se você encontrar esse erro

Erro: falha ao resolver: arquivo multidex-instrumentação aberta

Você precisa alterar seu gradle para 3.0.1

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

E coloque o seguinte código no arquivo gradle-wrapper.properties

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

Finalmente

adicionar classe Applition no projeto E apresentá-lo ao AndroidManifest, que se estende do MultiDexApplication

public class App extends MultiDexApplication {

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

}

Execute o projeto primeiro para criar um erro e limpe o projeto

Por fim, relance o projeto e aproveite-o

younes
fonte
Eu ainda tenho "Falha ao resolver: instrumentação
multidex
11

Se você estiver usando minifyEnabled com Proguard, provavelmente não precisará ativar o multi-dex. Concordo com o MG Developer que você deve tentar evitar o multi-dex, se possível. Minha solução foi ativar o multi-dex apenas para compilações de depuração. minifyEnabled resolve o problema para compilações de versão

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
    }
}
Ernie Thomason
fonte
Quais são algumas das desvantagens do uso do multidex, se necessário?
precisa saber é o seguinte
1
Muito boa pergunta, para a qual realmente não tenho uma resposta. Leia o seguinte, se você não tiver: em developer.android.com/studio/build/multidex#mdex-gradle Parece que para a API> = 21, não há muito problema. Por menos de 21 anos, parece que o Android precisa fazer um trabalho de pés sofisticado que pode ter problemas. Como muitas pessoas precisam ativar isso, meu palpite é que o Android funcionou bem, então eu não me preocuparia muito com isso. Eu só gosto de ser conservador sempre que possível.
Ernie Thomason
10

Eu não tenho idéia do porquê, talvez seja porque eu desenvolvo no Kotlin, mas para corrigir esse erro, finalmente eu tenho que criar uma classe que se estende MultiDexApplicationassim:

class MyApplication : MultiDexApplication() {
}

e no meu Manifest.xmleu tenho que definir

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

para não confundir ninguém, eu também faço:

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

para androidx, isso também funciona para mim:

implementation 'androidx.multidex:multidex:2.0.0'

...

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

Nao funciona para mim

Boe-Dev
fonte
lembre-se de limpar e reconstruir o projeto depois de definir multiDexEnabled true. Isso consertou para mim.
Pseudozach 19/10/19
alterar o atributo de nome do aplicativo no manifesto também não funcionou para mim, mas ativar o multiDex no arquivo de construção gradle e adicionar a implementação funcionou. Parece que é opcional alterar a tag do nome do manifesto agora?
Cody
9

Você tem muitos métodos para contar. O arquivo dex do Android tem um limite de 65536 métodos que você pode ter.

Para iniciantes, se você não precisar de toda a API de serviços do Google Play e apenas o local, substitua

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

com

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

Você pode consultar esta página para obter formas de evitá-la ou, se necessário, para permitir mais: https://developer.android.com/studio/build/multidex.html

Raz
fonte
Sim, mas não é esse problema real. Eu acho que estou adicionando mesmas dependências. Um para Firebase e outro para localização Verifique abaixo duas linhas.
Muhammad Adil Sattar
6

Tudo o que eu precisava fazer era definir a versão mínima do SDK como 21 em Arquivo> Estrutura do projeto> Aplicativo> Sabores

Will Buffington
fonte
6

adicione seu arquivo 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'
    }
Um alemão
fonte
5

Eu encontrei esse erro duas vezes e a solução é: Verifique o arquivo gradle do aplicativo para ver o SDk de destino, se for 20 ou superior, basta adicionar uma linha ao seudefaultconfig { multiDexEnabled true }

Caso contrário, se o seu targetSDK for menor que 20, adicione a linha ao seu defaultConfig e também adicione uma dependência

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

Verifique este link para mais.

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

Mpwanyi Samuel
fonte
5

Usar o suporte multidex deve ser o último recurso. Por padrão, o gradle build coletará uma tonelada de dependências transitivas para o seu APK. Conforme recomendado no Google Developers Docs , tente primeiro remover dependências desnecessárias do seu projeto.

Usando a linha de comando, navegue para Raiz de projetos do Android. Você pode obter a árvore de dependência de compilação da seguinte maneira.

gradlew app:dependencies --configuration debugCompileClasspath

Você pode obter uma lista completa de árvores de dependência

gradlew app:dependencies

insira a descrição da imagem aqui

Em seguida, remova as dependências desnecessárias ou transitivas do aplicativo build.gradle. Como exemplo, se seu aplicativo usar dependência chamada 'com.google.api-client', você poderá excluir as bibliotecas / módulos de que não precisa.

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

Em seguida, no Android Studio, selecione Criar> Analisar APK ... Selecione o arquivo APK de lançamento / depuração para ver o conteúdo. Isso fornecerá os métodos e referências contados da seguinte maneira.

Analisar APK

MG Developer
fonte
1
Quais são algumas das desvantagens do uso do multidex, se for necessário?
isJulian00
2

Na compilação: app

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'
Sebastián Giraldo
fonte
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
    }
Mohamed Slimane
fonte
isso foi suficiente para mim também.
nyxee
1

O erro é causado pelo número de dependências de classe que você possui no arquivo Gradle do seu aplicativo. Se as classes excederem 72.400, convém usar o multidex como uma solução para lidar melhor com a indexação de arquivos. Saiba mais aqui: https://developer.android.com/studio/build/multidex

Mpwanyi Samuel
fonte