Come già detto, hai troppi metodi (più di 65k) nel tuo progetto e librerie.
Prevenire il problema: ridurre il numero di metodi con Play Services 6.5+ e support-v4 24.2+
Poiché spesso i servizi di Google Play sono uno dei principali sospettati di "sprecare" i metodi con i suoi metodi 20k + . Servizi Google Play versione 6.5 o successive, è possibile includere i servizi Google Play nella propria applicazione utilizzando un numero di librerie client più piccole. Ad esempio, se hai solo bisogno di GCM e mappe, puoi scegliere di usare solo queste dipendenze:
dependencies {
compile 'com.google.android.gms:play-services-base:6.5.+'
compile 'com.google.android.gms:play-services-maps:6.5.+'
}
L'elenco completo delle librerie secondarie e le relative responsabilità sono disponibili nel documento ufficiale di Google .
Aggiornamento : dalla Support Library v4 v24.2.0 è stato suddiviso nei seguenti moduli:
support-compat
, support-core-utils
, support-core-ui
, support-media-compat
Esupport-fragment
dependencies {
compile 'com.android.support:support-fragment:24.2.+'
}
Si noti tuttavia, se si utilizza support-fragment
, avrà dipendenze da tutti gli altri moduli (cioè se si utilizza android.support.v4.app.Fragment
non ci sono vantaggi)
Vedi qui le note di rilascio ufficiali per support-v4 lib
Abilita MultiDexing
Dal momento che Lollipop (aka build tools 21+) è molto facile da gestire. L'approccio consiste nel risolvere i problemi relativi ai metodi 65k per file dex per creare più file dex per l'app. Aggiungi quanto segue al tuo file build gradle ( questo è tratto dal documento ufficiale di google su applicazioni con più di 65k metodi ):
android {
compileSdkVersion 21
buildToolsVersion "21.1.0"
defaultConfig {
...
// Enabling multidex support.
multiDexEnabled true
}
...
}
dependencies {
compile 'com.android.support:multidex:1.0.1'
}
Il secondo passo è preparare la tua classe di applicazione o se non estendi l'applicazione, usa MultiDexApplication
nel tuo manifest Android:
O aggiungi questo al tuo Application.java
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
o utilizzare l'applicazione fornita dalla libreria 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>
Prevenire OutOfMemory con MultiDex
Come ulteriore consiglio, se si verificano OutOfMemory
eccezioni durante la fase di costruzione, è possibile ingrandire l'heap con
android {
...
dexOptions {
javaMaxHeapSize "4g"
}
}
che imposterebbe l'heap su 4 gigabyte.
Vedi questa domanda per maggiori dettagli sul problema della memoria dell'heap dex.
Analizza la fonte del problema
Per analizzare l'origine dei metodi il plug-in gradle https://github.com/KeepSafe/dexcount-gradle-plugin può aiutare in combinazione con l'albero delle dipendenze fornito da Gradle con ad es.
.\gradlew app:dependencies
Vedi questa risposta e questa domanda per ulteriori informazioni sul conteggio dei metodi in Android