Comme déjà indiqué, vous avez trop de méthodes (plus de 65k) dans votre projet et vos librairies.
Prévention du problème: réduisez le nombre de méthodes avec Play Services 6.5+ et support-v4 24.2+
Depuis souvent, les services Google Play sont l'un des principaux suspects dans les méthodes de «gaspillage» avec ses méthodes 20k + . Services Google Play version 6.5 ou ultérieure, il vous est possible d'inclure des services Google Play dans votre application à l'aide d'un certain nombre de bibliothèques clientes plus petites. Par exemple, si vous n'avez besoin que de GCM et de cartes, vous pouvez choisir d'utiliser uniquement ces dépendances:
dependencies {
compile 'com.google.android.gms:play-services-base:6.5.+'
compile 'com.google.android.gms:play-services-maps:6.5.+'
}
La liste complète des sous-bibliothèques et de ses responsabilités se trouve dans le doc officiel de Google .
Mise à jour : depuis la bibliothèque de support v4 v24.2.0, elle a été divisée en modules suivants:
support-compat
, support-core-utils
, support-core-ui
, support-media-compat
Etsupport-fragment
dependencies {
compile 'com.android.support:support-fragment:24.2.+'
}
Notez cependant que si vous utilisez support-fragment
, il aura des dépendances avec tous les autres modules (c.-à-d. Si vous utilisez android.support.v4.app.Fragment
il n'y a aucun avantage)
Voir ici les notes de version officielles de support-v4 lib
Activer MultiDexing
Depuis Lollipop (aka build tools 21+), il est très facile à manipuler. L'approche consiste à contourner le problème des méthodes 65k par fichier dex pour créer plusieurs fichiers dex pour votre application. Ajoutez ce qui suit à votre fichier de construction Gradle ( cela provient du document officiel de Google sur les applications avec plus de 65 000 méthodes ):
android {
compileSdkVersion 21
buildToolsVersion "21.1.0"
defaultConfig {
...
// Enabling multidex support.
multiDexEnabled true
}
...
}
dependencies {
compile 'com.android.support:multidex:1.0.1'
}
La deuxième étape consiste à préparer votre classe d'application ou, si vous ne développez pas l'application, utilisez le MultiDexApplication
dans votre manifeste Android:
Soit ajoutez ceci à votre Application.java
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
ou utilisez l'application fournie à partir de la bibliothèque 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>
Empêcher OutOfMemory avec MultiDex
Comme autre conseil, si vous rencontrez des OutOfMemory
exceptions pendant la phase de construction, vous pouvez agrandir le tas avec
android {
...
dexOptions {
javaMaxHeapSize "4g"
}
}
ce qui mettrait le tas à 4 gigaoctets.
Consultez cette question pour plus de détails sur le problème de la mémoire de tas dex.
Analyser la source du problème
Pour analyser la source des méthodes, le plugin gradle https://github.com/KeepSafe/dexcount-gradle-plugin peut aider en combinaison avec l'arbre de dépendance fourni par gradle avec par exemple
.\gradlew app:dependencies
Voir cette réponse et cette question pour plus d'informations sur le nombre de méthodes dans Android