Eu já vi várias versões dos dex erros antes, mas esta é nova. limpar / reiniciar etc não vai ajudar. Os projetos da biblioteca parecem intactos e a dependência parece estar vinculada corretamente.
Unable to execute dex: method ID not in [0, 0xffff]: 65536
Conversion to Dalvik format failed: Unable to execute dex: method ID not in [0, 0xffff]: 65536
ou
Cannot merge new index 65950 into a non-jumbo instruction
ou
java.util.concurrent.ExecutionException: com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536
tl; dr : A solução oficial do Google finalmente chegou!
http://developer.android.com/tools/building/multidex.html
Apenas uma pequena dica, você provavelmente precisará fazer isso para evitar falta de memória ao fazer dex-ing.
dexOptions {
javaMaxHeapSize "4g"
}
Há também um modo jumbo que pode corrigir isso de uma maneira menos confiável:
dexOptions {
jumboMode true
}
Atualização: se seu aplicativo é gordo e você tem muitos métodos dentro do aplicativo principal, pode ser necessário reorganizá-lo conforme
http://blog.osom.info/2014/12/too-many-methods-in-main-dex.html
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
essa que não chama esta função se ela não está disponível?Respostas:
Atualização 3 (03/11/2014) O
Google finalmente divulgou a descrição oficial .
A atualização 2 (31/10/2014)
Gradle plugin v0.14.0 para Android adiciona suporte para multi-dex. Para habilitar, basta declará-lo em build.gradle :
Se seu aplicativo oferecer suporte ao Android anterior à versão 5.0 (ou seja, se você
minSdkVersion
tiver 20 anos ou menos), também será necessário aplicar um patch dinâmico ao ClassLoader do aplicativo , para que ele possa carregar classes de dexes secundários. Felizmente, há uma biblioteca que faz isso por você. Adicione-o às dependências do seu aplicativo:Você precisa chamar o código de patch do ClassLoader o mais rápido possível.
MultiDexApplication
A documentação da turma sugere três maneiras de fazer isso (escolha uma delas , a mais conveniente para você):1 - Declare a
MultiDexApplication
classe como o aplicativo no seu AndroidManifest.xml :2 - Faça sua
Application
classe estender a classe MultiDexApplication :3 - Ligue
MultiDex#install
do seuApplication#attachBaseContext
método:Atualização 1 (17/10/2014):
Conforme previsto, o suporte multidex é enviado na revisão 21 da Biblioteca de suporte do Android. Você pode encontrar o android-support-multidex.jar na pasta / sdk / extras / android / support / multidex / library / libs.
O suporte multi-dex resolve esse problema. O dx 1.8 já permite gerar vários arquivos dex.
O Android L oferecerá suporte a vários dex nativamente, e a próxima revisão da biblioteca de suporte cobrirá versões mais antigas da API 4.
Foi declarado neste episódio de podcast do Android Developers Backstage por Anwar Ghuloum. Eu já postou uma transcrição (e explicação geral multi-dex) da parte relevante.
fonte
java.lang.ClassNotFoundException: Didn't find class "org.qtproject.qt5.android.QtActivityDelegate" on path: DexPathList[[],nativeLibraryDirectories=[/vendor/lib, /system/lib]]
. Meu erro foi que eu não estava aplicando as etapas adicionais para o suporte ao Android antes da versão 5.0. Com isso dito, a opção 3 resolveu e não tive maisClassNotFoundException
problemas. Obrigado, @Alex Lipov!Como já foi dito, você tem muitos métodos (mais de 65k) em seu projeto e bibliotecas.
Evite o problema: reduza o número de métodos com o Play Services 6.5+ e support-v4 24.2+
Como muitas vezes os serviços do Google Play são um dos principais suspeitos de "desperdiçar" métodos com seus métodos de mais de 20k . Serviços do Google Play versão 6.5 ou posterior, é possível incluir os serviços do Google Play no seu aplicativo usando várias bibliotecas de clientes menores. Por exemplo, se você precisar apenas de GCM e mapas, poderá optar por usar apenas essas dependências:
A lista completa de sub-bibliotecas e suas responsabilidades pode ser encontrada no documento oficial do google .
Atualização : Desde a Biblioteca de suporte v4 v24.2.0, ela foi dividida nos seguintes módulos:
Observe, no entanto, se você usar
support-fragment
, ele terá dependências para todos os outros módulos (ou seja, se você usar,android.support.v4.app.Fragment
não há benefício)Veja aqui as notas de versão oficiais do support-v4 lib
Ativar MultiDexing
Desde o Lollipop (aka build tools 21+), é muito fácil de manusear. A abordagem é solucionar o problema de 65 mil métodos por arquivo dex para criar vários arquivos dex para o seu aplicativo. Adicione o seguinte ao seu arquivo de compilação gradle ( isso é obtido no google doc oficial em aplicativos com mais de 65 mil métodos ):
A segunda etapa é preparar a classe Application ou, se você não estender o Application, use o
MultiDexApplication
no manifesto do Android:Adicione isso ao seu Application.java
ou use o aplicativo fornecido na biblioteca mutlidex
Impedir OutOfMemory com MultiDex
Como dica adicional, se você encontrar
OutOfMemory
exceções durante a fase de construção, poderá aumentar o heap como que definiria o heap para 4 gigabytes.
Consulte esta pergunta para obter mais detalhes sobre o problema de memória heap dex.
Analise a fonte do problema
Para analisar a fonte dos métodos, o plug-in gradle https://github.com/KeepSafe/dexcount-gradle-plugin pode ajudar em combinação com a árvore de dependência fornecida por gradle com, por exemplo,
Veja esta resposta e pergunta para obter mais informações sobre a contagem de métodos no android
fonte
Seu projeto é muito grande. Você tem muitos métodos. Só pode haver 65536 métodos por aplicativo. veja aqui https://code.google.com/p/android/issues/detail?id=7147#c6
fonte
O código abaixo ajuda, se você usa Gradle. Permite remover facilmente os serviços desnecessários do Google (presumindo que você os esteja usando) para voltar abaixo do limite de 65 mil. Todo o crédito para este post: https://gist.github.com/dmarcato/d7c91b94214acd936e42
Edit 22/10/2014 : Houve muitas discussões interessantes sobre a essência mencionada acima. TLDR? veja este: https://gist.github.com/Takhion/10a37046b9e6d259bb31
Cole esse código na parte inferior do arquivo build.gradle e ajuste a lista de serviços do Google que você não precisa:
fonte
clean
cada vez que usava as exclusões (usamos análises).Compartilhei um projeto de amostra que resolve esse problema usando o script de construção custom_rules.xml e algumas linhas de código.
Usei-o no meu próprio projeto e é executado sem falhas em dispositivos com mais de 1 milhão (do android-8 ao android-19 mais recente). Espero que ajude.
https://github.com/mmin18/Dex65536
fonte
Enfrentou o mesmo problema e resolveu-o editando meu arquivo build.gradle na seção dependências, removendo:
E substituindo-o por:
fonte
Tente adicionar o código abaixo no build.gradle, funcionou para mim -
fonte
A solução perfeita para isso seria trabalhar com Proguard. como mencionado no comentário. Diminuirá o tamanho do arquivo dex pela metade.
fonte
Você pode analisar o problema (referências de arquivo dex) usando o Android Studio:
Construir -> Analisar APK ..
No painel de resultados, clique no arquivo classes.dex
E você verá:
fonte
solução gradle + proguard:
fonte
Remova algum arquivo jar da pasta Libs e copie para outra pasta. Vá para _Project Properties> Select Java Build Path, selecione Libraries, selecione Add Jar externo, selecione o jar Removido ao seu projeto, clique em Save e será adicionado em Referenced Biblioteca em vez da pasta Libs. Agora limpe e execute seu projeto. Você não precisa adicionar nenhum código para o MultDex. Simplesmente funcionou para mim.
fonte
Eu estava enfrentando o mesmo problema hoje, o que funcionou é abaixo para baixo
Para ANDROID STUDIO ... Ativar execução instantânea
Em Arquivo-> Preferências-> Compilar, Execução, Implantação-> Execução Instantânea-> Marque Ativar Execução Instantânea para troca a quente ...
Espero que ajude
fonte