Wie bereits erwähnt, haben Sie zu viele Methoden (mehr als 65 KB) in Ihrem Projekt und Ihren Bibliotheken.
Verhindern Sie das Problem: Reduzieren Sie die Anzahl der Methoden mit Play Services 6.5+ und support-v4 24.2+
Da die Google Play-Dienste mit ihren über 20.000 Methoden häufig einer der Hauptverdächtigen bei der "Verschwendung" von Methoden sind . Mit Google Play-Diensten Version 6.5 oder höher können Sie Google Play-Dienste mithilfe einer Reihe kleinerer Client-Bibliotheken in Ihre Anwendung aufnehmen. Wenn Sie beispielsweise nur GCM und Karten benötigen, können Sie nur diese Abhängigkeiten verwenden:
dependencies {
compile 'com.google.android.gms:play-services-base:6.5.+'
compile 'com.google.android.gms:play-services-maps:6.5.+'
}
Die vollständige Liste der Unterbibliotheken und ihrer Verantwortlichkeiten finden Sie im offiziellen Google-Dokument .
Update : Seit Support Library v4 v24.2.0 wurde es in folgende Module aufgeteilt:
support-compat
, support-core-utils
, support-core-ui
, support-media-compat
Undsupport-fragment
dependencies {
compile 'com.android.support:support-fragment:24.2.+'
}
Beachten Sie jedoch, dass bei Verwendung support-fragment
Abhängigkeiten zu allen anderen Modulen bestehen (dh wenn Sie diese verwenden, android.support.v4.app.Fragment
gibt es keinen Vorteil).
Hier finden Sie die offiziellen Versionshinweise für support-v4 lib
Aktivieren Sie MultiDexing
Seit Lollipop (auch bekannt als Build Tools 21+) ist es sehr einfach zu handhaben. Der Ansatz besteht darin, das Problem mit 65.000 Methoden pro Dex-Datei zu umgehen, um mehrere Dex-Dateien für Ihre App zu erstellen. Fügen Sie Ihrer Gradle-Build-Datei Folgendes hinzu ( dies stammt aus dem offiziellen Google-Dokument für Anwendungen mit mehr als 65.000 Methoden ):
android {
compileSdkVersion 21
buildToolsVersion "21.1.0"
defaultConfig {
...
// Enabling multidex support.
multiDexEnabled true
}
...
}
dependencies {
compile 'com.android.support:multidex:1.0.1'
}
Der zweite Schritt besteht darin, entweder Ihre Anwendungsklasse vorzubereiten oder, wenn Sie die Anwendung nicht erweitern, Folgendes MultiDexApplication
in Ihrem Android-Manifest zu verwenden:
Fügen Sie dies entweder Ihrer Application.java hinzu
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
oder verwenden Sie die bereitgestellte Anwendung aus der mutlidex lib
<?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>
Verhindern Sie OutOfMemory mit MultiDex
Als weiterer Tipp: Wenn Sie OutOfMemory
während der Erstellungsphase auf Ausnahmen stoßen, können Sie den Heap mit vergrößern
android {
...
dexOptions {
javaMaxHeapSize "4g"
}
}
das würde den Heap auf 4 Gigabyte setzen.
In dieser Frage finden Sie weitere Informationen zum Problem mit dem Dex-Heapspeicher.
Analysieren Sie die Ursache des Problems
Um die Quelle der Methoden zu analysieren, kann das Gradle-Plugin https://github.com/KeepSafe/dexcount-gradle-plugin in Kombination mit dem von gradle bereitgestellten Abhängigkeitsbaum mit z
.\gradlew app:dependencies
In dieser Antwort und Frage finden Sie weitere Informationen zur Anzahl der Methoden in Android