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:
dependencies {
compile 'com.google.android.gms:play-services-base:6.5.+'
compile 'com.google.android.gms:play-services-maps:6.5.+'
}
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:
support-compat
, support-core-utils
, support-core-ui
, support-media-compat
Esupport-fragment
dependencies {
compile 'com.android.support:support-fragment:24.2.+'
}
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 ):
android {
compileSdkVersion 21
buildToolsVersion "21.1.0"
defaultConfig {
...
// Enabling multidex support.
multiDexEnabled true
}
...
}
dependencies {
compile 'com.android.support:multidex:1.0.1'
}
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
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
ou use o aplicativo fornecido na biblioteca mutlidex
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.myapplication">
<application
...
android:name="android.support.multidex.MultiDexApplication">
...
</application>
</manifest>
Impedir OutOfMemory com MultiDex
Como dica adicional, se você encontrar OutOfMemory
exceções durante a fase de construção, poderá aumentar o heap com
android {
...
dexOptions {
javaMaxHeapSize "4g"
}
}
o 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,
.\gradlew app:dependencies
Veja esta resposta e pergunta para obter mais informações sobre a contagem de métodos no android